たまに使うコマンドをちゃんと利用するために

xyzzyemacs風のキーバインドで、いくらでもショートカットキーを登録できる。とはいえ、そんなに入力方法を覚えられるわけじゃない。また、M-xから直接コマンド名を入力しても良い。しかし、これもコマンドの名前を覚えてないといけない。ちょっとコマンドの数を調べてみたところ、ざっと1000以上のコマンドがあった。そんなにあることも知らなかったくらいだ。


もちろん、使われていなかったコマンドは、使い始めると結構便利だったり、たまに必要を感じるようなものである。そこで、そういったコマンドを使うようにする方法を考えた。それは簡単で、メモ用のファイルにコマンドを貼り付けて、必要ならコマンドの機能を一緒に書いておく。これだけだ。


必要な機能があったら、とりあえずメモを開いて検索すればいい。コマンドが見つかれば、すぐに実行できる。が、標準ではM-xから呼び出さないと実行できない。仕方ないので適当にコマンドを作る。

(defun call-last-command (&optional stream)
  "バッファ上のコマンドを実行"
  (interactive "p")
  (let ((syntab (syntax-table)))
    (let (from to)
    (cond ((selection-start-end (start end)
                  (setq from start to end)))
      (t
       (use-syntax-table ed::*lisp-mode-syntax-table*)
       (unwind-protect
         (let ((opoint (point)))
           (setq from (progn
                (backward-sexp)
                (point))
             to (progn
                (forward-sexp)
                (point)))
           (goto-char (max opoint to)))
         (use-syntax-table syntab))))
    (save-excursion
    (handler-case (command-execute (car (find-all-symbols (substitute-string (buffer-substring from to)
                                         "\\(^[^:]*:+\\)\\|\\('\\)" ""))))
            (error (c) (message "~A" c)))))))

まあ、作るといってもlisp.lからcall-last-sexpを拝借して直しただけだ。これをScrollキー辺りに登録しておけば簡単にコマンドを実行できる。もし、他のバッファでコマンドを利用したくなったら、command-executeの中身を変数に保存する関数と、それを呼び出す関数に分ければいい。