こんにちわ
最近NeoVimに乗り換えて、vim-goプラグインを使用しています。
vimmerとgopherにとって素晴らしいプラグインなので、
共有と自分用メモという意味で記事を書いています。
各項目をクリックすると詳細説明に飛びます。
tutorialの日本語訳も合わせて読むと良いと思います。
目次
コマンド集
定義へ移動
定義や構造体の定義もとへのジャンプは変数にカーソルを当てた状態で、
Ctrl+[もしくはGoDefで定義もとへのジャンプする。

移動から戻る
定義ジャンプするとジャンプ履歴がスタックされる。
一つ前に戻るときはCtrl+tもしくはGoDefPop。
もしくはvimの標準機能のカーソルを一つ前に戻すCtrl+o。

画面分割して定義へ移動
以下のようにキーマッピングすることで、Space+sやSpace+vで画面を分割した状態で定義への移動できる。
let mapleader = "\<Space>"
au FileType go nmap <leader>s <Plug>(go-def-split)
au FileType go nmap <leader>v <Plug>(go-def-vertical)
インターフェイス実装一覧
インターフェイス名にカーソルを当てた状態でGoImplementsで実装済みの構造体一覧をFixリストに表示する。

定義参照一覧
変数や関数の定義にカーソルを当てた状態でGoReferrersで定義への参照をFixリストに表示する。
リファクタリング時やバグ範囲調査時に活用。
タグ生成
構造体のキーにカーソルを当てた状態でGoAddTagsでタグを自動生成。
タグ名を指定したときはGoAddTags urlというふうにすればOK。

タグの削除
構造体のキーにカーソルを当てた状態でGoRemoveTagsでタグを削除してくれる。

キーなしの構造体定義にキーを追加
構造体定義にカーソルを当てた状態で、GoKeyifyでキー名を追加してくれる。

構造体のキー初期値を追加
構造体定義にカーソルを当てた状態でGoFillStructで型に合わせて初期値を追加してくれる。

if err != nilを追加
GoIfErrで以下のスニペットを追加。
戻り値は関数の戻り値定義に合わせて追加いしてくれるあたりが賢いが、追加してくれない型もある。
if err != nil {
return err
}
vim-goは簡単にスニペット導入できるので後ほど紹介します。

構文チェック
GoVetで構文が間違っていないかをチエック。間違っている場合はFixリストに表示する。

実行
テスト実行
テスト個別実行
カバレッジを見る
GoCoverageでストを実施してカバレッジを色つけて表示してくれる。

カバレッジをブラウザで見る
GoCoverageBrowserでテストを実施してカバレッジをデフォルトブラウザで見る。

関数と型宣言一覧
※ctrlp.vimもしくはfzfプラグインを入れる必要がある。
GoDeclsで開いているファイル、GoDeclsDirでディレクトリ配下の関数と型宣言を表示してくれる。

インターフェイスのメソッド雛形生成
GoImplで構造体とインターフェイスを指定することで、実装すべきメソッドの雛形を生成してくれる。
標準パッケージの場合は不要だけど、自パッケージの場合は$GOPATH/src以下のパス.インターフェイス名を入力する必要がある。
例)
githu.com/skanehira/docui/panelのPanelインターフェイスを実装したい場合は以下のように入力すればOK。
github.com/skanehira/docui/panel.Panel

リネーム
一括で変数名や関数名などを変えたい時に、カーソルを当てた状態でGoRenameで変更できる。

テキストオブジェクト
| command | opration |
|---|---|
| vif | 関数の内側を全選択 |
| cif | 関数の内側を全カット |
| dif | 関数の内側を全削除 |
| yif | 関数の内側をヤンク |
| vaf | 関数全体を選択 |
| caf | 関数全体をカット |
| daf | 関数全体を削除 |
| yaf | 関数全体をヤンク |
設定
スニペット
プラグイン'SirVer/ultisnips'を追加するだけでスニペットを使用することができる。
fnを入力してTabを押すとfmt.Println("")という感じで補完してくれる。
デフォルトで使えるスニペット一覧はこちら。
自前で用意する時は↑のファイルに追記すればOK。
スニペットによっては複数入力しないといけないモノがあるので、
vimrcもしくはvim.initに以下を追加するとTabとShift+Tabで入力の選択ができるようになる。
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
保存時自動Import
vimrcやinit.vimに以下を追加するとファイル保存時に自動でパッケージをimportしてくれる。
let g:go_fmt_command = "goimports"
保存時チェック
vimrcやinit.vimに以下を追加するとファイル保存時にGoLint、GoVet、GoErrCheckをまとめてしてくれる。
let g:go_metalinter_autosave = 1
パワーがないマシンだと時間かかるので、構文チェックだけしたい場合は以下のようにすればOK。
let g:go_metalinter_autosave = 1
let g:go_metalinter_autosave_enabled = ['vet']
GoRunやGoTest時の画面分割方法変更
vimrcやinit.vimに以下を追加することで、分割方法を変更できる。
上下に分割して実行させたいので以下のようにしている。
let g:go_term_mode = 'split'
よく使うコマンドをキーマッピングしておく
au FileType go nmap <silent> <leader>r <Plug>(go-run)
au FileType go nmap <silent> <Leader>s <Plug>(go-def-split)
au FileType go nmap <silent> <Leader>v <Plug>(go-def-vertical)
au FileType go nmap <silent> <leader>t <Plug>(go-test)
au FileType go nmap <silent> <leader>at :GoAddTags<CR>
au FileType go nmap <silent> <leader>fs :GoFillStruct<CR>
au FileType go nmap <silent> <leader>ei :GoIfErr<CR>
au FileType go nmap <silent> <leader>ki :GoKeyify<CR>
au FileType go nmap <silent> <leader>dd :GoDeclsDir<CR>
au FileType go nmap <silent> <leader>ip :GoImpl<CR>
(中略)
パワー不足マシンでの定義ジャンプ速度改善
パワーがなく、定義ジャンプなどに時間が掛かってストレスになる方は、LSPを試してみてください。
詳細はこちらの記事を参照してください。
自分の環境では処理速度が改善され、ジャンプが早くなりましたが、
それなりのパワーがあるPCだと逆にvim-goの定義ジャンプの方が早かったりします。








