以下の内容はhttps://k1low.hatenablog.com/entry/2025/01/24/083000より取得しました。


VSCode上でsequential-command(-config).elのseq-homeとseq-endをできるだけ再現する

ひょんなことからVSCodeのセットアップをしています。

Emacs

私のメインエディタはEmacsです*1

なので、キーバインドを慣れているEmacsにしていきます。

まず、Awesome Emacs Keymapをインストールしたら、ほとんどのキーバインドEmacsライクになりました。

marketplace.visualstudio.com

「OptionキーではなくCommandキーをMetaキー(M-)として使いたい」という個人的に譲れない設定もチェックボックス1つで実現できました。すごい。

残りの(好みの)キーバインド設定はVSCodeのKeyboard Shortcutsの設定だけほぼほぼでできました(( Ctrl-t でターミナルをトグル表示とか))。

俺のEmacs

さて、私としては(特殊な機能は置いておいても)コードを書くときに無意識に使うようなキーバインドはできるだけ実現したい、むしろかなり実現させたいと考えています。

その中でもEmacsでいう smartchr.elsequential-command.elkey-chord.elによって実現されているキー操作を実現したい。

smartchr.elについては、すでに我らがEmacsヒーロー id:kiwanami さんが実現してくれています。

marketplace.visualstudio.com

key-chord.el や sequential-command.el はちょっと(TypeScriptがほとんど書けない)私には*2難しいです。

ところで、VSCodeのKeyboard Shortcutsでは when 句を使うことで条件付きキーバインドが設定できるようです。

「これを使えば sequential-command.el を実現できないまでも sequential-command.el で実現していた seq-homeseq-end の動きは実現できそう」

sequential-command/sequential-command-config.el at a48cbcbe273b33edd3ae56e68f44b4100fa3a48a · rubikitch/sequential-command · GitHub

と思いついたので、作ってみました。

ちなみに sequential-command.el の本来の機能は次のエントリをご覧ください。

rubikitch.hatenadiary.org

Cursor Position Contexts

marketplace.visualstudio.com

実現方法がすごいトリッキーなので、いろいろ説明を省きますが、カーソルの位置を when 句のコンテキストとして使えるようにするためのVS Code Extensionです。

先ほどの Awesome Emacs Keymap と合わせて使う場合、次のようなキーバインドを追加すると、ほぼほぼ seq-homeseq-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 は難しそうだな...

以上、エディタ設定の現場からでした。

*1:これからもEmacsの予定です

*2:まだ




以上の内容はhttps://k1low.hatenablog.com/entry/2025/01/24/083000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14