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-.
のキーバインドが使えます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/253a3259-82f3-4cab-98d3-4d63b095eb02/material.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=3c612e045f4fbb6cea58003c87449d1f0880c74dde1b9addf832de053e6ee933&X-Amz-SignedHeaders=host&x-id=GetObject)
iTerm2のキー設定
iTerm2を開いて、上のメニューから「iTerm2」から「Preferences...」を選びます。「Keys」を選び、+ボタンを押します。
![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/40e897c3-b6fd-43f0-9cf2-a679b2cf0630/addnewkey.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=21d6bca0df6812c663f90ee53dcb1dd5e855a23d01185b9e35d32e30f23fdb7c&X-Amz-SignedHeaders=host&x-id=GetObject)
試しに
C-.
を追加します。「keyboard shortcut」のフィールドがアクティブな状態で control + .
を打ち込みます。打ち込むと^.
になります。プルダウンメニューから「Send Hex Code」を選びます。新しく出てきたテキストフィールドに以下を記述します。18 40 63 2e
![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/b2a6b64c-460b-4e04-b3ab-b56ba3c344cc/controldot.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=70a8bfed1236c6c774dab4a56c0c30c8fb71306337abe01ac68b6e32e1e09a9c&X-Amz-SignedHeaders=host&x-id=GetObject)
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 + >
で登録します。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/e4fc658e-7ddb-47f8-b219-b443721bdecb/mymap.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=9f28cd56ae5c0d4f2bc41b47fb0409f22179b1493425b7c6687205075d2e0a5a&X-Amz-SignedHeaders=host&x-id=GetObject)
上の画像を見てもわかる様に、違っているのは最後の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-.
を実行しすると、エコーエリアにファイル名が表示されます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/45f097d3-4562-4ba6-887e-3678ab071582/showfilename.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=254fbe8672af87ee3f130c2b28b547457906faa769d00913dbc735a167dfc04d&X-Amz-SignedHeaders=host&x-id=GetObject)
キーボードで入力した
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
![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/51203da5-5d59-4424-860c-fd28fec33293/csf.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=2a1e2cc231fb3f9e72f50d584f70080800090e8c5463b88bdfb48b0cc6ab3e07&X-Amz-SignedHeaders=host&x-id=GetObject)
動作確認で、上で作った
show-file-name
をC-s-f
にバインドします。(global-set-key (kbd "C-s-f") 'show-file-name)
![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/376a22fa-e8da-4d69-ad7c-3cf764b73a06/shifter.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T133157Z&X-Amz-Expires=3600&X-Amz-Signature=fefa1a79df910c7d824cdd6319f7293470f72dd9b662d6f48bda749299d1e3e2&X-Amz-SignedHeaders=host&x-id=GetObject)
上の画像は
C-h k
でC-s-f
をタイプしてcontrol + Shift + f
がC-s-f
として処理されているのを確認しています。まとめ
この方法でより多くのショートカットキーを簡単なキーバインドで定義できるようになりました。emacsを使った素早いコーディングが可能になりますね。
![profile image](/prof.jpg)
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。