忙しい人のためのvim-goの設定 @neovim @dein @tomlファイルの書き方

[vim-goチュートリアル](https://github.com/hnakamur/vim-go-tutorial-ja)を最初から通してやったときの最終的なneovim:deinで読み込むtomlの設定を公開します。


lazy.tomlにはバッファのファイルタイプがgoのときに読み込むプラグインなどを書いておく。
以下golang用プラグインの部分抜粋。

```vim:~/.config/dein/lazy.toml
# go lang plugins
[[plugins]]  # go command use as vim command :GoBuild, :GoInstall

# EXECUTE `:GoInstallBinaries` AT FIRST!

# it's take a long time to go get some go sources & build them.

repo = 'fatih/vim-go'
on_ft = 'go'
hook_add = '''
    "  参考: https://github.com/hnakamur/vim-go-tutorial-ja

    " :nextなどでバッファ移動時にファイルが変更されていれば書き込む
    " :GoBuildするときにファイルを保存する必要がなくなる
    autocmd FileType go set autowrite

    " === VIM-GO COMMAND KEYBINDS ===
    " autocmd FileType go nmap <leader>b  <Plug>(go-build) " 下記に改善版
    autocmd FileType go nmap <leader>r <Plug>(go-run)
    autocmd FileType go nmap <leader>t <Plug>(go-test)
    autocmd FileType go nmap <Leader>c <Plug>(go-coverage-toggle)
    " 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>

    " ファイル切り替え
    " チュートリアルのおすすめキーバインド
    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')
    " 自分専用キーバインド(^とpが近いので)
    autocmd FileType go nmap <Leader>pp <Plug>(go-alternate-edit)
    autocmd FileType go nmap <Leader>ps <Plug>(go-alternate-split)
    autocmd FileType go nmap <Leader>pv <Plug>(go-alternate-vertical)
    " tabに表示はない

    " [[, ]]: 次/前の関数に移動
    " (go組込関数上などで)K: :GoDocと同様

    " === VIM-GO OPTIONS ===
    " GoRunの結果をsplitで表示 Default->"vsplit"
    let g:go_term_mode = "split"

    " :GoFmt時にimportのチェック Default->gofmt
    " ファイルが巨大だと保存時の:GoFmtが遅くなるので消しましょう
    let g:go_fmt_command = "goimports"

    " "コメントも関数の一部として扱われたくないときは0に設定する Default=>1
    " let g:go_textobj_include_function_doc = 1

    " キャメルケースに変換(defalut snake_cake)
    let g:go_addtags_transform = "camelcase"

    " :GoMetaLinterで呼び出すコマンド Default->['vet', 'golint', 'errcheck']
    " let g:go_metalinter_enabled = ['vet', 'golint', 'errcheck']

    " 自動保存時にLinter有効化 Default->0
    let g:go_metalinter_autosave = 1

    " 自動保存時に走らせるLinter Default->['vet', 'golint']
    " let g:go_metalinter_autosave_enabled = ['vet', 'golint']

    " 自動保存時に走らせるLinterタイムアウト Default->"5s"
    " let g:go_metalinter_deadline = "5s"

    " :GoDef使用時に使うコマンド ['guru', 'godef'] guru使えないときはgodefに切り替える
    " Default->'guru
    " let g:go_def_mode = 'guru'

    " :GoDeclsはデフォルトで関数と型を表示する Default->"func,type"
    " 型だけにしたいときは"func"だけを指定
    " let g:go_decls_includes = "func,type"

    " カーソル上のワードに対して:GoInfo実行
    let g:go_auto_type_info = 1
    " :GoInfo更新時間 Default->800
    autocmd FileType go set updatetime=100
    " または:GoInfoのキーバインドを設定
    " autocmd FileType go nmap <Leader>i <Plug>(go-info)

    " 同じIDをカーソルがワードに移動するごとにハイライト Default->0
    " let g:go_auto_sameids = 1
    " または:GoSameIdsToggleのキーバインドを設定
    autocmd FileType go nmap <Leader>s :GoSameIdsToggle<CR>

    " :GoPlayでページをブラウザに読み込まない Default->1
    let g:go_play_open_browser = 0

    " === Others ===
    " GoInstallBinaries: vim-goに必要なツールのインストール(go get がバックグラウンドで動いて大変時間がかかる)
    " GoUpdateBinaries: GoInstallBinariesで落としたツールのアップデート
    " GoImport: importパスの追加
    " GoImportAs: importパスの追加(パッケージ名変更)
    " GoDrop: importパスの削除
    " GoDef: ctagsジャンプと同じ(ショートカットキー<C-]>)
    " GoDecls: gtagsジャンプと同じ(ファイル内のみ対象) ctrlPやFZFと連携
    " GoDeclsdir: gtagsジャンプと同じ(ディレクトリ内の全ファイル対象)
    " GoReferrers: gtagsジャンプと似たようなもん？GoDeclsと違ってロケーションリストに表示
    " GoDescribe: フィールドの定義、メソッドの組と URL 構造体のフィールドが表示される
    " GoImplements: 型が実装しているインターフェースをロケーションリストに表示
    " GoWhicherrs: モードはエラーの型の値に現れうる可能な定数の組、グローバル変数、そして具象型を報告
    " GoCallees: 関数を呼び出す可能性のあるターゲットを表示
    " GoCallstack: 選択部分を含む関数へのコールグラフの根本からの任意のパスを表示
    " GoChannelPeers: チャンネルの送信先 / 受信先を表示
    " GoRename: GOPATH 以下にある全てのパッケージを検索してその識別子に依存している全ての識別子をリネーム
    " GoFreevars: どれだけ多くの変数に依存しているかを見る
    " GoGenarate: コード生成
    " GoImpl: インターフェースを実装するメソッドスタブの生成
    " GoPlay: コードをGo Playground に公開する(リンクはバッファかクリップボードにコピーされる)
'''

[[plugins]]  # go completion
repo = 'zchee/deoplete-go'
build = 'make'
on_ft = 'go'
depends = ['deoplete.nvim']
hook_source = '''
    let g:deoplete#sources#go#gocode_binary = $GOPATH . '/bin/gocode'
'''
```