emacs 28.1で導入された repeat-modeに関する調査
はじめに
最近まともに追っていなかったから存在さえ知らなかったのだけど、markdown-modeの issueでそういう機能があってどういうものかと使い方を調べてみた.
機能
特定のコマンドのグループを連続でお手軽に実行するための仕組み. 例えば移動系コマンドで次に移動が C-c n
, 前に移動が C-c p
みたいな場合毎回 C-c n
, C-c p
と叩くの面倒くさい。一方的に進む、戻るのであれば数値プレフィックスがあるが Vimのように数だけ押せばいいとわけじゃないし、進んだり戻ったりと繰り返したい場合などは使えない。そこで使えるのが repeat-mode
。repeat-mode
を使って初回実行だけは C-c n
だが以降は n
, p
でそれぞれ移動するということが実現できる.
myuheさんが作られた smartrep.elに近い.
使い方
repeat-mode
を有効にする- キーマップを定義する
- 起点となるコマンドの
repeat-map
属性に定義した keymapを設定する
repeat-mode
を有効にする
;; global minor modeです (repeat-mode +1)
グループで使いたいコマンド郡のキーマップを定義する
(defvar git-gutter-repeat-map (let ((map (make-sparse-keymap))) (define-key map (kbd "n") 'git-gutter:next-hunk) (define-key map (kbd "p") 'git-gutter:previous-hunk) map))
コマンドの repeat-map
属性を設定する
(put 'git-gutter:next-hunk 'repeat-map 'git-gutter-repeat-map) (put 'git-gutter:previous-hunk 'repeat-map 'git-gutter-repeat-map)
実行例
repeat-mode起点となるコマンドを実行すると minibufferに
Repeat with` と表示され, 該当するキーマップが有効になる.
おわりに
導入されたばかりということもあってか標準パッケージではほとんど使われておらずごく一部のモードで使われていませんでした。標準ライブラリで汎用的な機能を提供してくれるのはありがたいけど、どのコマンドをグルーピングするかとかは好みによるところもありそうなのでライブラリ側で設定すべきなのか個人で設定すべきなのかまだよくわかっていない。個人で設定する場合は smartrepなどに比べるとコード量が多くそれほど良いものではないのかなという気もしている。今後の使われ方を見て markdown-modeでどうするかなというのを考えていきたいかな。