anything-something.el

名前は半分冗談w
普段仕事をしていると、使うコマンド(M-xとか)や、動作が意外と限られている事に気がつく。
例えば、職場では mvc-status をかなり頻繁に使用するのだが、その都度 anything-c-mx で選択するのは意外と面倒。
mvc と入力したあたりでもう察してよと思うのだが、mvc-xxx のコマンドがずら〜っとリスティングされてしまい、結局手動でmvc-statusと入力するのと大差ない手間がかかってしまう。
一連のコマンドの組み合わせを呼び出すなんてケースもあり、この場合は anythingを複数回呼ぶ必要がある。
そんな訳で、自分のお気に入りの操作をリスティングするanything.elのインターフェースを作ってみた。
いわゆるランチャーのようなもの。
anything-something-commands に好みの動作を記述しておくという寸法。

引数を持った関数(と呼ぶのかな? lispの場合)をコールする方法がエレガントじゃない気もするが、まぁそのうち修正するということで。
 → (call-interactively (intern "xxxx")) で解決 2008/10/1

と、これを作った後に、anythingの履歴を使用頻度順に記憶しておいて、それを利用したインターフェースを書けばよかったんじゃないかという気がしてきた。。。

(defvar anything-something-commands (list
                                   (list :title "kita" :summary "(゚∀゚)キタコレ" :command #'insert :args '("(゚∀゚)キタコレ"))
                                   (list :title "signature" :summary "署名を挿入" :command #'insert :args '("/**\n * name: foo\n */\n"))
                                   (list :title "occur" :summary "anything-c-source-occurを実行" :command (lambda () (anything '(anything-c-source-occur))))
                                   (list :title "gcode" :summary "モードに合わせた言語でgoogle code searchを引く" :command #'(lambda () (call-interactively (intern "gcode"))))
                                   ))

(defvar anything-c-source-something
  '((name . "Something")
    (init . anything-c-something-init)
    (candidates-in-buffer)
    (action . anything-c-something-action)))

(defun anything-c-something-init ()
  (with-current-buffer (anything-candidate-buffer 'global)
    (dolist (command anything-something-commands t)
      (insert (format "%s: %s\n" (getf command :title) (getf command :summary))
              ))))

(defun anything-c-something-action (candidate)
        (with-current-buffer anything-current-buffer
          (let* ((title (car (split-string candidate ":")))
                 (command (car (remove-if-not #'(lambda (item)
                                                  (string= title (getf item :title)))
                                              anything-something-commands))))
            (apply (getf command :command) (getf command :args)))))

(defun anything-something ()
  (interactive)
  (anything '(anything-c-source-something)))