はじめに
最近Zedというエディタを使い始めました.
普段VsCodeでは,VsVimを使っており,jkを押下したらノーマルモードに移れるようにしています.Zedでも同様の設定をしようとしたら詰まったので備忘録として残しておきます.
結論
設定方法だけ知りたい人向け.
~/.config/zed/keymap.jsonに以下の内容をコピペします.
ただし,2025年11月現在はこの設定だとjから始まるローマ字が入力できないようです.他のキーマップを使うことを推奨します.
[
{
"context": "Editor && vim_mode == insert",
"bindings": {
"j k": "vim::NormalBefore"
}
}
]
最初に詰まった設定
Zedの公式ドキュメントのAction一覧曰く,vim::SwitchToNormalModeというActionがあるようです.とりあえずこれを使ってみました.
[
{
"context": "Editor && vim_mode == insert",
"bindings": {
"j k": "vim::SwitchToNormalMode"
}
}
]
ところが,ノーマルモードに移行したとき,カーソルが意図した位置より1つ右になってしまいます.Escを押した場合は意図通りの位置になります.
editor::MoveLeftというActionでカーソルを左に移動できるようなので,ノーマルモードに移行した直後,カーソルが左へ移動するようにしてみました.
"j k": ["vim::SwitchToNormalMode", "editor::MoveLeft"]
こちらもうまくいきませんでした.どうやらActionは1つしか設定できないようです.
GitHubの議論では,複数のActionを設定できる機能が追加されたものの,PRがマージされなかったと書かれていました.残念….
キーストローク送信
ZedのKeybidingsでは,複数のActionは設定できないですが,連続するキーストロークは設定できます.ドキュメントのRemapping Keysに詳しく書かれています.
KeybindのValueを配列として,1つ目に"workspace::SendKeystrokes"を,2つ目に所望のキーストロークを書けば,設定したキーストロークが機能します.
この機能を使って,Escキーが発動するようにすれば,jkキーでEscが発動するようになります.
ここでは1つのキーしか送信しませんでしたが,複数のキーストロークを送信することでより細かいカスタマイズができそうです.
"j k": ["workspace::SendKeystrokes", "escape"]
設定後しばらくは快適にコーディングできていました.しかし,日本語でjから始まるローマ字が打てなくなることに気づきました.jのみ別で処理されるのか,jのみアルファベットとして入力され2文字目以降がIMEに認識されるという挙動を示しました.
vim::NormalBefore
さらに調査を進めていると,GitHubのissueで,中国語入力で同じようなトラブルに遭遇している人を複数見つけました.このissueで見つけたのがvim::NormalBeforeという設定でした.~~issue投稿時の2025年4月では,この設定でも正常な入力ができていなかったようですが,11月現在ではjから始まる文字も入力できました.~~気の所為でした.11月現在もjから始まる文字の入力ができません.
ちなみに,vim::NormalBeforeは,カーソルを手前に移動しながらノーマルモードに移動するという最初求めていたものでした.長い長い遠回りでした.