easy-repeat 20150516.148(in MELPA)
Repeat easily

概要

<2015-05-02 Sat> に登録された新入りです。

たとえば、複数のウィンドウに分割されている状態で
C-x oを連続してウィンドウを選択するのは面倒です。

この問題に対処するために
ace-window.el(レビュー) とか
switch-window.el(レビュー) とか
もっと強力なwin-switch.el(レビュー) などがあります。

smartrep.elやhydra.el(比較レビュー) を使えば
プレフィクスキーを省略できるようになり、
C-x o o ...と操作できるようになります。

この easy-repeat.el は、smartrep/hydraよりもシンプルで、
指定されたコマンドの最後のキーで繰り返せるようにしています。

C-x oの後にoを押せば other-window を繰り返せます。

smartrep/hydraではo以外にも他のキーでも
プレフィクスキーを省略できるようになります。

機能的には縮小版ですが、コードはわずか40行です!

そのうち中核をなす部分は10行少々です。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてeasy-repeatを使う方は
以下のコマンドを実行します。

M-x package-install easy-repeat

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name easy-repeat

メカニズム

(defun easy-repeat--repeat (orig-fun &rest args)
  (apply orig-fun args)
  (when (called-interactively-p 'interactive)
    (set-transient-map
     (let ((map (make-sparse-keymap)))
       (define-key map (vector last-command-event) #'repeat)
       map))))

(defun easy-repeat--add ()
  (dolist (command easy-repeat-command-list)
    (advice-add command :around #'easy-repeat--repeat)))

(defun easy-repeat--remove ()
  (dolist (command easy-repeat-command-list)
    (advice-remove command #'easy-repeat--repeat)))

これらの部分を読んでみればわかるように
easy-repeat-command-list でリピート対象のコマンド各々に対して
Emacs 24.4で追加されたnadvice.el によるアドバイスがかけられています。

で、 set-transient-map 関数で一度きりのキーマップにて
repeat コマンド(C-x z)を指定しています。

この関数は set-temporary-overlay-map という名前でEmacs 24.3で導入され、
Emacs 24.4でset-transient-mapという名前に変更された新機能です。

この関数を使うことでrepeatや C-x C-i(indent-rigidly)
C-x e(kmacro-end-or-call-macro)
C-x C--(text-scale-adjust) などが
smartrep風味にプレフィクスキーを省略できるようになっています。

実におもしろい新機能ですね。

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。