2024年10月28日月曜日

WezTerm 上の Vim で ALT 系のマッピングを使いたい

この記事は Vim 駅伝 の 2024/10/28 の記事です。 前回の記事は staticWagomU さんによる、 2024/10/25 の「個人的にいいと思うVim_Neovimの始め方」という記事でした。

次回は 2024/10/30 に投稿される予定です。

この記事はなに?

急に wsltty が使えなくなり、復旧もできない状態になってしまった。

そのため、代替ターミナルアプリを探していたところ、 「ほとんどのターミナルアプリでは <ALT-*><C-.> が効かない」 という事がわかり絶望した。 (VSCode 互換マッピングとして、<A-S-f><C-.> を使っていた)

そんな中、kuuote さんから「WezTerm ならキーバインディングの設定でできるよ」と 教えていただき、無事 <ALT-f><C-.> のマッピングを呼び出すことに成功したので何をやったか書いていく。

結論

以下設定を .wezterm.lua に設定することで行けた。

config.keys = {
  { -- <C-.>
    key=".",
    mods="CTRL",
    action=wezterm.action.SendString('\x1b[46;5u')
  },
  { -- <A-S-F> ( `F` の 8 bit 目を 1 にした文字を送信)
    key="F",
    mods="META|SHIFT",
    action=wezterm.action.SendString('Æ')
  }
}

<C-.> のマッピング

showkey -a で出力された文字列を SendString で送信することで、 Vim にキーコードが届けられる。 こちらも kuuote さんから教えていただきました。ありがとうございます。

<A-S-f> のマッピング

コメントにも書いてありますが、こちらは「F の 8 bit 目を 1 にした文字を送信」することで、 Vim に「Alt と F が同時押しされましたよ」と伝えられる。

以下引用のように、 Vim では「文字の 8 bit 目が 1 の時に Alt と同時押しされていると認識する」ようになっている。

初期設定では、ALT キーが押されているときは、文字の 8 ビット目が設定されるもの と仮定しています。xterm、aterm、rxvt など、ほとんどの端末はこの方法で問題あり ません。<A-k> のようなマップが動作しない場合は、その端末が、文字の前に ESC を 付けているのかもしれません。

1.10 ALT キーを使ったマップ - map - Vim日本語ドキュメント より

ほとんどのターミナルアプリ(GNOME Terminal, Windows Terminal, WezTerm, mintty など)は、 「文字の前に ESC を付ける」事で ALT と同時押しを表現しているため、これらの端末を使っている場合、 ALT 系のマッピングを処理できない。

今回は F にマッピングしたかったので F の文字コード 70 (0100 0110) の 8 bit 目を 1 にした Æ (文字コード 198(1100 0110)) を送信している。

現状

WezTerm にこの設定を行うことで、現状のマッピングで困ることはあまりなく快適にコーディングできている。

このまま wsltty の復旧がかなわなければ、 WezTerm を使っていくことになるだろう。

以上。

参考資料

0 件のコメント:

コメントを投稿