ターミナルのEmacsでも特殊キーコンボ

投稿者: | 2012年1月2日

XやWindowsやCocoa上のEmacsでは、Control+ReturnだろうがControl+,だろうがCtrl+Shift+Spaceだろうが、好きな機能を割り当てることができる。これらのGUI環境ではアプリケーションが検出できる修飾キーの組合せに制約がほとんどないためだ。

ところが、ターミナル(エミュレータ)上では原則として一つのキー入力は一つのASCIIコードとしてアプリケーションに渡されるため、上記のように対応するASCIIコードのないキーの組合せはEmacsなどでそれとして認識することができない。Meta+XEscape Xの二ストロークに置換する仕掛けがせいぜいだ。

…と思いきや、実はEmacsにはいわゆるスティッキー修飾キーに相当するevent-apply-*-modifierというギミック的関数が用意されており、たとえばC-x @ cevent-apply-control-modifier)と押してからRETを押すと、C-RETを押したのと同じことになる。つまり、たとえばiTermであればPreferences→Keys→Global Shortcut Keysで+を押し、

Shortcut Keyboard: ^↩
Action: Send Hex Code
18 40 63 0d

のように設定すれば、EmacsでC-RETが効くようになる。もちろん、「18 40 63 0d」とはC-x @ c RETをASCIIコードに置き換えたものだ。C-,なども同様に設定すればいい。

ところが、C-S-SPCのような組合せはすんなりとはいかない。CS-SPCに分解してみても、依然としてS-SPCにはASCIIコードがないのだ。CSSPCに分解しようと思っても、event-apply-*-modifierは直後の一ストロークに作用するので、C-x @ c C-x @ s SPCC-x @ cの効用は直後のC-xに食われ、そこで連鎖が終了してしまう。ならばとSC-SPCに分解してみても、C-SPCはASCIIコードでは00すなわちC-@であるため、C-S-@という組合せになってC-S-SPCとは認識されない。(ところでinput-decode-mapkey-translation-mapを使う別解もあるが、ここでは詳しくは触れない)

解決策としては、「スティッキーControl+Shiftキー」を自作すれば良い。つまり、こんな関数を作り:

次のような設定を加える。

Shortcut Keyboard: ^⇧Space
Action: Send Hex Code
18 40 43 20

同様に、たくさん使いたいquery-replace-regexp(正規表現による文字列置換)はEmacsの標準ではC-M-%などというターミナル住民にとっては鬼畜なキーに割り当てられているわけだが、これも次のような関数を作り:

下のようなキー設定を加えれば良い。

Shortcut Keyboard: ^⌥⇧%
Action: Send Hex Code
18 40 4d 25

世の中、カビくさい道具であってもやりようはあるもんです。どんなところでも、妥協せずに使えるものを何でも使って自らを足らしむる。それがハック。

追記:zshもマルチストロークのキーバインディングに対応しているので、たとえば上記のように設定したC-RETに機能を割り当てるには

でOK。(上記はC-RETRETと同じにする設定)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です