emahiro/b.log

日々の勉強の記録とか育児の記録とか。

VSCode で Go の自動補完に gopls + TabNine を使ってみる

Summary

qiita.com

上記のエントリを読んで試しに、VSCode + TabNine の組み合わせをセットアップしたら gopls を使っているにも関わらず、Go の自動補完が爆速になって開発者体験がめちゃくちゃ向上したのでその手順を記載しています。
と言うのも、元々 Intelij を使っていたのですが、gopls の開発活発化に合わせて、ここ1年くらいは VSCode + gopls の環境で作業をしていました。ただ、どうしても VSCode と gopls をセットで使う場合に、langage server との通信ラグがコードの補完と微妙にあってなく、僕が思ってる速度でコードが書けないと言う課題がありました。
そんな中使い続けてたら Go を暗記し始めたので、実質補完いらないみたいな世界線に最近片足突っ込み始めてますが笑

まぁめちゃくちゃPCのメモリを食うのでまぁファンが鳴り止まない、と言う自体もあって何かいいツールはないものか(ここで Intelijにまた戻るのか?)探し続けてたところ、TabNine を知りました。

TabNine とは?

www.tabnine.com

tkrel.com

僕はこんな機会があるまで全然知らなかったんですが、 深層学習を用いることで、より精度の高い入力補完を実現 するツールのようです。
(すごい世の中ですね。)

VSCode のセットアップ

gopls

Goを使う場合は基本的には gopls がついてくるので、特に何かをインストールする必要はありません。
最新、と言うか master の gopls を使いたい場合は go get -u golang.org/x/tools/gopls で取得します。

VSCodesetting.json は以下のようにします。

"format": false,              
"autoComplete": true,         
"rename": true,               
"goToDefinition": true,       
"hover": true,                
"signatureHelp": true,        
"goToTypeDefinition": true,   
"documentSymbols": true,      
"workspaceSymbols": true,     
"findReferences": true,       
"diagnostics": true,          
"documentLink": true,         
"goToImplementation": true,   

余談ですが、最近 gofmt を off った状態で使用しています。どうやら VSCode 側の format on save (go.formatTool で指定したツール) とバッティングせずに動作が少し改善?されるような気がしてます。
詳しいところは追っかけてませんが、gofmt を true にしていたときは大きなファイルに変更を加えると VSCode の fmt のプロセスがなかなか終わらずファイルが save されない、と言う状況を起こしてしまっていました。 gofmt を off って状態でも VSCode 側での goimports に任せるようにした場合、特に fmt や import で困ることもなかったので、結果としては保存時のストレスは最近の作業に限って言うとなくなりました。

TabNine

Setup

参考にしたエントリに記載されているように TabNine のプラグインをインストールします。
プラグインを入れたらソースコードのどこかに TabNine::config を打ちます。そうするとデフォルトブラウザ TabNine の設定画面が開きます。 ブラウザが開かれるとわかりますが、 http://127.0.0.1:5555/{$任意の文字列} と言うURLになっています。このURLはユーザーごとに違うのかまではわかりません。僕の環境では払い出されるURLは毎回同じでした。

エントリには設定方法が記載されていますが、202007 時点では v2.8 系が出ており、これは特に設定等もいらずに TabNine::config で設定を開いたと同時にモデルのDLが始まっていました。

Local or Cloud

TabNine には Local モードと Cloud モードがあります。Cloud モードはクラウド上にある TabNine のサーバー上でコードの自動補完を検査するようです。これは意図せずコードが外部に流出してしまう可能性があるので業務レベルで使いたい場合は Local 一択でしょう。

ちなみにクラウドの機能をフルで使うには有償版に乗り換えないといけないっぽいです。セットアップ時はメールアドレスを入力して送信するだけでしたが。。。(ベータ版はもう終わったのだろうか。)

www.tabnine.com

設定画面に activation するための key を入力するところがありましたし、Cloud 版を試してみたい方は有償版に切り替えて使ってみて欲しいです。

気になる点

深層学習による、コードの補完サポート、と言う立ち位置なので、独自のパッケージ構成や変数定義については完全には追従してません。特にローカル版においては。
頻出パターンなどを含めて学習したモデルを使って自動補完の候補を出力しているので、プライベートなリポジトリの結果が反映されないのも当たり前といえば当たり前ですが。。。 ただ、多少のシグネチャの揺れは合ってもある程度実用に耐えそうな感覚はあります。これから使い倒していくうちに見方が変わるかもしれません笑

まとめ

思いの外開発者体験が向上したので興味がある方は是非1度使ってみてください。
正直まだ使い始めたばかりなので、しんどいところを経験してないですが、もし何かあればまたアップデートをかけようと思います。