Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

こんにちわ

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

gorilla0513
https://twitter.com/gorilla0513
https://github.com/skanehira
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away