文脈に応じて最適なコマンドを提示するanything.elのソース

大昔から欲しいと思っていたものに、現在の文脈を読み取って最適なEmacsコマンドを提示するインターフェースがある。つまり、Emacsが空気を読んでくれるやつ。anything.elだからこそ実現できる。実質たったの10行なのだからanything.elの汎用性、Lispの表現力には驚くばかりである。

anything-kyr-commands-by-major-mode変数を設定することで、メジャーモードにあわせたコマンドを提示できる。
また、 anything-kyr-functions に無引数関数のリストを設定すると、返り値(文字列のリスト)を追加してくれる。だから文脈に応じたコマンドを提示できる。
イデアが思い付き次第、追加していこう。


ちなみにKYRはKY(空気読めない)の対義語で空気読めるという意味だ。

(require 'anything-config)
(defvar anything-current-buffer nil)
(unless (boundp 'anything-current-buffer)
  (defadvice anything (before get-current-buffer activate)
    (setq anything-current-buffer (current-buffer))))
(defvar anything-kyr-candidates nil)
(defvar anything-kyr-functions nil)
(defvar anything-c-source-kyr
  '((name . "Context-aware Commands")
    (candidates . anything-kyr-candidates)
    (type . command)))
(defvar anything-kyr-commands-by-major-mode nil)
;; (setq anything-sources (list anything-c-source-kyr))
(defun anything-kyr-candidates ()
  (loop for func in anything-kyr-functions
        append (with-current-buffer anything-current-buffer (funcall func))))
(defun anything-kyr-commands-by-major-mode ()
  (assoc-default major-mode anything-kyr-commands-by-major-mode))

;; <<<  KYR vars>>>
(setq anything-kyr-commands-by-major-mode
      '((ruby-mode "rdefs" "rcov" "rbtest")
        (emacs-lisp-mode "byte-compile-file"))
      ;;
      anything-kyr-functions
      '(anything-kyr-commands-by-major-mode
        ))