我对使用VSCode和golang的舒适补全进行了自己的总结

關於這篇文章

    • この記事は Go7 Advent Calendar 2019 の 8 日目の記事です。

Umeda.go 2019 Autumn で発表した内容をQiitaにまとめた記事です

umeda.goは大阪の梅田近辺を中心に活動しているGo Communityです
春夏秋冬の年4回開催を心がけております
もし機会が合えばぜひお気軽にご参加いただければと思います

スライドはすでに公開しています
限りなくGolang成分が薄いです(すみません)
間違っていたらご指摘お願い致しますm(_ _)m

这篇文章的目的是什么?

    • golangでコーディングを快適にしたい

 

    最近リリースされたTabNineを紹介したい

关于代码编辑器的编码支持情况

最近,有很多编程语言和代码编辑器被发布了出来。
语言包括C、C++、Golang、Rust、Python等。
编辑器则有Vim、emacs、VSCode等。
我认为有很多编辑器利用插件实现了舒适的自动补全功能。
然而,虽然编辑器的编码支持稍有差异,但支持的内容大致相同。
包括跳转到定义、输入补全、光标悬停显示信息(变量类型、函数参数等)等。

关于LSP(语言服务器协议)的内容

为了支持编程语言在编辑器中,需要通过编辑器的扩展语言编写支持插件。
如果在每个编辑器中为各个编程语言编写插件,会导致组合爆炸的发生,即编程语言×编辑器类型的组合数变得非常庞大。
尽管插件逻辑相似,却不得不重新编写针对每个编辑器准备的插件语言,这是一个问题。

正如之前所提到的,无论语言如何变化,编辑器提供的编码支持并没有太大的差异。也就是说,一定程度上可以对编码支持的内容进行规范化。微软公司进行了这种规范化,并宣布了 LSP(语言服务器协议)。

根据语言信息计算编辑器支持逻辑的是“语言服务器”。编辑器通过向语言服务器发送信息并将返回的内容反映到编辑器中来实现,从而可以避免程序语言×编辑器种类的组合爆炸。

「言語服务器」这个词听起来可能很复杂,但更贴切的说法可能是「一个能够根据语言提供编码支持信息并回答的独立进程」。语言服务器甚至可以在本地环境中运行。

我已经说了这么多,但是我觉得您最好去看一下Qiita上有关LSP的详细解释的文章。

关于Go语言服务器的问题

我已经将以下的表格总结成了下列中文。

golangの言語サーバーメンテ状況備考https://github.com/sourcegraph/go-langserver/今も続いている・・・?
(発表当時は止まっていたはずなのに。。。)初代golangの言語サーバーhttps://github.com/saibing/bingo2019/3/31に
メンテしないことを宣言sourcegraph/go-langserverに
影響されて作成された言語サーバーhttps://github.com/golang/tools/tree/master/goplsgolangチームがサポート中golang公式が提供する言語サーバー
元々「golsp」でしたが
「gopls」にリネーム

看了表格后,我认为实际上只有”gopls”这一个选择。

关于gopls和VSCode的合作

Microsoft公司已经提供了Golang插件,但是与语言服务器相关的功能默认处于关闭状态。要启用语言服务器,需要进行多个初始设置。

2019年9月頃,如果进行了错误的设置,会导致“每次保存后光标回到第一行第一列”,这种极度令人压力的行为,但目前该问题已经得到解决。对应的问题已解决。

顺便问一下,”go.languageServerExperimentalFeatures”的设置组名,将会在什么时候去掉Experimental呢?

关于具体的设置方法

请查看README获取更详细的信息。

我只会用汉语表达,以下是对该句的翻译:
我会把当时调查到的内容记录下来。

{
    "go.languageServerExperimentalFeatures": {
      "format": false,              // trueの場合、言語サーバーはgofmtを使用してファイルをフォーマットする ※当時はオフにしないと、1行1列目に戻ってしまってました
      "autoComplete": true,         // trueの場合、言語サーバーが提供する補完結果を表示する
      "rename": true,               // trueの場合、適切な名前変更機能が有効化される
      "goToDefinition": true,       // trueの場合、関数定義へのジャンプ機能を有効化する
      "hover": true,                // trueの場合、マウスを関数の上にかざすと定義表示がされるようになる
      "signatureHelp": true,        // trueの場合、関数のヘルプやパラメータのヒントを表示するようになる
      "goToTypeDefinition": true,   // trueの場合、型定義へのジャンプを有効化する
      "documentSymbols": true,      // trueの場合、ドキュメントシンボル表示、アウトライン表示、パンくずリスト表示を有効化する
      "workspaceSymbols": true,     // trueの場合、ワークスペースにあるシンボルジャンプを有効化する
      "findReferences": true,       // trueの場合、検索参照機能を有効化する
      "diagnostics": true,          // trueの場合、`go vet` を相当の機能を提供し、`buildOnSave` `vetOnSave` を無視する
      "documentLink": true,         // trueの場合、importされているパッケージに対するドキュメントリンクが直接踏めるようになる

      "goToImplementation": true,   // ※ソースコード上に存在するだけでドキュメントがない
      "incrementalSync": true,      // trueの場合、差分(増分)ドキュメント更新が有効化される ※デフォルトfalseな上に使われてない?
    },

    // goplsのデバッグをしたい場合、以下の設定を行うことでログを見ることができます
    {
        "go.languageServerFlags": [
        "-rpc.trace",             // LSPの内容をダンプしつつ実行する
        "serve",                  // LS起動
        "--debug=localhost:6060", // このアドレスにデバッグ情報を表示する
      ],
    }
}

关于TabNine

采用深度学习应用,该工具通过加强”补全功能”。似乎通过使用在Github上公开的约200万个源代码文件进行学习。不仅针对特定的语言,而是适用于多种语言。还提供插件,使其能够立即在各种代码编辑器中使用。请参阅官方网站和博客获取更详细信息。

TabNine的语义完成功能

并非专注于特定语言,而是支持多种语言,但每种语言都有其特定的功能和写作方式。
用于补充这些特定语言信息的功能是”Semantic completion”。
“Semantic completion”与语言服务器通信,引用定义和类型信息,从而提高补全准确性。
不足之处是需要启动适用于TabNine的LS,
这意味着在普通使用和TabNine使用时会消耗双倍 CPU 资源。
也许可以共享资源,但说实话我不太清楚。

TabNine注意事项

只有使用Professional版或Enterprise版才能使用基于深度学习的补全功能。然而,Professional版目前还是Beta版,只要发送邮件,任何人都可以使用。基于深度学习的补全功能有两种类型:「TabNine Cloud」和「TabNine Local」。

TabNine云

利用云端GPU进行计算,无需使用机器的规格。
但是,由于需要将代码发送到云端,存在代码意外泄露的可能性。

TabNine本地版

在使用自己的电脑进行计算时,不存在代码泄漏的可能性。
但是,必须使用支持一定指令的CPU才能使用。
至少需要支持FMA指令(乘加运算)。
如果是Intel i7 CPU,至少需要是第四代或以上的。

如何在VSCode中启用TabNine并与gopls进行协作。

image.png

如何启用TabNine的语义补全功能

TabNine的设置方法非常独特。在源代码中输入”TabNine::config”,默认浏览器将打开TabNine的设置页面。在配置页面的”Configuration path”中,可以找到tabnine_config.json的路径,请打开该路径以访问tabnine_config.json文件。将具有相同路径的”TabNineExample.toml”重命名或复制为”TabNine.toml”。在文件中记录所需语言服务器的设置。

[language.go]
command = "gopls"
args = ["serve"]
install = [["go", "get", "-u", "golang.org/x/tools/cmd/gopls"]]

其实目前情况下,以上设置默认已生效,因此无需特意进行设置。

只需要提供一种选项:
在源代码中启用“语义完成”后,只需要输入“TabNine::sem”,就可以启用它了。对于本次情况,在任何一个.go文件中,输入“TabNine::sem”,就可以启用针对golang的语义完成。

F9EdVJ44OYA

总结

    • コーディングサポートで必要な機能は固定化されつつあります

 

    • Microsoft社がLSPとして言語サーバーとやり取りする情報を規格化し、それに則って実装するエディタや言語サーバーがでてきました

 

    • 更に補完に関して深層学習を利用したTabNineが出てきて結構快適にコーディングできるようになってきたと思います

 

    • gopls + TabNine + VSCodeおすすめです!

ぶっちゃけ他のエディタでもいいので使ってみてほしいです

bannerAds