🐷
Alacrittyで複数の修飾キーを識別させる
動機
自分はエディタにneovimを使っているのですが、<cr>と<s-cr>にそれぞれ別のコマンドを割り当てています
<cr>はneovim上でリターンキーのことです<s-cr>はシフトとリターンキーの同時押し
ところがAlacrittyは、デフォルトではこれら二つを区別してくれません</br>
ではどのようにすれば区別してくれるのか、を書き留めておきます
あと、CSIに詳しいニキはマサカリ投擲してください
neovim詳しいニキも自分の設定に色々ダメだしおなしゃす
結論
alacritty.toml
[keyboard]
bindings = [
{ key = "Enter", mods = "Shift", chars = "\u001b[13;2u" },
]
alacritty.ymlを使用している場合
alacritty.yml
key_bindings:
- { key: Enter, mods: Shift, chars: "\x1b[13;2u" }
charsの部分を"\x1b[13;2u"にしても設定できます
大まかな解説
まずターミナル上で普通の文字を入力すると
その文字のユニコード が入力されます
修飾キーが押されている場合、どのキーが押されているかはCSIというルールに則って区別します
CSI <文字のユニコード>;<修飾キーのパラメータ>u
例えばコントロールキーとfを同時押ししたとしましょう
この時、fのユニコードは102、コントロールキーのパラメータは
| shift | alt | ctrl |
|---|---|---|
| +1 | +2 | +4 |
となっています 修飾キーのパラメータは初期値(何も修飾キーを押してない状態)が1なので、最終的に
CSI 102;5u
となります 同様に、<cr>のユニコードは13なので<s-cr>をCSIルールで表すと
CSI 13;2u
となります
次にこの情報をAlacrittyに渡すことができれば<cr>と<s-cr>を区別してくれそうです。
CSIルールの表現であることを示すにはCSI ~;~uのCSIの部分を\x1b[に置き換える必要があります 従って
alacritty.toml
[keyboard]
bindings={
{ key = "Enter", mods = "Shift", chars = "\x1b[13;2u" },
}
とすれば完了..のはずなんですが、このように記述するとAlacrittyがエラーを吐きます(Alacrittyの設定にymlを使用している場合はこれで問題ありません)
なんでも、\x1bはエスケーブシーケンスとしてサポートされていないそうです
なので、代わりに\u001bを使います
alacritty.toml
[keyboard]
bindings = [
{ key = "Enter", mods = "Shift", chars = "\u001b[13;2u" },
]
参考文献
Discussion