0Pricing
Lua Academy · Урок

Сборка плагина

Организуйте плагин и поделитесь им.

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

Структура каталога плагина

Плагин Neovim — это всего лишь каталог в runtimepath. Традиционная структура включает каталоги верхнего уровня, которым Neovim назначает особое назначение.

Основные каталоги: lua/ для модулей, plugin/ для автоматически загружаемой настройки, ftplugin/ для скриптов типов файлов, doc/ для справки и after/ для поздних переопределений.

-- myplugin/
--   lua/myplugin/init.lua
--   plugin/myplugin.lua
--   doc/myplugin.txt

Каталог lua/

Файлы в каталоге lua/ доступны через require. Модуль в lua/myplugin/init.lua загружается как require('myplugin').

Вложенность соответствует точечным путям: lua/myplugin/config.lua превращается в require('myplugin.config'). Так плагины предоставляют аккуратное открытое пространство имён.

-- in lua/myplugin/init.lua
local M = {}
function M.hello() print('hi') end
return M

Возврат таблицы модуля

Идиоматичный шаблон модуля объявляет локальную таблицу M, добавляет в неё функции и возвращает её. Затем вызывающий код получает к ним доступ через require('myplugin').hello().

Храните внутренние вспомогательные функции как обычные локальные функции, чтобы открытой оставалась только предусмотренная поверхность модуля. Это соответствует инкапсуляции модулей в других экосистемах.

local M = {}
local function private() end
function M.run() private() end
return M

Соглашение setup()

Большинство плагинов предоставляет функцию setup(opts). Она объединяет пользовательские параметры со значениями по умолчанию и выполняет инициализацию, например создаёт команды и автокоманды.

Используйте vim.tbl_deep_extend('force', defaults, opts or {}), чтобы даже частичная пользовательская конфигурация по-прежнему получала все значения по умолчанию.

local M = {}
local defaults = { width = 40 }
function M.setup(opts)
  M.config = vim.tbl_deep_extend('force', defaults, opts or {})
end
return M

Каталог plugin/

Скрипты в plugin/ запускаются автоматически при старте Neovim, после построения runtimepath. Пусть они будут небольшими.

Обычно они регистрируют команды или защитный механизм, чтобы тяжёлые модули загружались отложенно. Избегайте здесь затратных операций: отложите их до setup или автокоманд, чтобы запуск оставался быстрым.

-- in plugin/myplugin.lua
if vim.g.loaded_myplugin then return end
vim.g.loaded_myplugin = true

Защита от повторной загрузки

Защита от загрузки предотвращает повторную инициализацию, если файл подключается дважды. Установите флаг vim.g.loaded_* и немедленно выйдите при повторном входе.

Это необходимо, поскольку менеджеры плагинов и :runtime могут повторно подключать файлы, а дублирующиеся команды или автокоманды приводят к трудноуловимым ошибкам.

if vim.g.loaded_myplugin == 1 then return end
vim.g.loaded_myplugin = 1

Отложенная загрузка

Быстрый запуск означает загрузку кода только тогда, когда он нужен. Зарегистрируйте лёгкую команду в plugin/, которая при первом использовании загрузит тяжёлый модуль через require.

Менеджеры плагинов, такие как lazy.nvim, формализуют этот подход с помощью триггеров cmd, ft и keys, поэтому модуль не затрагивается до вызова.

vim.api.nvim_create_user_command('MyStart', function()
  require('myplugin').run()
end, {})

Путь выполнения и путь пакетов

Neovim обнаруживает плагины, сканируя runtimepath. Встроенная система пакетов автоматически загружает каталоги в pack/*/start/, а каталоги в pack/*/opt/ — по запросу с помощью :packadd.

Большинство пользователей полагается на менеджер, но понимание runtimepath объясняет, как находятся Ваши каталоги.

print(vim.o.runtimepath:sub(1, 60))
-- :packadd loads an opt plugin manually

Проверки состояния

Добавьте файл lua/myplugin/health.lua с функцией check, чтобы пользователи могли выполнить :checkhealth myplugin. Сообщайте о состоянии с помощью API vim.health.

Используйте vim.health.start, vim.health.ok, vim.health.warn и vim.health.error, чтобы чётко сообщать об отсутствующих зависимостях.

local M = {}
function M.check()
  vim.health.start('myplugin')
  vim.health.ok('all good')
end
return M

Документация и теги

Добавьте справочный файл doc/myplugin.txt. Выполните :helptags doc/ (или поручите это менеджеру), чтобы создать индекс тегов и сделать доступной команду :help myplugin.

Хорошая документация содержит список команд, параметров setup и стандартных раскладок клавиш, благодаря чему Ваш плагин легко найти прямо из Neovim.

-- generate tags from the doc directory
vim.cmd('helptags ' .. vim.fn.expand('%:p:h'))

Версионирование и публикация

Разместите плагин в репозитории git; пользователи устанавливают его по пути owner/repo. Помечайте выпуски с использованием семантического версионирования, чтобы менеджеры могли закреплять версии.

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

-- lazy.nvim spec
-- { 'owner/myplugin', config = function()
--     require('myplugin').setup({})
--   end }

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

Проверьте, насколько хорошо Вы поняли упаковку плагинов.

Повторение: упаковка плагина

Плагин — это каталог в runtimepath с модулями в lua/, автоматически запускаемым скриптом в plugin/ и необязательными каталогами doc/, ftplugin/ и файлами проверки состояния.

Возвращайте таблицы модулей, предоставляйте setup, объединяющую значения по умолчанию, защищайтесь от повторной загрузки, загружайте тяжёлый код отложенно, документируйте плагин с помощью helptags и публикуйте его через git с тегами семантических версий.

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

Урок «Сборка плагина» бесплатный?

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

Чему я научусь в уроке «Сборка плагина»?

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

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

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

Сколько времени занимает урок «Сборка плагина»?

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

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

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

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

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