ひょんなことからVSCodeのセットアップをしています。
Emacs化
まず、Awesome Emacs Keymapをインストールしたら、ほとんどのキーバインドがEmacsライクになりました。
「OptionキーではなくCommandキーをMetaキー(M-)として使いたい」という個人的に譲れない設定もチェックボックス1つで実現できました。すごい。
残りの(好みの)キーバインド設定はVSCodeのKeyboard Shortcutsの設定だけほぼほぼでできました(( Ctrl-t でターミナルをトグル表示とか))。
俺のEmacs化
さて、私としては(特殊な機能は置いておいても)コードを書くときに無意識に使うようなキーバインドはできるだけ実現したい、むしろかなり実現させたいと考えています。
その中でもEmacsでいう smartchr.el、sequential-command.el、key-chord.elによって実現されているキー操作を実現したい。
smartchr.elについては、すでに我らがEmacsヒーロー id:kiwanami さんが実現してくれています。
key-chord.el や sequential-command.el はちょっと(TypeScriptがほとんど書けない)私には*2難しいです。
ところで、VSCodeのKeyboard Shortcutsでは when 句を使うことで条件付きキーバインドが設定できるようです。
「これを使えば sequential-command.el を実現できないまでも sequential-command.el で実現していた seq-home や seq-end の動きは実現できそう」
と思いついたので、作ってみました。
ちなみに sequential-command.el の本来の機能は次のエントリをご覧ください。
Cursor Position Contexts
実現方法がすごいトリッキーなので、いろいろ説明を省きますが、カーソルの位置を when 句のコンテキストとして使えるようにするためのVS Code Extensionです。
先ほどの Awesome Emacs Keymap と合わせて使う場合、次のようなキーバインドを追加すると、ほぼほぼ seq-home、seq-end と同じようなカーソル移動が実現できます。
[ { "key": "ctrl+a", "command": "cursorTop", "when": "textInputFocus && config.cursor-position-contexts.cursorHome" }, { "key": "ctrl+e", "command": "cursorBottom", "when": "textInputFocus && config.cursor-position-contexts.cursorEnd" }, { "key": "ctrl+e", "command": "cursor-position-contexts.cursorReturn", "when": "config.cursor-position-contexts.cursorEnd && config.cursor-position-contexts.cursorBottom && textInputFocus" }, { "key": "ctrl+a", "command": "cursor-position-contexts.cursorReturn", "when": "config.cursor-position-contexts.cursorHome && config.cursor-position-contexts.cursorTop && textInputFocus" } ]
とりあえずこれで、Ctrl+aを押すたびに、ほぼ「(行のコード先頭->)行頭->ドキュメント先頭->元の場所」というような動きをします(細かい挙動がまだ実現できていません。元の場所に戻れなかったりします)。逆の挙動は Ctrl+e です。
config.* を設定値としてではなくコンテキストとして使っている時点でかなりトリッキーなのですが、まあ、挙動は満足いくものができました。
というわけで
これでコードを書いているときにあまりイライラしなくなったので、本格的に sequential-command.el をちゃんと実現してみようかなと思います(え?)。
key-chord.el は難しそうだな...
key-chord.el に頼りきっているキーバインド構成とか、一生他のエディタに移れなそう
— k1LoW (@k1LoW) 2024年12月7日
以上、エディタ設定の現場からでした。