Делаем из Vim IDE для Golang
go vimПредисловие
Уверен, у кого-то возникнет вопрос: «Зачем в 2021-ом пользоваться -vim- neovim, когда есть замечательный Goland?». Я до какого-то времени сам пользовался только продуктами от JetBrains, но вот уже более 1.5 лет пишу исключительно в vim.
Основной причиной для моего перехода с Goland стала его прожорливость. Отдавать по 3-4 Гб программе, которая просто подсказывает мне названия методов, запускает тесты и реализует «Go to definition», очень расточительно. Вкупе с непонятной политикой индексации проекта, когда у тебя в момент взывают куллеры, а батарейка на глазах тает, привело меня к vim.
#1
Наша сборка будет зиждиться на двух китах: vim-go и coc.nvim, как LSP клиент к gopls. Vim-go будет отвечать за сборку нашего проект, запуск тестов, форматирование кода, отладку, Go Docs. Coc.nvim + gopls будут отвечать за реализацию «Go to definition», автокомплит, переименование, короче за все то, что из простого редактора делает удобный в использовании инструмент.
Установка необходимых зависимостей
#0 Neovim
Чтобы настроить neovim его необходимо сначала поставить 😄. Для macOS, а именно на этой системе я работаю, установка происходит в одну команду:
brew install neovim
После установки стоит создать файл ~/.config/nvim/init.vim
. Это аналог .vimrc
, в нем происходит вся настройка neovim.
brew
это пакетный менеджер. Более подробно о том, как его установить можно прочить на официальном сайте.
#1 vim-plug
vim-plug — менеджер плагинов для vim/neovim. Установка проста:
curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
#2 yarn
yarn необходим coc.nvim для автокомплита. Установка, как и в случае с vim-plug в одну команду:
npm install --global yarn
Установка vim-go
И так, мы установили все необходимы зависимости, а следовательно, готовы перейти к главной части. Сначала установим vim-go.
Все очень просто. Открываем созданный нами ранее файл ~/.config/nvim/init.vim
и вписываем в него следующий текст:
call plug#begin('~/.vim/plugged')
Plug 'fatih/vim-go'
call plug#end()
В этом блоке мы описываем те плагины, которые хотим установить в neovim, мы еще не раз к нему вернемся.
После изменения ~/.config/nvim/init.vim
в консоле выполняем последовательно две команды:
nvim +PlugInstall
nvim +GoInstallBinaries
Установка coc.nvim
Заходим в ~/.config/nvim/init.vim
и добавляем Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}
после строки Plug 'fatih/vim-go'
. На данный момент ваш init.vim файл должен выглядит так:
call plug#begin('~/.vim/plugged')
Plug 'fatih/vim-go'
Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile'}
call plug#end()
Устанавливаем плагин командой nvim +PlugInstall
.
После установки рекомендую дополнить свой init.vim файл для начала дефолтной конфигураций coc.nvim. Также стоит добавить в init.vim следующую строчку, которая отключает «Go to definition» через сочетание gd
в vim-go, мы же хотим, чтобы этим занимался gopls:
let g:go_def_mapping_enabled = 0
Чтобы проверить, что все установилось правильно зайдите в neovim и выполните :CocInfo
. Команда должна вывести что-то похожее на:
## versions
vim version: NVIM v0.4.4
node version: v14.14.0
coc.nvim version: 0.0.79
coc.nvim directory: /Users/nikita.galushko/.vim/plugged/coc.nvim
term: xterm-kitty
platform: darwin
Настройка coc.nvim
Для настройки coc.nvim создайте файл ~/.config/nvim/coc-settings.json
со следующим содержимым:
{
"languageserver": {
"golang": {
"command": "gopls",
"rootPatterns": ["go.mod", ".vim/", ".git/"],
"filetypes": ["go"],
"initializationOptions": {
"usePlaceholders": true
},
"gopls": {
"semanticTokens": true
}
}
}
}
Последние штрихи
Сейчас у нас готовый плацдарм для работы с проектом на Golang, есть автокомплит, запуск тестов. Для полноты не хватаете всего пару вещей.
Устанавливаем nerdtree
Чтобы удобно работать необходимо иметь возможность видеть дерево проекта. В этом нам поможет nerdtree. Добавляем плагин в init.vim Plug 'preservim/nerdtree’
и устанавливаем nvim +PlugInstall
. Приправим nerdtree небольшой настройкой в init.vim:
" запуск nerdtree автоматически
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" закрываем neovim если открыт только nerdtree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
А как же глобальный поиск?
Иногда «Go to definition» недостаточно и нужен поиск по всему проекту. В этом нам поможет fzf. В init.vim добавляем плагин:
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Устанавливаем уже знакомой командой nvim +PlugInstall
. Остался последний шаг установить the_silver_searcher. Тут тоже все просто: brew install the_silver_searcher
. Теперь мы можем искать по всему проекту простой командой :Ag <то что хотим найти>
.