В процессе знакомства с Neovim было прочитано много статей, конфигураций  на Github, было просмотрено огромное количество роликов на Youtube на тему настройки, но в большинстве случаев приходилось донастраивать все под себя. В этой статье я расскажу как я настроил Neovim для разработки на Go, используя только Lua плагины и init.lua. Эта статья может быть полезна тебе, если: пишешь на Go есть конфиг на Vimscript, но хочется на Lua хочется пересесть с тяжелых современных IDE или текстовых редакторов, таких как Goland, Vscode и других, на Neovim Подробного их сравнения в этой статье не будет, так как это выходит за ее рамки, но основные преимущества Lua перед Vimscript это: Скорость. Плагины написанные на Lua будут работать быстрее чем их реализации на Vimscript Модульность. С Lua ты сможешь навести порядок - горячие клавиши в одном файле, настройки в другом, плагины в третьем т.д. Простота и поддерживаемость. Vimscript очень специфичен и используется только внутри Vim. Lua же в свое время является одним из самых популярных встраиваемых скриптовых языков за счет свой скорости и простоты, например, на нем написан интерфейс World of Warcraft и на нем пишут плагины для Kong API Gateway Lua позволяет разбирать настройки по файлам (модулям), сделать это можно сделать следующим образом: init.lua - инициализирует модули из директории lua, файлы init инициализируются по умолчанию, для них не нужно прописывать require('init.lua') lua/options.lua - основные настройки Neovim lua/keymaps.lua - горячие клавиши lua/lsp.lua - конфигурация Language Server Protocol для автодополнения и поддержки языков, как в твоем любимом IDE lua/autocommands.lua - автокоманды, например, сортировка импортов после сохранения lua/plugins/init.lua - инициализация плагинов; конфигурацию для конкретных плагинов я храню в lua/plugins/<plugin_name>.lua После этого, чтобы подгрузились все модули, необходимо инициализировать их в init.lua: При инициализации модулей порядок важен, поэтому не стоит, например, в модуле keymaps держать горячие клавиши для плагинов, а лучше переместить их в конкретный модуль в lua/plugins/<plugin_name>.lua Для установки плагинов для Lua конфигураций можно использовать плагин менеджер Packer.nvim - Lua альтернатива для популярного vim-plug. Базовая конфигурация Packer: Если нужно, чтобы Packer автоматически устанавливался на любом ПК, можно использовать следующий сниппет: Для установки и обновления плагинов можно использовать команду :PackerSync. Для упрощенной настройки LSP, автодополнений и навигации по файлам были собраны наиболее популярные плагины в сообществе и приведены ниже: Есть ряд плагинов, которые ускорят разработку, они в большей степени заменяют  функционал, к которому большинство привыкло в современных IDE и редакторах, а некоторых из них "улучшают" внешний вид Neovim, если вам это необходимо: P.S. Стоит заметить, что если в ~/config/nvim/lua/plugins/init.lua у плагинов прописано поле  config с подгрузкой модуля (как в конфигурации выше), но этого модуля не существует, или для описанного плагина не был вызван setup(), плагин не будет подгружен или при входе в Neovim всплывет ошибка.  Есть множество вариантов использования Neovim как IDE для Go. Например можно использовать coc.nvim - альтернатива нативному LSP с еще более простой настройкой и поддержкой множества серверов, но меньшей скоростью, так как написан он на nodejs.  Также можно использовать vim-go, который имеет поддержку gopls LSP и поддержку языка Go, что позволяет не выходят из редактора выполнять такие команды, как GoInstall, GoBuild и другие. Но не смотря на наличие таких целостных решений я решил пойти другим путем и использовать максимально модульные и простые решения, остановившись на нативном LSP и плагине gopher.nvim.  нативный LSP - позволяет настроить автодополнения, диагностику, форматирование (настройка LSP будет рассмотрена чуть позже) gopher.nvim - набор утилит для Go (например позволяет в одну команду добавить/удалить теги к структуре или сгенерировать табличные тесты, полный список команд здесь) Устанавливается gopher аналогично с другими плагинами: Настройка плагина gopher будет приведена в абзаце "Настройка LSP и плагинов". nvim-treesitter - подсветка синтаксиса на основе парсеров tree-sitter telescope - навигация по фалам, буферам, греп и многое другое Для корректной работы LSP с Go я использую gopls сервер, его нужно установить отдельно. Всю конфигурацию предпочитаю хранить в одном модуле, будь то инициализация LSP для разных ЯП или настройка автодополнений и ИИ к ним (tabnine). Моя конфигурация LSP (за основу взята стандартная конфигурация из документации lspconfig с небольшими изменениями): За автодополнения отвечает плагин cmp и если необходимо можно добавить к нему tabnine. Пример настройки: Чтобы автодополнения работали и для сниппетов, в sources объект в  setup для cmp нужно прокинуть название движка сниппетов -  luasnip, а также описать expand функцию в snippet объекте. Если хочется использовать другой движок для сниппетов, как их подключить есть в документации cmp. С помощью автокоманд можно описать команды, которые будут срабатывать на: чтение и запись в файл вход или выход из буфера выход из Neovim Подробное описание можно посмотреть здесь. Список автокоманд, которые я использую: Отключить комментирование новой строки (без этой автокоманды, если переходить на новую строку с помощью o или O строка будет закомментирована) Сортировка Go импортов на сохранение файла (взято здесь) Форматирование Go файлов на запись: Удаление плавающих пробелов на запись: Подсветка скопированных строк Горячие клавиши для плагинов лучше описывать в модулях соответствующих плагинов. В ~/.config/nvim/lua/keymaps.lua я обычно описываю горячие клавиши, не зависящие от внешних зависимостей. Мои dotfiles Primeagen nuxshed antgubarev Как я переписывал vim конфиг в init.lua Programming Go in Neovim