Skip to content

Instantly share code, notes, and snippets.

@optik-aper
Forked from krlvi/vim-go-cheatsheet.md
Last active October 13, 2022 16:41
Show Gist options
  • Save optik-aper/58afc8a62ef0dd00bf985d686318f5ba to your computer and use it in GitHub Desktop.
Save optik-aper/58afc8a62ef0dd00bf985d686318f5ba to your computer and use it in GitHub Desktop.
vim-go Cheatsheet

vim-go

Plugin https://github.com/fatih/vim-go
Tutorial https://github.com/fatih/vim-go-tutorial
Vimrc https://github.com/fatih/dotfiles/blob/master/vimrc

Run

Commands

  • File :GoRun %
  • Package :GoRun
  • Debug :GoDebugStart

vimrc

Shortkeys

autocmd FileType go nmap <leader>r  <Plug>(go-run)

Build

Commands

  • Package :GoBuild

vimrc

Auto save on make with

set autowrite

Error navigation

map <C-n> :cnext<CR>  
map <C-m> :cprevious<CR>  
nnoremap <leader>a :cclose<CR>  

Test

Commands

  • File :GoTest from test or implementation
  • Function :GoTestFunc
  • Compile test :GoTestCompile

vimrc

Shortkey to build go implementation or test

" run :GoBuild or :GoTestCompile based on the go file
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>

Coverage

Commands

  • :GoCoverage
  • :GoCoverageClear
  • :GoCoverageToggle
  • :GoCoverageBrowser

vimrc

Toggle coverage

autocmd FileType go nmap <Leader>c <Plug>(go-coverage-toggle)

Edit

Commands

  • :GoFmt
  • :GoImports
  • Struct add tags :GoAddTags
  • Struct remove tags :GoRemoveTags
  • Manually import package :GoImport <package> - tab completion
  • Manually remove package :GoDrop <package>
  • Import with alias :GoImportAs <alias> <package>

Text objects

  • Inner function - dif, yif, vif etc
  • Whole function - daf, yaf, vaf etc

vimrc

Format on save

let g:go_fmt_autosave = 1

Disable gofmt parse errors

let g:go_fmt_fail_silently = 1

Goimports on save

let g:go_fmt_command = "goimports"

Struct line split

Plug 'AndrewRadev/splitjoin.vim'
  • split gS
  • join gJ

Snippets (Keyword + TAB) reference

Plug 'SirVer/ultisnips'
  • fn fmt.Println()
  • ff fmt.Printf()
  • ln log.Println()
  • lf log.Printf()

Navigation

Commands

  • Between test and implementation :GoAlternate
  • Go to definition :GoDef or gd or ctrl-]
  • Back from definition :GoDefPop or ctrl-t
  • Show navvigation stack :GoDefStack
  • Clear navigation stack :GoDefStackClear
  • File type and function declarations :GoDecls
  • Directory tyle and function declarations :GoDeclsDir
  • jump to next function ]]
  • jump to previous function [[
  • 3]], d]], v]]

vimrc

Needed for :GoDecls and :GoDeclsDir

Plug 'ctrlpvim/ctrlp.vim'

Alternate commands

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')

Documentation

Commands

  • :GoDoc or K
  • :GoDocBrowser
  • :GoInfo function signature
  • Highlight identifiers :GoSameIds
  • Clear highlight identifiers :GoSameIdsClear
  • List files in a package :GoFiles
  • List file dependencies :GoDeps
  • Find references to identifier :GoReferrers
  • Info for identifier :GoDescribe
  • Interfaces a type implements :GoImplements
  • Possible error types :GoWhicherrs
  • Channel info :GoChannelPeers
  • Show possible call targets of function call :GoCallees
  • Show function call locations :GoCallers
  • :GoCallstack
  • Guru scope whole GOPATH :GoGuruScope ...

vimrc

Get info

autocmd FileType go nmap <Leader>i <Plug>(go-info)

Automatically show function info

let g:go_auto_type_info = 1

Function info update delay (ms)

set updatetime=100

Automatically highlight identifiers

let g:go_auto_sameids = 1

Refactor

Commands

  • Rename identifier :GoRename <newname>
  • Show free variables visual select + :GoFreevars

Codegen

Commands

  • Implement interface for type :GoImpl <interface>

Checks/Linting

Commands

  • :GoLint
  • :GoVet
  • :GoMetaLinter

vimrc

Meta linter checks for :GoMetaLinter

let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck', 'deadcode']

Meta linter on save

let g:go_metalinter_autosave = 1

Meta linter checks for autosave

let g:go_metalinter_autosave_enabled = ['vet', 'golint']

Syntax

let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_operators = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_build_constraints = 1
autocmd BufNewFile,BufRead *.go setlocal noexpandtab tabstop=4 shiftwidth=4

Shortcut key suggestion

Leader keys

Q

  • q Show how function is reached :GoCallstack
autocmd FileType go nmap <leader>q  <Plug>(go-callstack)

W

  • w Alternwate window splits
nnoremap <leader>w <C-w>w
  • W Only one active window
nnoremap <Leader>W :only<CR>

E

  • e Generate error handling :GoIfErr
autocmd FileType go nmap <leader>e <Plug>(go-iferr)

R

  • r Rename :GoRename[!] [to]
autocmd FileType go nmap <leader>r  <Plug>(go-rename)

T

  • t Test function :GoTestFunc[!] [expand]
autocmd FileType go nmap <leader>t  <Plug>(go-test-func)` 
  • T Test file :GoTest[!] [expand]
autocmd FileType go nmap <leader>T  <Plug>(go-test)

Y

  • y Keyify struct literals :GoKeyify
nnoremap <Leader>y :GoKeyify<CR>

U

  • u Fill struct with defaults :GoFillStruct
nnoremap <Leader>u :GoFillStruct<CR>

I

  • i List interfaces implemented :GoImplements
autocmd FileType go nmap <leader>i  <Plug>(go-implements)
  • I Stub interface methods :GoImpl [receiver] [interface]
nnoremap <Leader>I :GoImpl<CR>

O

P

  • p c Possible callers of a function :GoCallers
autocmd FileType go nmap <leader>pc  <Plug>(go-callers)
  • p t Possible call targets for a type :GoCallees
autocmd FileType go nmap <leader>pt  <Plug>(go-callees)
  • p v Possible vars of a pointer :GoPointsTo
autocmd FileType go nmap <leader>pv  <Plug>(go-pointsto)
  • p e Possible error types of an error :GoWhicherrs
nnoremap <Leader>pe :GoWhicherrs<CR>
  • p c Channel peers :GoChannelPeers
autocmd FileType go nmap <leader>pp  <Plug>(go-channelpeers)

A

  • a Alternate test/implementation :GoAlternate[!]
autocmd FileType go nmap <leader>a  <Plug>(go-alternate-edit)

S

  • s Describe type or identifier :GoDescribe
autocmd FileType go nmap <leader>s  <Plug>(go-describe)

D

  • d Show doc :GoDoc [word]
autocmd FileType go nmap <leader>d  <Plug>(go-doc)
  • D Browse doc :GoDocBrowser [word]
autocmd FileType go nmap <leader>D  <Plug>(go-doc-browser)

F

  • f Show all functions and types in file :GoDecls [file]
nnoremap <Leader>f :GoDecls<CR>
  • F Show all functions and types in directory :GoDeclsDir [dir]
nnoremap <Leader>F :GoDeclsDir<CR>

G

  • g Show definition jump stack :GoDefStack [number]
autocmd FileType go nmap <leader>g  <Plug>(go-def-stack)
  • G Clear definition jump stack :GoDefStackClear
autocmd FileType go nmap <leader>G  <Plug>(go-def-stack-clear)

H

  • h Show all identifiers referring to the object :GoReferrers
autocmd FileType go nmap <leader>h  <Plug>(go-referrers)
  • H Toggle highlight same identifiers :GoSameIdsToggle
nnoremap <Leader>H :GoSameIdsToggle<CR>

J

K

L

  • l List buffers
nnoremap <leader>l :ls<CR>:b<space>
  • L List files
nnoremap <Leader>L :Explore<CR>

Z

X

  • w Close window split
nnoremap <leader>x <C-w>c

C

  • c Toggle coverage :GoCoverageToggle[!] [options]
autocmd FileType go nmap <Leader>c <Plug>(go-coverage-toggle)
  • C Browse coverage :GoCoverageBrowser[!] [options]
nnoremap <Leader>C :GoCoverageBrowser<CR>

V

  • v Show free variables in selection :GoFreevars
autocmd FileType go nmap <leader>v  <Plug>(go-freevars)

B

  • b Build :GoBuild[!] [expand] :GoTestCompile[!] [expand]
autocmd FileType go nmap <leader>b :<C-u>call <SID>build_go_files()<CR>
  • B Run :GoRun[!] [expand]
autocmd FileType go nmap <leader>B  <Plug>(go-run)

N

M

  • m Meta linter :GoMetaLinter [path]
autocmd FileType go nmap <leader>m <Plug>(go-metalinter)

Extra

  • gd Go to definition :GoDef
  • <C-t> Back from definition :GoDefPop [count]
nnoremap <leader><TAB> :b#<CR>  
nnoremap <CR> :nohlsearch<CR><CR>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment