2023年3月28日
iTerm2上のemacsは基本的に
control + 記号
のキーバインドが使えません。
詳しいことはこちらの記事に書かれています。どうやらコントロールキーが制御できるASCIIの範囲が決まっているからっぽいです。
もう1つのC-S-アルファベットキーが使えないのは別の問題でCUI版のemacsでは使えません。例えば
C-v
キーバインドもC-S-v
キーバインドもemacsには同じC-v
として処理されてしまうからです。さまざまなサイトを閲覧してどうにかこの2つのバインドに対処したので紹介します。
こちらの記事を参考にさせてもらいました。元サイトが壊れていたのでgoogleのキャッシュを参照しています。
Control + 記号キーバインド
iTerm2では直接
control + 記号
のキーバインドは打てません。そこで、emacsのevent-apply-controll-modifier
を使ってあたかもcontrol + 記号
を打ったようにします。たとえばC-x @ c
を押してからr
を押すと、C-r
を押したのと同じことになります。これを使えば記号を含めたキーバインドが可能になります。
C-.
を実現するならC-x @ c .
とすれば実行できます。毎回
C-x @ c .
と入力するのは大変なので、iTerm2のグローバルショートカットキーでHexコード送信を割り当てて、C-.
と打ったらemacsにはC-x @ c .
を送信すれば、C-.
のキーバインドが使えます。iTerm2のキー設定
iTerm2を開いて、上のメニューから「iTerm2」から「Preferences...」を選びます。「Keys」を選び、+ボタンを押します。
試しに
C-.
を追加します。「keyboard shortcut」のフィールドがアクティブな状態で control + .
を打ち込みます。打ち込むと^.
になります。プルダウンメニューから「Send Hex Code」を選びます。新しく出てきたテキストフィールドに以下を記述します。18 40 63 2e
18 40 63 2e
Hex codeはこの様に対応しいて、C-x @ c .
を表しています。18 = C-x
40 = @
63 = c
2e = .
その他のキーバインドは以下の様になっています。
ショートカットキー Hex code
C-, 18 40 63 2c
C-. 18 40 63 2e
C-: 18 40 63 3a
C-; 18 40 63 3b
C-< 18 40 63 3c
C-> 18 40 63 3e
例外的に、
C-<
はControl + Shift + <
でC->
はControl + Shift + >
で登録します。上の画像を見てもわかる様に、違っているのは最後のhex codeだけです。
他にも
C-(
やC-/
を割り当てたい方は以下のサイトの表から16進数のhex codeを参照してください。emacsで記号文字キーバインドを割り当てる
試しに、先ほど設定したC-.にキーバインドを割り当てます。
ファイルのパスを表示する関数を作りショートカットを割り当ています。
emacsの設定ファイルを開きます。
emacs ~/.emacs.d/init.el
以下を書き込みます。
(defun show-file-name ()
"Show the full path file name in the minibuffer."
(interactive)
(message (buffer-file-name)))
(global-set-key (kbd "C-.") 'show-file-name)
保存して、設定ファイルを再読み込みします。
M-x eval-buffer
ファイル名を表示する
C-.
を実行しすると、エコーエリアにファイル名が表示されます。キーボードで入力した
C-.
がiTerm2でC-x @ c .
に変換されemacs上でキーバインドが機能したことをあらわしています。Control + Shift +アルファベットバインド
最初にも書いたように、
C-S-f
みたいなシフトを使ったキーバインドはCUI版のemacsではC-f
と処理されてしまいます。shiftキーを別のバインドとして使うにはトリックが必要です。event-apply-control-super-modifier
関数を作成し、event-apply-shift-modifier
を上書きして、iTerm2の入力はC-S-f
になりますがemacs内部ではC-s-f
として処理させます。C-s-f
はControl + super + fを表しており、スーパーキーを押しているという体に変換します。とりあえず、
C-s-f
を利用できるようにします。init.el
に独自に作成したevent-apply-control-super-modifier
関数を加えます。作成した関数でevent-apply-shift-modifier
を上書きします。本来はC-x @ S
でevent-apply-shift-modifier
が処理するところをcontrol + super
にしてしまいます。(defun event-apply-control-super-modifier (ignore-prompt)
"\\\\Add the Control+Shift modifier to the following event.
For example, type \\\\[event-apply-control-shift-modifier] SPC to enter Control-Shift-SPC."
(vector (event-apply-modifier
(event-apply-modifier (read-event) 'control 26 "C-")
'super 23 "s-")))
(define-key function-key-map (kbd "C-x @ S") 'event-apply-control-super-modifier)
ちなみに上のコードの
super 23 "s-"
はここを参照しています。Emacs側で
C-s-f
を使う準備が整いました。iTerm2で記号のキーバインドでやったようにHexコードを送る設定を加えます。18 40 53 66
Hex codeはこの様に対応しいて、C-x @ S f
を表しています。18 = C-x
40 = @
53 = S
66 = f
動作確認で、上で作った
show-file-name
をC-s-f
にバインドします。(global-set-key (kbd "C-s-f") 'show-file-name)
上の画像は
C-h k
でC-s-f
をタイプしてcontrol + Shift + f
がC-s-f
として処理されているのを確認しています。まとめ
この方法でより多くのショートカットキーを簡単なキーバインドで定義できるようになりました。emacsを使った素早いコーディングが可能になりますね。
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。