文脈に応じて最適なコマンドを提示する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 ))