auto-shell-command 20160603.1938(in MELPA)
Run the shell command asynchronously that you specified when you save the file.

概要

特に開発をしていると、ファイルを保存したらすぐに
特定のシェルコマンドを実行したいことがよくあります。

たとえば保存後すぐにコンパイル・実行したり、
設定ファイルの内容を動作中のプログラムに反映させたりなどです。

こんなときに使いたいのがongaeshi さんの auto-shell-command.el です。

彼はソースコード検索エンジンMilkode を作っただけでなく、
最近は Ruby製電子書籍検索エンジンHonyomiがGMOペパボ賞を受賞 するなど
Rubyの世界でも大活躍をしています。

ファイル保存時に実行されるフック after-save-hook
シェルコマンドを実行させる関数を登録しています。

実行するコマンドは対象ファイル名の正規表現とともにinit.elに記述します。

実行が無事に成功したらエコーエリアにsuccessと出るだけですが、
失敗したら popwin.el で実行結果がポップアップされます。

シェルコマンド実行の中心部分は deferred.el(レビュー)
によって非同期に行われます。

<2015-04-12 Sun> 試したところ、実行失敗後に動作しなくなるようです。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてauto-shell-commandを使う方は
以下のコマンドを実行します。

M-x package-install auto-shell-command

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name auto-shell-command

保存時自動実行系

hookify.el(レビュー) はafter-save-hook以外にも一時的なフックを設定できます。

backup-each-save.el(レビュー) は現在時刻付きのファイル名で
自動バックアップを行います。

auto-save-buffers-enhanced.el(レビュー)real-auto-save.el(レビュー)
ファイルを変更して一定時間後に自動保存するelispを使っている場合、
自動保存間隔を調整しないと自動実行シェルコマンドが同時実行されてしまいます。

設定 150412065621.auto-shell-command.1.el(以下のコードと同一)

(require 'auto-shell-command)

;;; キーバインドの設定
;; 一時的に無効・有効にする
(global-set-key (kbd "C-c C-m") 'ascmd:toggle)
;; 実行結果をポップアップ表示する
(global-set-key (kbd "C-c C-,") 'ascmd:popup)
;; ファイルを指定してそれに対応するコマンドを実行させる
(global-set-key (kbd "C-c C-.") 'ascmd:exec)

;;; エラー時のポップアップを見やすくする
(push '("*Auto Shell Command*" :height 20 :noselect t) popwin:special-display-config)

;;; 結果の通知をGrowlで行う (optional)
;; (defun ascmd:notify (msg) (deferred:process-shell (format "growlnotify -m %s -t emacs" msg))))

;;; 各ファイルごとの設定
;;; $FILEがファイル名, $DIRがディレクトリ名に置換されます
;; junk/以下のRubyスクリプトは無条件で実行
(ascmd:add '("junk/.*\.rb" "ruby $FILE"))

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。