同じコマンドを連続実行することで挙動を変える(行頭→先頭など) sequential-command.el をリリース

たとえばEmacsでC-aを押したら行頭に飛ぶ。しかし、行頭でC-aを押してもすでに行頭なので意味がない。C-aは特等席なんだからもっと働かせてやろうと思わないか?もう一度C-aを押したらバッファの先頭に飛ぶとかできれば、遊んでいるキーの有効活用ができる。少なくとも俺にとってはM-<よりもC-a C-aの方が負担がかからない。

そこで、sequential-command.elの登場だ。これは同じコマンドを連続的に実行したときに挙動を変えるフレームワークとなっている。そして、sequential-command-config.el はそれを使った具体的なコマンドを集めている。

M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command.el

M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/sequential-command-config.el

たとえば sequential-command-config.el で定義している seq-home コマンドは以下の挙動をしている。

  • まず行頭に飛ぶ
  • 次にバッファ先頭に飛ぶ
  • 次に元の場所に戻る

で、定義がコレ。シンプルでしょ。ちなみにseq-returnは最初に連続コマンドを実行したときの位置に戻るコマンドだ。

(define-sequential-command seq-home
  beginning-of-line beginning-of-buffer seq-return)

同様にC-eに対応する seq-end も定義している。カーソル前の単語を次々に大文字(小文字・capitalize)にする - http://rubikitch.com/に移転しましたで定義している electric-*-backward-word も含まれているが、 seq-*-backward-word という名前に変更している。

デモも用意している。M-x seq-demo を実行してみよう。

設定

(require 'sequential-command-config)
(global-set-key "\C-a" 'seq-home)
(global-set-key "\C-e" 'seq-end)
(when (require 'org nil t)
  (define-key org-mode-map "\C-a" 'org-seq-home)
  (define-key org-mode-map "\C-e" 'org-seq-end))
(define-key esc-map "u" 'seq-upcase-backward-word)
(define-key esc-map "c" 'seq-capitalize-backward-word)
(define-key esc-map "l" 'seq-downcase-backward-word)