0Pricing
Lua Academy · Урок

API Lua для Neovim

Узнайте, как подключаются плагины.

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

Зачем нужен Lua в Neovim

Neovim встраивает среду выполнения LuaJIT, благодаря чему Lua становится встроенным языком сценариев наряду со скриптами Vim. Авторы плагинов предпочитают Lua за его скорость, полноценные структуры данных и ясную систему модулей.

Глобальная таблица vim открывает доступ ко всему: состоянию редактора, программному интерфейсу, параметрам и вспомогательным функциям стандартной библиотеки. Её освоение — основа современной разработки плагинов.

print(vim.inspect(vim.version()))

Слой vim.api

vim.api предоставляет низкоуровневый удалённый программный интерфейс: все функции с префиксом nvim_. Это те же вызовы, которые внешние клиенты используют через RPC, но внутри процесса они выполняются мгновенно.

Такие функции, как nvim_get_current_buf, nvim_buf_set_lines и nvim_command, обеспечивают точный контроль. Они стабильны, хорошо документированы и лежат в основе серьёзных плагинов.

local buf = vim.api.nvim_get_current_buf()
local name = vim.api.nvim_buf_get_name(buf)
print(name)

vim.fn — вызов функций Vim

vim.fn служит связующим звеном со встроенными функциями Vim. Любая функция, которую можно вызвать в Vim, например expand() или fnamemodify(), доступна как vim.fn.expand(...).

Это особенно полезно, когда собственного программного интерфейса ещё нет. Аргументы и возвращаемые значения автоматически преобразуются между типами Lua и Vim.

local path = vim.fn.expand('%:p')
local tail = vim.fn.fnamemodify(path, ':t')
print(tail)

Параметры: vim.o, vim.bo, vim.wo

Параметры задаются через метатаблицы. vim.o обращается к глобальным параметрам, vim.bo — к параметрам буфера, а vim.wo — к параметрам окна.

Присваивание выполняется простой записью в поле. Это заменяет многословные вызовы nvim_set_option и делает код настройки более естественным.

vim.o.number = true
vim.bo.shiftwidth = 2
vim.wo.wrap = false

vim.g и глобальные переменные

vim.g читает и изменяет глобальные переменные Vim. Плагины часто хранят здесь переключатели настроек, например vim.g.myplugin_enabled.

Чтение незаданной переменной возвращает nil, поэтому предусмотрите значения по умолчанию. Варианты с областью действия буфера и окна доступны как vim.b и vim.w.

vim.g.mapleader = ' '
local enabled = vim.g.myplugin_enabled or false
print(enabled)

Уведомления и вывод

Используйте vim.notify, чтобы показывать пользователю сообщения. Эта функция принимает строку сообщения и необязательный уровень журнала из vim.log.levels.

Менеджеры плагинов, такие как noice или notify, могут перехватывать эти сообщения и отображать их в более удобном интерфейсе. Для вывода пользователю предпочитайте vim.notify обычному print.

vim.notify('Plugin loaded', vim.log.levels.INFO)
vim.notify('Missing config', vim.log.levels.WARN)

Планирование с помощью vim.schedule

Некоторые вызовы программного интерфейса запрещены в контекстах быстрых событий, например внутри определённых обратных вызовов. vim.schedule откладывает выполнение функции до главного цикла, где весь программный интерфейс безопасен.

Это позволяет избежать печально известных ошибок "E5560" при изменении буферов из асинхронных контекстов или контекстов автокоманд.

vim.schedule(function()
  vim.api.nvim_buf_set_lines(0, 0, 0, false, {'Hello'})
end)

Автокоманды на Lua

nvim_create_autocmd регистрирует обработчики событий. Объединяйте их с помощью nvim_create_augroup и устанавливайте clear = true, чтобы при перезагрузке не появлялись дубликаты.

Обратный вызов получает таблицу события с такими полями, как buf и match, что обеспечивает точный контекст для обработчика.

local grp = vim.api.nvim_create_augroup('MyGrp', { clear = true })
vim.api.nvim_create_autocmd('BufWritePost', {
  group = grp,
  pattern = '*.lua',
  callback = function(ev) print('saved ' .. ev.file) end,
})

vim.tbl и вспомогательные функции для строк

Neovim поставляется с богатой стандартной библиотекой. vim.tbl_extend, vim.tbl_keys и vim.split охватывают распространённые операции с таблицами и строками.

vim.tbl_deep_extend('force', defaults, opts) — стандартный способ объединить пользовательскую конфигурацию с настройками плагина по умолчанию.

local defaults = { width = 40, border = 'single' }
local opts = { width = 60 }
local cfg = vim.tbl_deep_extend('force', defaults, opts)
print(cfg.width, cfg.border)

vim.inspect для отладки

vim.inspect преобразует любое значение Lua в удобочитаемую строку, включая вложенные таблицы. Это самый быстрый способ понять структуру возвращаемых программным интерфейсом значений.

Используйте её вместе с :lua print(vim.inspect(...)) или :lua= expr в последних версиях Neovim для быстрой проверки во время разработки.

local info = vim.api.nvim_get_mode()
print(vim.inspect(info))

Компромиссы программного интерфейса и Vim

Предпочитайте vim.api для стабильных структурированных операций. Если собственной функции нет, используйте vim.fn или vim.cmd как запасной вариант.

vim.cmd выполняет команды ex в виде строк и удобен для разовых действий, например vim.cmd('highlight ...'), но его возможности для анализа ниже, чем у типизированных вызовов программного интерфейса.

vim.cmd('syntax on')
vim.cmd.colorscheme('habamax')

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

Проверьте, насколько хорошо Вы понимаете программный интерфейс Neovim на Lua.

Повторение: программный интерфейс Lua

Теперь Вы знаете основные уровни программного интерфейса: vim.api для типизированного встроенного программного интерфейса, vim.fn для функций Vim и vim.cmd для команд ex.

Параметры задаются через vim.o/bo/wo, переменные — через vim.g/b/w, а такие вспомогательные средства, как vim.tbl_deep_extend, vim.notify и vim.schedule, дополняют набор инструментов автора плагина.

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

Урок «API Lua для Neovim» бесплатный?

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

Чему я научусь в уроке «API Lua для Neovim»?

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

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

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

Сколько времени занимает урок «API Lua для Neovim»?

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

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

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

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

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