0Pricing
Lua Academy · Урок

Буферы и окна

Управляйте редактором.

«Буферы и окна» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Буферы, окна и вкладки

Neovim отделяет содержимое от отображения. Буфер хранит текст в памяти, окно представляет область просмотра буфера, а вкладка содержит компоновку окон.

Один буфер может отображаться во многих окнах. Плагины работают с этими дескрипторами, представленными целыми числами, через семейства программного интерфейса nvim_buf_* и nvim_win_*.

local buf = vim.api.nvim_get_current_buf()
local win = vim.api.nvim_get_current_win()
print(buf, win)

Чтение строк буфера

nvim_buf_get_lines(buf, start, end_, strict) возвращает строки в виде списка. Индексы отсчитываются с нуля, а конечный индекс не включается; передайте -1 в качестве конца, чтобы дойти до последней строки.

Если установить для strict_indexing значение false, индексы за пределами диапазона будут допустимы, вместо того чтобы вызывать ошибку.

local lines = vim.api.nvim_buf_get_lines(0, 0, -1, false)
print('line count: ' .. #lines)

Запись строк буфера

nvim_buf_set_lines заменяет диапазон новым текстом. Чтобы добавить текст в конец, установите начало и конец равными -1. Чтобы перезаписать всё содержимое, используйте 0, -1.

Замена представляет собой список строк Lua: по одной строке на каждую строку буфера, без завершающих символов новой строки.

vim.api.nvim_buf_set_lines(0, -1, -1, false, {
  '-- appended line',
})

Буферы для временных данных

Создайте не включённый в список временный буфер с помощью nvim_create_buf(listed, scratch). Передача false, true делает буфер для временных данных подходящим для интерфейса плагина.

Установите bufhidden = 'wipe', чтобы буфер исчезал при закрытии его окна и не оставлял после себя ненужные буферы.

local buf = vim.api.nvim_create_buf(false, true)
vim.bo[buf].bufhidden = 'wipe'
vim.api.nvim_buf_set_lines(buf, 0, -1, false, { 'Panel' })

Параметры буфера

Обращайтесь к vim.bo[buf], чтобы задавать параметры для конкретного дескриптора буфера. Распространённые настройки плагинов включают modifiable = false и buftype = 'nofile'.

Запрет на изменение отображаемого буфера не позволяет пользователям случайно редактировать сгенерированное содержимое.

vim.bo[buf].modifiable = false
vim.bo[buf].buftype = 'nofile'
vim.bo[buf].filetype = 'myplugin'

Открытие плавающих окон

nvim_open_win(buf, enter, config) помещает буфер в плавающее окно. Конфигурация задаёт relative, row, col, width, height и border.

Плавающие окна лежат в основе современного интерфейса: документации при наведении, средств выбора и уведомлений.

local win = vim.api.nvim_open_win(buf, true, {
  relative = 'editor', row = 5, col = 10,
  width = 40, height = 10, border = 'rounded',
})

Настройка окна

Изменяйте открытое плавающее окно с помощью nvim_win_set_config; это полезно для изменения размера при событии VimResized. Считывайте текущую компоновку с помощью nvim_win_get_config.

Задавайте параметры окна через vim.wo[win], например скрывайте строку курсора или отключайте столбцы с номерами в панелях интерфейса.

vim.wo[win].number = false
vim.wo[win].cursorline = true
vim.api.nvim_win_set_config(win, { width = 50 })

Курсор и позиция

Перемещайте курсор с помощью nvim_win_set_cursor(win, {row, col}). Обратите внимание: отсчёт строк начинается с единицы, а столбцов — с нуля; это частый источник ошибок на единицу.

Считывайте позицию обратно с помощью nvim_win_get_cursor, чтобы сохранить и восстановить положение пользователя до и после операции.

local pos = vim.api.nvim_win_get_cursor(0)
vim.api.nvim_win_set_cursor(0, { pos[1], 0 })

Проверка действительности и очистка

Дескрипторы могут устаревать. Перед работой с сохранёнными дескрипторами проверяйте их с помощью nvim_buf_is_valid и nvim_win_is_valid.

Закрывайте окна с помощью nvim_win_close(win, force), а буферы удаляйте через nvim_buf_delete(buf, { force = true }). Всегда сначала выполняйте проверку, чтобы избежать ошибок.

if vim.api.nvim_win_is_valid(win) then
  vim.api.nvim_win_close(win, true)
end

Расширенные метки и пространства имён

Расширенные метки привязывают метаданные к тексту, который перемещается при внесении изменений. Создайте пространство имён с помощью nvim_create_namespace, затем добавьте виртуальный текст или подсветку.

nvim_buf_set_extmark поддерживает virt_text, столбцы знаков и встроенную подсветку — это механизм, лежащий в основе подсказок в строке и плагинов для показа авторства строк в Git.

local ns = vim.api.nvim_create_namespace('myplugin')
vim.api.nvim_buf_set_extmark(0, ns, 0, 0, {
  virt_text = { { ' hint', 'Comment' } },
})

Получение списка и перебор

nvim_list_bufs и nvim_list_wins возвращают все текущие дескрипторы. Отфильтруйте их с помощью nvim_buf_is_loaded или проверяя параметры.

Перебор позволяет плагину работать во всей сессии, например закрыть каждое плавающее окно или обновить каждый буфер с заданным типом файла.

for _, b in ipairs(vim.api.nvim_list_bufs()) do
  if vim.api.nvim_buf_is_loaded(b) then print(b) end
end

Быстрая проверка

Проверьте, что Вы узнали о буферах и окнах.

Повторение: буферы и окна

Буферы хранят текст, окна отображают его, а дескрипторы являются целыми числами, которые нужно проверить перед использованием. Вы можете читать и записывать строки, создавать временные буферы и задавать локальные для буфера параметры.

Плавающие окна через nvim_open_win, управление курсором, расширенные метки и API для получения списков дают всё необходимое для создания насыщенных интерфейсов плагинов с сохранением состояния.

Часто задаваемые вопросы

Урок «Буферы и окна» бесплатный?

Да — полный текст урока «Буферы и окна» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Буферы и окна»?

Управляйте редактором. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Буферы и окна»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. API Lua для Neovim
  2. Команды и раскладки клавиш
  3. Буферы и окна
  4. Сборка плагина
← Назад к Lua Academy