Zedを試す
プラットフォームチームの菅原です。
これはカンムアドベントカレンダー2025の7日目の記事です。
普段、VSCodeをメインのエディタとして使っているのですが、最近は動作が遅いことが少し気になっていました。
大きめのプロジェクトで補完に時間がかかるのは半ば諦めているのですが、困るのはファイルを保存する際にformatOnSaveで「フォーマッタを実行しています」というダイアログが出て保存に時間がかかることです。

保存されたつもりでterraform planなどを実行したらエラーが出て、エディタを見たら実はまだ保存中…、最悪の場合はそのまま応答が返らずVSCodeを再起動することしばしばありました。
もう少し速いGUIエディタが欲しい…ということで、ちまたで「速い」と噂になっているRust製エディタZedを試してみることにしました。

Zedの良いところ
速い
評判通り速いです。起動は一瞬でサクサク動きます。
formatOnSaveでもたつくこともありません。
VSCodeから移行しやすい
設定やキーバインドが似ているので特に調べなくてもすぐに移行できました。
個人的にはエクスプローラーを右側に配置する設定があるのが助かりました。
VSCodeからのマイグレーションガイドもあります。
Multibuffers
Multibuffersという一つのタブで複数のファイルを部分的に開く機能が便利でした。

上の例の場合、単純に検索結果を一つのタブに表示しているだけではなく、そのまま編集までできるので、置換機能を使わなくてもマルチカーソルで選択して複数ファイルを一気に書き換えることが可能です。
AIエージェント
ZedのホストするAI、またはサードパーティのAPIキーが使えます。
環境変数GEMINI_API_KEYを設定しておくと自動的にGeminiが使えるようになっていました。

基本的な拡張機能はそろっている
さすがにVSCodeほど多くないのですが基本的な拡張機能はそろっており、普段使っているGo、Terraformの拡張もあったので通常の作業に困ることはなかったです。

気になったところ
!=が≠になる
いきなり細かいですが、デフォルトでは!=が≠として表示されます。

可読性のためだと思うのですが、最初に見たときはぎょっとしました。
以下の設定で無効にできます。
{
"buffer_font_features": {
"calt": false
}
}
Language Serverの応答
エディタの外なので当然な気はしますが、Language Serverの応答が速くなった感じはないです。
大きめのterraformプロジェクトを開いて補完しようとすると、初回は数秒待たされます。
VSCodeのように待ち時間に「読み込んでいます…」の表示があると、もう少し体験が良い気がしました。
Word based suggestions
VSCodeだとプレーンテキストでもWord based suggestionsが効くのですが、Zedで同様の機能を見つけることができませんでした(プレーンテキスト用のLangugae Serverは使えるようです cf.)

VSCodeのWord based suggestions
Langugae Serverを使えない場合(雑なRubyスクリプトの編集など)、Word based suggestionsにフォールバックできないため補完機能が全く使えなくて不便でした。
拡張機能の自由度が低い
これが一番困ったのですが、Zedの拡張機能はVSCodeほど自由度が高くなく、できることが限られます。実装できる機能は以下の通りです。
- Languages
- Debuggers
- Themes
- Icon Themes
- Slash Commands
- MCP Servers
VSCodeでは拡張機能を自作しており、Zedに移植できるだろうと践んでいたのですが、Zedでは拡張機能でエディタの内容を操作したり、ワークスペースをリロードしたりすることはできないようです。
また、普段から多用しているOpen In GitHubという拡張機能も、同様の機能をZedの拡張機能で実現することは難しそうでした。
拡張機能の代わりにTasksを使う
制限された拡張機能の代わり…という訳ではないのでしょうが、ZedにはTasksという機能があり、エディタから外部コマンドを呼び出すことができます。
タスクにはZedで開いているファイルの名前や行番号を環境変数経由で渡すことができるので、前述のOpen In GitHubのような動作をするタスクを作ることができます。
まずワークスペースのファイル名・行番号からGitHubを開くスクリプトを用意して、パスの通ったディレクトリに置きます。
#!/usr/bin/env ruby
hash = `git show --format='%H' --no-patch`.chomp
remote_url = `git config --get remote.origin.url`.chomp
remote_url = remote_url.sub(%r|\Assh://git@|, 'https://').sub(/\.git\z/, '')
# https://zed.dev/docs/tasks#variables
filename = ENV.fetch('ZED_RELATIVE_FILE')
line_num = ENV.fetch('ZED_ROW')
url = File.join(remote_url, 'blob', hash, filename, "#L#{line_num}")
system('open', url)
つぎにopen-in-github.rbを呼び出すタスクを定義します。
[
{
"label": "Open In GitHub",
"command": "open-in-github.rb",
"use_new_terminal": false,
"reveal": "never",
"hide": "on_success",
"shell": "system",
"show_summary": false,
"show_command": false
}
]
これでZedで開いているファイルからGitHub上のWebページを開くことができるようになります。

…と思ったんですが、別のタブのファイルを開いていますね…。どうも履歴からtask:spawnを実行すると以前の環境変数を渡す振る舞いのようです。うーん…
VSCodeから移行できたか?
拡張機能の件がネックになって、今のところVSCodeとZedを行ったり来たりしていてまだ手になじんだ感覚はないです。Tasksが使えるとはいえ、普段使いのいくつかの拡張機能が使えなくなるのはやや厳しいなぁという感じです。
まだまだ使い始めたばかりでそのうち慣れるかもしれませんし、Zedもなんだかんだと大きい変更があるので拡張機能の自由度が上がることに期待して、もう少し頑張ってみようかと思っています。
Discussion