結論から言うと Zed は今のところ Good です。
慣れの問題かもしれませんが、編集能力は Emacs にはまだ及ばないと感じますが、
とにかく起動と操作が早く、クラッシュなどせず堅牢性を感じます。
背景
10 年以上 Emacs を利用していたのですが、ふと思い立って別のエディタにしようと思いました。
調べてみると Zed が良さそうということで Zed を利用してみることにしました。
Zed の使い方自体は https://zed.dev/docs/ がよくまとまってるので、使い方自体はこれを読めば大体 OK でした。
課題
先に断っておきますが、これは私の Emacs の使い方に非があり、Emacs 自身に全く非はありません。Emacs は現在も最高のエディタだと思ってます。
ただ、自分の使い方においては下記の課題を感じておりました。
- 起動が遅い
- 過去 https://emacs-jp.github.io/tips/startup-optimization を参考に起動時間を 1 秒以下にはできたのですが、今測ってみると 4.3 秒…
- 一度短くしてもパッケージとか入れてくと伸びちゃう部分があるのかも
- 操作が遅い
- lsp-mode を使うとファイルを開くのが遅いときがある
- いろいろパッケージを入れているせいかもしれない
- たまにクラッシュする
- 普通に利用しているときも落ちることがある
- native compile を入れてから増えた気がする(気のせいかも)
- AI との連携
- https://github.com/manzaltu/claude-code-ide.el を愛用していた
- ただ、差分を見るときの表現力と操作感が Ediff だと限界に感じた
Zed を使ってみて
Emacsユーザーである筆者が感じた Zed を使ってみた感想を列挙します。
キーバインド
せっかくならキーバインドも default に…とは思いましたが、いきなりはちょっと難しかったです。
ありがたいことに Emacs の keymap が存在していますが、残念ながらちょっと不足しているように感じます。
下記の discussion を参考に、自分の設定を入れてみましょう。
keymap を設定するときはコマンドパレットで dev: open key context view を Keyboard Context を見ながら設定すると便利です。
また action::Sequence が便利で、マクロのように複数のアクションを連続して実行することができるので設定には必須だと思います。
入れると良かったkeymap
一点、Emacs 特有?の問題があるので、自身の keymap ファイル上でも下記のワークアラウンドを入れておいた方が良いかと思います。
set mark 後に、コピーなどのアクションをとった後、mark が外れないのが不満だったのですが、下記の keymap を入れることで回避できました。
{
"context": "Editor && selection_mode",
"bindings": {
// Copy and cancel selection
"cmd-w": ["action::Sequence", ["editor::Copy", "editor::Cancel"]],
"alt-w": ["action::Sequence", ["editor::Copy", "editor::Cancel"]],
...他必要なものに
}
逆に選択する系の keymap で mark されないのもちょっと不満だったので set markするようにしてます。
{
"context": "Editor",
"bindings": {
"ctrl-x h": ["action::Sequence", ["editor::SetMark", "editor::SelectAll"]],
},
},
あとは検索などを開始する際に Outline Panel が立ち上がるようになってると便利です。
{
"context": "Editor",
"bindings": {
"ctrl-s": ["action::Sequence", ["outline_panel::ToggleFocus", "buffer_search::Deploy"]],
},
},
検索
Zed では高速に文字検索、プロジェクト検索ができ、occur 的なこともできるのですが、そのままだと視認性が低いというか Helm や Consult などでできるマッチしたもの一覧の表示ができません。
こういうときに Outline Pane を開いてあげると、マッチしたものの一覧が見れるので便利です。
カスタマイズ
Emacs では当然できた オレオレ lisp での便利ツールなどの開発ですが、Zed だとだいぶ機能が制限されています。
Zed でカスタマイズとして作成できるのは 下記に列挙しているものだけで、Emacs ほど自由度は高くありません。
ただ、task と言う機能があり、shell script は task: spawn から簡単に呼び出すことができます。(キーバインドに割り当てることもできます。)
なので自分は elisp で書いた必要なものは AI などにお願いして task (shell script) に移行してもらいました。
Git
当然 Zed では Magit が使えません!
Zed でも Git の操作はできるようなパネルがあるのですが、ログなどが見れないなど機能が足りていないなと感じます。
この点は下記の対策を入れてカバーしてます。
キーバインドを Magit 風にする
下記のキーバインド設定を入れてます。長くなっちゃうので折りたたんでます。
Magit 風のキーバインド
{
"context": "GitPanel && ChangesList",
"bindings": {
// Navigation (Magit: n/p)
"n": "menu::SelectNext",
"p": "menu::SelectPrevious",
"ctrl-n": "menu::SelectNext",
"ctrl-p": "menu::SelectPrevious",
// Stage/Unstage (Magit: s/u)
"s": "git::StageFile",
"u": "git::UnstageFile",
"space": "git::ToggleStaged",
"shift-space": "git::StageRange",
// View diff (Magit: tab or enter)
"ctrl-m": "menu::Confirm",
// Discard changes (Magit: k)
"k": ["git::RestoreFile", { "skip_prompt": false }],
"backspace": ["git::RestoreFile", { "skip_prompt": false }],
// Commit (Magit: c c)
"c c": "git::Commit",
"c a": "git::Amend",
// Push (Magit: P p / P e for force)
"shift-p p": "git::Push",
"shift-p f shift-p": "git::ForcePush",
// Pull (Magit: F p / F r for rebase)
"shift-f p": "git::Pull",
"shift-f shift-p": "git::Pull",
"shift-f r": "git::PullRebase",
"shift-f shift-r": "git::PullRebase",
// Fetch (Magit: f a for all)
"f a": "git::Fetch",
"f f": "git::Fetch",
// Diff (Magit: d d)
"d d": "git::Diff",
// Stage/Unstage all (Magit: S/U)
"shift-s": "git::StageAll",
"shift-u": "git::UnstageAll",
// Discard all (Magit: x)
"x": "git::RestoreTrackedFiles",
"shift-x": "git::TrashUntrackedFiles",
// Refresh (Magit: g)
"g": "git::Fetch",
// Panel shortcuts
"cmd-s": "workspace::ToggleLeftDock"
}
},
{
"context": "CommitEditor > Editor",
"bindings": {
// Emacs-like enter for newline
"ctrl-m": "editor::Newline",
"ctrl-c ctrl-c": "git::Commit",
"ctrl-c ctrl-a": "git::Amend",
// AI commit message generation
"ctrl-c ctrl-i": "git::GenerateCommitMessage"
}
},
{
"context": "GitCommit > Editor",
"bindings": {
"ctrl-m": "editor::Newline",
"ctrl-c ctrl-c": "git::Commit",
"ctrl-c ctrl-a": "git::Amend",
"ctrl-c ctrl-i": "git::GenerateCommitMessage"
}
},
{
"context": "GitDiff > Editor",
"bindings": {
"cmd-k": "git::Restore",
"cmd-shift-s": "git::ToggleStaged",
"ctrl-m": "git::OpenModifiedFiles",
"ctrl-c ctrl-c": "git::Commit"
}
}
Magit 風の TUI を使う
基本的な開発は Zed の Git Panel で完結できるのですが、ログを確認したり、インタラクティブな rebase をしたりしたいときは Magit が恋しくなります。
そういうときは、Zed 内の terminal 上で下記を使ってます。
vim キーバインドなのが気になりますが、magit お馴染みの instant fixup なども利用でき便利です。
git-timemachine 風の TUI を使う
差分の調査をしたいときに、git-timemachine のパッケージが好きで結構利用するのですが、Zed にはそのような機能がありません。
これは調べても似たような TUI ツールはなかったので Claude くんにお願いして作ってもらいました。
macの方は下記でインストールできます
brew install hyakt/tap/git-delorean
gitu と同じく Zed 内の terminal 上で使ってます。
diff 表示に side-by-side がない
欲しいので、vote お願いします!
org-mode
なんと Zed では org-mode が使えません!
ですが、tree-sitter 拡張はあるので、色付けはできます。
feature request はあるので期待ですね。vote しましょう。
AI
基本めっちゃ良いです。
Emacs ではなかなか難しかった、AI フレンドリーな操作 (差分表示とか) ができるようになっています。
Zed には 2 種類?AI と対話する方法があって、
1 つ目は Zed のクライアント を使う方法、
2 つ目は Agent Client Protocol (ACP) を使う方法です。
1 つ目の Zed のクライアントを使う方法は、Emacs で gptel を使うようなもので、API を通じて AI Agent とやりとりすることができます。
これ、よくできていて Zed に馴染んだ方法で AI Agent を利用することができます。
2 つ目の ACP を利用する方法は、直接 Claude Code などの CLI ツールに近い状態で Agent を利用でき、Claude Code Pro などのサブスクリプション経由でも利用することができます。
これもよくできてはいるのですが、最近できたっぽく、resume などの機能や CLI ツール特有の機能 (Claude Code の skills とか) はまだないので、今後に期待です。
おわりに
そもそも、単なるテキストエディタ から プロジェクト単位で開発を進める IDE に移ったというメンタルモデル的なギャップがありました。
別のプロジェクトのファイルを開きたいときに OS のファイラーを呼び出す必要があったり。
ただ、本当に起動や操作が早くて、これが最近のエディターか…と言う体験ができるのでぜひ試してみてください。
私はこのまま Zed を続けて、どーしても我慢できない事柄があったらまた Emacs に戻ろうかなと思ってます。