quickrunを他の関数から使いやすいようにしました

quickrun.elはその特性のためか、単体で使うことがメインになっており、
現在開いているファイルなんかに強く依存しているものなんですが、
各種機能(非同期実行とか)を他の関数に組み込んで使えると便利かな
と思って、実装してみました。

機能拡張

さすがにコマンドがカレントディレクトリでしか実行できないと
なると使い道があんまりないので、':default-directory'という
パラメータを追加しました。':default-directory'を指定すると
コマンドをそのディレクトリで実行します。

':default-directory'の利用例

以下のように設定すると、"/tmp"で "ls -l"を実行します。

(quickrun-add-command "ls-tmp"
                      '((:command . "ls")
                        (:exec    . ("ls -l"))
                        (:default-directory . "/tmp/")))

基本的な使い方

以下の形式で指定します。

(quickrun :source パラメータ)

具体例

リポジトリのトップに移動し、現在のテストファイル ".t"に対して
proveコマンドを実行するという例です。コマンド実行の前には
make or perl Build(./Buildとした方がよいが、現状コマンドの
相対パスの指定は未サポート)をしています。
トップへの移動は gitリポジトリだろうということでいささか手抜きです。

(defun test-perl ()
  (interactive)
  (let* ((cmd "git rev-parse --show-toplevel")
         (topdir (with-temp-buffer
                   (call-process-shell-command cmd nil t nil)
                   (goto-char (point-min))
                   (if (re-search-forward "^\\(.+\\)$" nil t)
                       (match-string 1)))))
    (quickrun :source `((:command . "prove")
                        (:default-directory . ,topdir)
                        (:exec .
                               ((lambda ()
                                  (cond ((file-exists-p "Makefile") "make")
                                        ((file-exists-p "Build") " perl Build")
                                        (t (error "exec perl Makefile.PL or perl Build.PL"))))
                                "%c -bv %s"))))))

おわりに

quickrunにコマンドを追加していって、切り替えて使うというので
対応できることなのですが、こういう風に使えたら用途が広がる
のではないかと思って実装してみました。