Буферы и окна
Управляйте редактором.
«Буферы и окна» — бесплатный урок 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 — локальная установка не требуется.