|
|
@@ -0,0 +1,313 @@ |
|
|
# 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) |
|
|
`Plug 'SirVer/ultisnips'` [reference](https://github.com/fatih/vim-go/blob/master/gosnippets/UltiSnips/go.snippets) |
|
|
|
|
|
|
|
|
* `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 cunction 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 |
|
|
### 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 highlighting |
|
|
### vimrc |
|
|
* `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` |
|
|
* tab size `autocmd BufNewFile,BufRead *.go setlocal noexpandtab tabstop=4 shiftwidth=4 ` |
|
|
|
|
|
|
|
|
## Shortkey 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>` |