anything.el導入した
anything.elは何をするのかというと,いろんなとこ(情報源)から正規表現で検索し,選択すると情報源に応じたコマンドを実行する(多分).バッファなら切り替えるし,ファイルなら開くし,コマンドなら実行する.
設定は膨大なanything.elの設定を公開! - http://rubikitch.com/に移転しましたを参考にした.rubikitchさんのは非常に長くてelisp初心者の俺にはとても読めないので,(setq anything-sources ...の所の変数名から辿って分かる範囲でコピペした.
(require 'anything-config) (defun anything-c-skip-opened-files (files) (set-difference files (mapcan (lambda (file) (list file (abbreviate-file-name file))) (delq nil (mapcar #'buffer-file-name (buffer-list)))) :test #'string=)) (defun anything-c-transform-file-name-nondirectory (files) (mapcar (lambda (f) (cons (file-name-nondirectory f) f)) files)) (defun anything-c-source-files-in-dir (desc dir &optional match skip-opened-file) `((name . ,desc) (candidates . (lambda () (directory-files ,dir t ,match))) (candidate-transformer . (lambda (candidates) (anything-c-compose (list candidates) '(,@(if skip-opened-file (list 'anything-c-skip-opened-files)) anything-c-transform-file-name-nondirectory)))) (type . file))) (defvar anything-c-source-config-files (anything-c-source-files-in-dir "Config Files" "~/.emacs.d/init.d/" "\\.el$" t)) (defvar anything-c-source-ruby-source (anything-c-source-files-in-dir "Ruby 1.8 Source" "~/source/ruby-1.8.7-p72/" "\\.[ch]$" t)) (defvar anything-c-source-gauche-source (anything-c-source-files-in-dir "Gauche Source" "~/source/Gauche-0.8.14/src/" "\\.[ch]$" t)) (setq anything-sources (list anything-c-source-buffers anything-c-source-recentf anything-c-source-config-files anything-c-source-ruby-source anything-c-source-gauche-source anything-c-source-emacs-commands )) (define-key anything-map (kbd "C-v") 'anything-next-source) (define-key anything-map (kbd "M-v") 'anything-previous-source) (global-set-key (kbd "C-;") 'anything)
rubyやgaucheのソースをよく読むので,いつも一々ディレクトリ移動が面倒でどうにかしようと思っていた所なので,丁度良かった.
正規表現でしかも広範囲から検索となると,これって結構重いんじゃないだろうか.昔はこんな贅沢な計算はできなかったんじゃないかな.出てきたのも最近みたいだし,ハードウェアの進歩でEmacsも進化してるということなのか.
ところで,anythingの設定をしたファイルをバイトコンパイルすると,そのファイルの末尾で
the function `anything-c-adaptive-store-selection' might not be defined at runtime.
という警告が出てしまうんだけどなんでだろう?