My External Storage

Oct 22, 2018 - 3 minute read - Comments - vim go

vim-goの自動補完が効かないときの調べ方(gocode が Error parsing input file (outer block)) #vim #go

goimportsなどが更新されていたので、vim-goGoUpdateBinariesコマンドを実行したらvimで自動補完が効かなくなった。
結局はgocodeの調子が悪いことが多いので、原因の調べ方をまとめる。
(今回の場合は let g:go_gocode_propose_source = 0 で解決した。)

TL;DR

  • vim-goの自動補完に正しい候補がでなくなった
  • gocodegocode exitしたあとgocode -debug -sで再起動する
  • vimも再起動して適当なGoファイルをいじっていると、gocodeのデバッグ出力が確認できる
  • 今回はvimrcファイルにlet g:go_gocode_propose_source = 0を加えることで解決した。

なおvimバージョンは以下。

VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 15 2018 08:48:39)
macOS version

gocodeは以下のコミットハッシュの状態(#71がマージされた状態) https://github.com/mdempsky/gocode/tree/22f3bf7a9256a30885d7cd46da4657cc878f3f4f

vim-goの自動補完が効かなくなった

goimportsgolintが更新されていたので、更新しようとした。
私はひとつひとつ更新するのが面倒なので、vimでGoUpdateBinariesコマンドを実行することで全て更新している。
今回、コマンド実行後vim-goで自動補完が動かなくなってしまった。
vim-goを更新すれば直るか?と思い(自分はdeinを使っているので、)call dein#update()してみたがそれでもダメだった。

gocodeの挙動を確認する

2018/10/20時点のvim-goは内部でgocodeを利用することで自動補完を実施している。
gocode exitしてバックプロセスを再起動(vimでGo触ってると再度起動する)しても直らなかった。

vim自体がロギングしているログはmessagesで確認することができるが、messagesではgocodeが出力しているログは確認できない。
なので、gocodeをデバッグモードで起動して確認した。gocodegocode exitで一度終了したあと、gocode -debug -sと実行することでデバッグ出力をターミナルに出力する状態で起動できる。
あとはこの状態でvimを操作するとgocodeからデバッグログが出力される。

今回は以下のようなデバッグ出力が出力された。

$ gocode -debug -s
...
2018/10/20 16:25:27 Error parsing input file (outer block):
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:28:1: expected operand, found ';'
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:36:3: expected ')', found 'EOF'
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:36:3: expected ';', found 'EOF'
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:36:3: expected ';', found 'EOF'
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:36:3: expected '}', found 'EOF'
2018/10/20 16:25:27  /Users/budougumi0617/go/src/github.com/budougumi0617/sample_repo/foo/no_complete.go:36:3: missing ',' in argument list

ログを頼ったり、gocodeの更新を確認したところsourceオプションの有無で挙動が変わるらしく、以下のオプションをvimrcに書いたところ直った。

let g:go_gocode_propose_source = 0

今回の原因はgocodeでこの変更が入ったからのようだ。

終わりに

おそらくvim-go側も対応入ると思うので、しばらくはvim-gogocodeをこまめに更新したほうが良いのかもしれない。
直すまで半日くらいVSCodeで作業していたのだが、VSCode(+vimプラグイン)でGo書くのもなかなか良かった。
けどやっぱりvimのほうがシンプルで好きだ。

関連記事