emacs 28.1で導入された repeat-modeに関する調査

はじめに

最近まともに追っていなかったから存在さえ知らなかったのだけど、markdown-modeの issueでそういう機能があってどういうものかと使い方を調べてみた.

機能

特定のコマンドのグループを連続でお手軽に実行するための仕組み. 例えば移動系コマンドで次に移動が C-c n , 前に移動が C-c p みたいな場合毎回 C-c n, C-c pと叩くの面倒くさい。一方的に進む、戻るのであれば数値プレフィックスがあるが Vimのように数だけ押せばいいとわけじゃないし、進んだり戻ったりと繰り返したい場合などは使えない。そこで使えるのが repeat-moderepeat-modeを使って初回実行だけは C-c nだが以降は n, pでそれぞれ移動するということが実現できる.

myuheさんが作られた smartrep.elに近い.

sheephead.homelinux.org

使い方

  1. repeat-mode を有効にする
  2. キーマップを定義する
  3. 起点となるコマンドの 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でどうするかなというのを考えていきたいかな。