こんにちわ
最近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の定義ジャンプの方が早かったりします。