# Config refactor (v2.0) ## Useful links - [Переписывание конфига с автором telescope](https://www.youtube.com/watch?v=kJVqxFnhIuw&t=510s) - [Документация по Lua в Nvim](https://neovim.io/doc/user/lua-guide.html) - [Конфиг TJ](https://github.com/tjdevries/config.nvim/tree/master) ## Основные прицнипы формирования конфига ### Root plugin папка Скрипты в этой папке загружаются автоматически после инициализации `neovim`, но до загрузки файлов типа `ftplugin/` или `after/`. ### Plugins Плагины ставятся встроенным менеджером `vim.pack` (Neovim 0.12+), см. раздел [Работа с vim.pack](#работа-с-vimpack). Разберем на примере `oil.nvim`: источник плагина указывается в списке `vim.pack.add` в `lua/custom/pack.lua`: *lua/custom/pack.lua* ```lua vim.pack.add({ gh("echasnovski/mini.icons"), gh("stevearc/oil.nvim"), }) require("mini.icons").setup() require "custom.oil" ``` Затем сама функция настроек расположена отдельно, в файле с названием плагина: *lua/custom/oil.lua* ```lua require("oil").setup{ opts = { keymaps = { ["g?"] = "actions.show_help", }, }, } ``` ## Разница между ftplugin и after/ftplugin Суть одна и та-же: загрузка конфигураций для конкретных типов файлов, однако: ### ftplugin Тут храняться настройки, которые будут применены **до** загразуки плагинов. Т.е. настройки, что определны где-то в настройках плагинов будут переписывать если что те, которые установлены для типов файлов тут ### after/ftplugin Настройки для типов файлов тут будут применены уже после того, как загрузится все содержимое neovim => эти настройки будут перегружать все то, что было настроено в плагинах ## Работа с vim.pack Плагины описаны в `lua/custom/pack.lua`, версии зафиксированы в `nvim-pack-lock.json` (его нужно коммитить). Плагины ставятся в `~/.local/share/nvim/site/pack/core/opt`. | Задача | lazy.nvim | vim.pack | |---|---|---| | Установить плагин | добавить spec, `:Lazy install` | добавить в `vim.pack.add({...})` и перезапустить, недостающее ставится при старте с подтверждением | | Обновить все | `:Lazy update` | `:lua vim.pack.update()`, откроется буфер с диффом | | Обновить один | `:Lazy update name` | `:lua vim.pack.update({"name"})` | | Применить обновление | кнопка в UI | `:write` в буфере с диффом | | Отклонить обновление | закрыть окно | закрыть буфер (`:quit`) | | Список плагинов | `:Lazy` | `:lua vim.print(vim.pack.get())` | | Удалить | убрать spec, `:Lazy clean` | убрать из `pack.lua`, затем `:lua vim.pack.del({"name"})` | | Откатить к lock-файлу | `:Lazy restore` | `:lua vim.pack.update(nil, {target = "lockfile"})` | | Lock-файл | `lazy-lock.json` | `nvim-pack-lock.json` | | Профилирование | `:Lazy profile` | `nvim --startuptime out.log` | Порядок обновления: `:lua vim.pack.update()` → прочитать дифф → `:write` → перезапустить nvim → закоммитить `nvim-pack-lock.json`. Парсеры treesitter обновляются вручную командой `:TSUpdate`. ### Чего нет по сравнению с lazy - Нет окна `:Lazy`, всё делается командами и через буфер диффа. - Нет ленивой загрузки (`event`, `cmd`, `ft`, `keys`), плагины грузятся при старте. - Нет `dependencies`, `opts` и `config`: зависимости перечисляются в `vim.pack.add`, а `setup()` вызывается вручную. - Нет хука `build`. Вместо него автокоманда `PackChanged`, которую нужно объявить **до** `vim.pack.add` (пример для `markdown-preview` в `pack.lua`). ### Версии Без `version` плагин следует за веткой по умолчанию. Версию можно зафиксировать: ```lua { src = gh("L3MON4D3/LuaSnip"), version = vim.version.range("2.*") } ``` # FAQ > Зачем так мучаться? Не проще все кидать в один файл? Проще, но такое распараллеливание позволяет легче дебажить файлы настроек. Т.е. исправляя настройки мы можем просто `source`ить файл настроек, не трогая список плагинов в `pack.lua`. > Что делать, если в `checkhealth` выдается ошибка `luarocks not found`? Необходимо его установить по инструкции с [сайта](https://luarocks.org/) > Что делать, если при установке `luarocks` выдает ошибку что не найдены `.h` файлы? Надо установить хэдеры lua командой: ```bash sudo apt install liblua5.3-dev ``` > checkhealth не может найти tree-sitter cli Надо установить соответствующий `npm` пакет: ```js npm install -g tree-sitter-cli ```