DEV Community

Mario Carrion
Mario Carrion

Posted on • Originally published at mariocarrion.com on

(n)vi(m): Go plugins

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' }
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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')
Enter fullscreen mode Exit fullscreen mode

This give us the following commands:

  • :A for replacing the current buffer with the alternate test go. So if the file is file.go then file_test.go will be loaded.
  • :AV similar to :A but now using a vertical split.
  • :AS similar to :A but now using a horizontal split.
  • :AT similar to :A but 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`
Enter fullscreen mode Exit fullscreen mode

The configuration above allows you to do the the following:

  • Errors use quickfix for displaying errors,
  • goimports is automatically called when saving a file,
  • Matching identifiers are highlighted when cursor is on their name, and
  • To disable :GoDef when calling gd, this is so coc.nvim can 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
Enter fullscreen mode Exit fullscreen mode

Then install the plugin:

Plug 'neoclide/coc.nvim', {'branch': 'release'}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Let's you do the following:

  • gr Lists all the references to the selected symbol, for example other types using said type,
  • gi Works for interface types, it allows you to list types implementing selected interface,
  • rn Works for types, it allows you to rename types, this is similar to :GoRename (but this one works), and
  • Z displays 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:

go-vim + coc.nvim


The more you know

Sentry image

Hands-on debugging session: instrument, monitor, and fix

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

RSVP here →

Top comments (0)

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay