The previous three posts covered all the basics I recommend when using nvim (or any vi(m) really). What’s next are concrete plugins useful when programming in Go, specifically two plugins I use daily in nvim.
Please keep in mind that I use vim-plug for installing plugins, so in the subsections below I will only indicate the corresponding command to use for vim-plug for installing them, but don’t worry both plugins support different ways to get them installed.
The next gist contains all the configuration I use for both vim-go and coc.nvim, in the subsections below I will give you more context about specific configuration.
1) fatih/vim-go
vim-go is nowadays the de-facto plugin for Go, it supports compiling, testing and executing Go programms, as well as running code coverage, looking up for documentation, symbol/definition declaration and more.
To install it use:
Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
The configuration I use maps some keys for compiling, testing and running code coverage using the leader key:
function! s:build_go_files()
let l:file = expand('%')
if l:file =~# '^\f\+_test\.go$'
call go#test#Test(0, 1)
elseif l:file =~# '^\f\+\.go$'
call go#cmd#Build(0)
endif
endfunction
autocmd FileType go nmap <leader>b :<C-u>call <SID>build_go_files()<CR>
autocmd FileType go nmap <Leader>c <Plug>(go-coverage-toggle)
autocmd FileType go nmap <leader>t <Plug>(go-test)
Also I use some new commands for working with alternate/test files:
autocmd Filetype go command! -bang A call go#alternate#Switch(<bang>0, 'edit')
autocmd Filetype go command! -bang AV call go#alternate#Switch(<bang>0, 'vsplit')
autocmd Filetype go command! -bang AS call go#alternate#Switch(<bang>0, 'split')
autocmd Filetype go command! -bang AT call go#alternate#Switch(<bang>0, 'tabe')
This give us the following commands:
:Afor replacing the current buffer with the alternate test go. So if the file isfile.gothenfile_test.gowill be loaded.:AVsimilar to:Abut now using a vertical split.:ASsimilar to:Abut now using a horizontal split.:ATsimilar to:Abut now opens up a new tab.
Next, we have:
let g:go_list_type = "quickfix" " error lists are of type quickfix
let g:go_fmt_command = "goimports" " automatically format and rewrite imports
let g:go_auto_sameids = 1 " highlight matching identifiers
let g:go_def_mapping_enabled = 0 " coc.vim will do `gd`
The configuration above allows you to do the the following:
- Errors use
quickfixfor displaying errors, goimportsis automatically called when saving a file,- Matching identifiers are highlighted when cursor is on their name, and
- To disable
:GoDefwhen callinggd, this is sococ.nvimcan take over.
Alternatives to vim-go includes plugins like govim and coc-go.
2) neoclide/coc.nvim
neoclide/coc.nvim is a plugin for adding autocompletion that supports language server protocol, and therefore supports gopls!
To install it, first make sure you install nodejs:
brew install nodejs
Then install the plugin:
Plug 'neoclide/coc.nvim', {'branch': 'release'}
The configuration below:
nmap <silent> gr <Plug>(coc-references)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> rn <Plug>(coc-rename)
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
Let’s you do the following:
grLists all the references to the selected symbol, for example other types using said type,giWorks for interface types, it allows you to list types implementing selected interface,rnWorks for types, it allows you to rename types, this is similar to:GoRename(but this one works), andZdisplays documentation for the selected type.
I highly encourage you to take a look at the example vim configuration because there are some nice settings that could improve your vim performance.
An alternative plugin to to coc.nvim is Shougo/deoplete.nvim which also supports multiple programming languages.
Finally let’s see vim-go and coc.nvim in actioa!
Quick show-and-tell of using both plugins:


