Edited at

vim-goを使うなら使用したいコマンド集と設定

こんにちわ

最近NeoVimに乗り換えて、vim-goプラグインを使用しています。

vimmerとgopherにとって素晴らしいプラグインなので、

共有と自分用メモという意味で記事を書いています。

各項目をクリックすると詳細説明に飛びます。

tutorialの日本語訳も合わせて読むと良いと思います。


目次


コマンド集


定義へ移動

定義や構造体の定義もとへのジャンプは変数にカーソルを当てた状態で、

Ctrl+[もしくはGoDefで定義もとへのジャンプする。

godef.gif


移動から戻る

定義ジャンプするとジャンプ履歴がスタックされる。

一つ前に戻るときはCtrl+tもしくはGoDefPop

もしくはvimの標準機能のカーソルを一つ前に戻すCtrl+o

godefpop.gif


画面分割して定義へ移動

以下のようにキーマッピングすることで、Space+sSpace+vで画面を分割した状態で定義への移動できる。

let mapleader = "\<Space>"

au FileType go nmap <leader>s <Plug>(go-def-split)
au FileType go nmap <leader>v <Plug>(go-def-vertical)

go-def-split.gif

go-def-split.gif


インターフェイス実装一覧

インターフェイス名にカーソルを当てた状態でGoImplementsで実装済みの構造体一覧をFixリストに表示する。

go-implements.gif


定義参照一覧

変数や関数の定義にカーソルを当てた状態でGoReferrersで定義への参照をFixリストに表示する。

リファクタリング時やバグ範囲調査時に活用。

go-referrences.gif


タグ生成

構造体のキーにカーソルを当てた状態でGoAddTagsでタグを自動生成。

タグ名を指定したときはGoAddTags urlというふうにすればOK。

goaddtag.gif


タグの削除

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

go-remove-tag.gif


キーなしの構造体定義にキーを追加

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

go-keyify.gif


構造体のキー初期値を追加

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

go-fillstruct.gif


if err != nilを追加

GoIfErrで以下のスニペットを追加。

戻り値は関数の戻り値定義に合わせて追加いしてくれるあたりが賢いが、追加してくれない型もある。

if err != nil {

return err
}

vim-goは簡単にスニペット導入できるので後ほど紹介します。

go-iferr.gif


構文チェック

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

govet.gif


実行

GoRunでmainパッケージビルドして実行する。

gorun.gif


テスト実行

GoTestでテストを実行する。

go-test.gif


テスト個別実行

GoTestFuncで関数毎のテストを実行する。

go-testfunc.gif


カバレッジを見る

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

go-cavarage.gif


カバレッジをブラウザで見る

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

go-covarage-brewoser.gif


関数と型宣言一覧

ctrlp.vimもしくはfzfプラグインを入れる必要がある。

GoDeclsで開いているファイル、GoDeclsDirでディレクトリ配下の関数と型宣言を表示してくれる。

godecls.gif


インターフェイスのメソッド雛形生成

GoImplで構造体とインターフェイスを指定することで、実装すべきメソッドの雛形を生成してくれる。

標準パッケージの場合は不要だけど、自パッケージの場合は$GOPATH/src以下のパス.インターフェイス名を入力する必要がある。

例)

githu.com/skanehira/docui/panelのPanelインターフェイスを実装したい場合は以下のように入力すればOK。

github.com/skanehira/docui/panel.Panel

go-impl.gif


リネーム

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

go-rename.gif


テキストオブジェクト

関数にカーソルを当てた状態でvifなどで一括選択できる。

dif.gif

command
opration

vif
関数の内側を全選択

cif
関数の内側を全カット

dif
関数の内側を全削除

yif
関数の内側をヤンク

vaf
関数全体を選択

caf
関数全体をカット

daf
関数全体を削除

yaf
関数全体をヤンク


設定


スニペット

プラグイン'SirVer/ultisnips'を追加するだけでスニペットを使用することができる。

fnを入力してTabを押すとfmt.Println("")という感じで補完してくれる。

デフォルトで使えるスニペット一覧はこちら

自前で用意する時は↑のファイルに追記すればOK。

go-snipet.gif

スニペットによっては複数入力しないといけないモノがあるので、

vimrcもしくはvim.initに以下を追加するとTabShift+Tabで入力の選択ができるようになる。

let g:UltiSnipsExpandTrigger="<tab>"                                            

let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"

snipet-select.gif


保存時自動Import

vimrcinit.vimに以下を追加するとファイル保存時に自動でパッケージをimportしてくれる。

let g:go_fmt_command = "goimports"


保存時チェック

vimrcinit.vimに以下を追加するとファイル保存時にGoLintGoVetGoErrCheckをまとめてしてくれる。

let g:go_metalinter_autosave = 1

パワーがないマシンだと時間かかるので、構文チェックだけしたい場合は以下のようにすればOK。

let g:go_metalinter_autosave = 1

let g:go_metalinter_autosave_enabled = ['vet']


GoRunやGoTest時の画面分割方法変更

vimrcinit.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の定義ジャンプの方が早かったりします。