Skip to main content
  1. Entry/

kamakura.go #9 で Language Server のはなしと見せかけた Zed の紹介をしてきた

6/12 に開催された kamakura.go #9 で LT をしてきた。

以下、はなした内容とその補足。

Language Server #

特定言語に特化した機能を提供するローカルサーバー。 LSP(Language Server Protocol) を使用してエディタと通信・機能を提供することで、エディタ側で言語固有の機能を実装する必要がなくなった、というもの。 メジャーなエディタならおそらくほとんどが LSP に対応していて、意識せずとも Language Server の機能を使っているはず。

Go の Language Server 実装としては、公式の gopls があるので、これを使っておけば間違いない。 というか、現在では他に競合になる選択肢がなさそう? 黎明期は go-langserverbingo があったが、いずれも開発終了している。

ちなみに、LSP が公開されたのが 2016年の6月 なので、ちょうど10周年だった模様。

VSCode と Zed #

VSCode についてはわざわざ説明する必要はなさそう。 今回改めてシェアを調べてみたところ、Stack Overflow のサーベイ によると 76% 弱ということだった。 そんなに多かったっけ・・・。 でも実際自分の周りでもほぼほぼ VSCode ユーザーなのでそんなもんか。

一方、Zed のシェアは 7% 強。 WebStorm と Eclipse の間くらいのようだ。 昨年の同サーベイ には登場すらしていなかったのでだいぶ頑張っている。 今年4月に v1.0 がリリース されたことだし、ユーザー人口増えてほしい。

AI 連携にも力が入っていて、4月に入った Parallel Agents 機能で並列開発もしやすくなった。 Agent Panel 経由で AI Agent を使うと、エディタからのファイルの特定箇所指定できたり、Agent が作ったファイルをさっと開けたりして体験が良かったのだが、 Anthropic の料金体系変更 によって Claude Code ではほぼほぼ使えなくなってしまった (ACP 経由での利用もクレジット課金の対象なので)。 料金体系変更アナウンスの翌週にはターミナルを Agent Thread として扱う Terminal Thread がリリースされたので似たような体験ができてはいるが、 エディタとの統合具合で言うと以前のほうがよいので残念ではある。

ACP 経由では Claude Code の独自機能が使えなかったりするので、そのあたりが使えるようになったと考えるべきか。 プライベートでは Antigravity CLI を使っているのだが、これは ACP には対応していないのだが、Terminal Thread 経由であれば問題なく使えるのでおこぼれでうれしい案件。

ちなみに自分がいつ Zed を使い始めたかと言うと、開発環境現状確認 によると2024年からのようだ。 そのころから高速・軽量で軽快な動作ではあったが、たまにリソースをもりもり食って 使用メモリが80GB とかになっていたので、最近はだいぶ安定している。

セットアップ #

Language Server の機能を使うための準備のはなし。

VSCode は拡張機能 Go を入れればOK。 表示されるダイアログをポチポチすれば gopls のインストールまでやってくれる。

Zed ではデフォルトで Go がサポートされているので拡張機能等は不要。 ただし、gopls は自分でインストールする必要がある。 go install golang.org/x/tools/gopls@latest で入るので、特に苦労することはなさそう。

Language Server 関連 UI 実装の違い #

ほぼほぼデファクトスタンダードになっている VSCode を比較対象として、Language Server の機能を利用する UI を見比べることで Zed の紹介をしよう、というのが今回の趣旨。

実際のエディタ上での動作をデモしながら紹介する内容だったのだが、LT でやるには段取りのツメが甘かった・・・。 どのコードを対象に機能を動かすか、はなんとなーくは決めていたものの、なんとなく過ぎてもたもたしてしまった。反省。 ちなみに当日デモ用に使っていたコードは terraform

以下の「操作方法」はデフォルトでのキーバインド。 Zed については Vim Mode を有効にした場合のキーバインドを併記している。 Cmd は Windows なら Ctrl に読み替えてほしい。

スクリーンショットは左が VSCode で 右が Zed。 VSCode は Go 拡張を入れただけの状態。 Zed は Vanilla。

Hover #

マウスカーソルを合わせるとシンボルの情報を表示するやつ。

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/hover.md

VSCode Zed
操作方法 マウスホバー, Cmd-K Cmd-I マウスホバー, Cmd-K Cmd-I, g h
UI Popover Popover
Hover

Zed はホバー表示中に Ctrl-u / Ctrl-d で表示をスクロールできる(要 Vim Mode 有効化)。 エディタを使っているときはできるだけキーボードから手を離したくないので、マウス無しでスクロールできる Zed は気が利いている。

VSCode には同様のアクションは用意されていない、はず。 ※ LT 中も「VSCode ではキーボードでスクロールできない」のようなことを喋ったが、調べてみると Hover 表示中にさらに Cmd-K Cmd-I で Hover 表示にフォーカスし、その状態であれば / でスクロールできた。

Find References #

シンボル使用箇所を表示するやつ。

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/references.md

VSCode Zed
操作方法 Shift-F12 Shift-F12, g A
UI Peek Multibuffer

VSCode は Shift-Option-F12 でサイドバーに表示することもできる。 Zed では Multibuffer 表示中に Outline Panel を表示すれば同等のことが可能。

Go to Implementation #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/implementation.md

interface の実装を表示するやつ。

VSCode Zed
操作方法 Cmd-F12 Shift-F12, g I
UI Peek Multibuffer

interface ではない型定義にカーソルを合わせて実行すれば、その型がどの interface を実装しているのかを一覧することも可能 (逆方向の参照ができるのは、今回資料を作るために調べているときに知った)。

そのほかよく使うやつ #

時間がなくて LT 中では流してしまったが、このあたりもよく使う。

Workspace Symbols #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/workspace/symbol.md

ワークスペース内のシンボル一覧を表示 & ジャンプする。 シンボルの種類、例えば「定数のみ」「interface のみ」のような絞り込みはできないようだ。 この場合はプロジェクト内を const のようなクエリで全文検索する必要がある。 惜しい。

Go to Definition #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/definition.md

シンボルの定義にジャンプする。 標準パッケージのソースコードにも飛べる。 ドキュメントだけではわからない挙動を確認する際に便利。

Go to Type Definition #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/typeDefinition.md

シンボルの型定義にジャンプする 次の操作を一回で済ませるイメージ。

  1. 変数で Go to Definition すると変数定義元にジャンプ
  2. 再度 Go to Definition すると型定義にジャンプ

Inlay Hint #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/inlayHint.md

引数や戻り値をコード中に表示する。 呼び出し側のコードで型名を確認できるのが便利。 表示だけで、カーソルを合わせたり編集したりすることはできない。

Zed の場合、デフォルトだと Ctrl+Shift で一時的に inlay hint の表示を消せる。

Rename #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/rename.md

シンボル名をリネームする。 参照元含めて、同じシンボル登場個所をすべて書き換えられる。 同名だが定義が異なるシンボルには影響がない。

Zed では、一時期この機能を使おうとするとそこそこの頻度でエラーが発生していた(どんなエラーだったかはうろ覚え)。 なので、リネームのためだけに VSCode を立ち上げていた思い出。 今では解消されていて、Zed 上で問題なくリネームできる。

Code Action #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/codeAction.md

現在行のコードに対するアクションを実行する。 modernize したり、package に切り出したり、いろいろ。

Document Formatting #

https://github.com/microsoft/language-server-protocol/blob/gh-pages/_specifications/lsp/3.18/language/formatting.md

コードをフォーマットする。 Go の場合は goimports 相当の処理が行われるみたい。

感想 & 反省 #

自分の LT については、冒頭でも書いたがデモをするには準備が甘かった。 時間キッチリで切られるスタイルではなかったので救われたが、テンポ悪目になってしまった。 あと、 LT にしてはテーマがぶれていた気がする。 Zed の推し機能をひたすら紹介する、とかでもよかったか。

他の人のはなし、特に社外の人の話を聞くと、自分は Go のことを全然知らないなーという気持ちになってやる気が出る。

前回に引き続き、今回も10人ちょいくらいの規模で、登壇の経験を積むにはちょうどいい。 近所で行きやすいので、今後も定期的に開催されてほしいところ。

前職の同僚にも久しぶりに会えてよかった。

懇親会の二次会?で行った石狩亭の、スタミナニンニクチャーシュー炒飯がめっちゃうまいらしいので、今度大船に行ったら食べよう。

おわり #

kamakura.go #10 は9月の後半頃に開かれる予定とのこと。 またお会いしましょう。

参考資料 #