Hydraで複数のmakeコマンドを自在に使う

ホームページ管理のためにEmacsをワークデスクとして色んな作業をしています。その中で何度も繰り返し行う作業はMakeファイルに書いて限りなく自動化して、それをEmacsから実行しています。

M-x compile

とすると、

Compile command: make -k

とミニバッファーにでます。ここでリターンキーを押すと、makeコマンドが実行されます。

makeファイルの中の特定のブロックを実行したい時、例えば更新されたファイルをサーバーにアップロードしてホームページを更新する時は、make -k を消して make upftp と書き換えてリターンキーを押すとupftpコマンドが実行されるという仕組みです。

通常この使用法でも大した問題はないのですが、compile-commandの内容を書き換えて実行すると、次回にM-x compileコマンドを実行したとき make -k にはならず、先程の書き換えたものがデフォルトに変わってしまうのです。

そこで いろいろな引数でmakeコマンドを使い分けるためい、hydraで設定してみました。

設定

;;; 50_hydra-compile.el --- 50_hydra-compile.el
;;; Commentary:
;;; Code:
;;(setq debug-on-error t)

(bind-key
 [f2]
 (defhydra hydra-compile (:color red :hint nil)
  "
╭─────────────────────────────────────┐
│ 🗿 Compile:
     make:_a_ll  _u_pftp  _m_ove  _b_klog  _g_it
     ---------------------------------
     make:-_k_   _c_lean
└──────────────────────────────────────┘"
   ("a" my:make-all :exit t)
   ("u" my:make-upftp :exit t)
   ("m" my:make-move :exit t)
   ("b" my:make-bklog :exit t)
   ("g" my:make-git :exit t)
   ("k" my:make-default)
   ("c" my:make-clean)))

(defun my:make-default ()
  "Make command default."
  (interactive)
  (setq compile-command "make -k")
  (my:compile))

(defun my:make-upftp ()
  "Make command for upftp."
  (interactive)
  (setq compile-command "make up")
  (my:compile))

(defun my:make-all ()
  "Make command for all."
  (interactive)
  (setq compile-command "make -k && make up")
  (my:compile))

(defun my:make-move ()
  "Make command for move."
  (interactive)
  (setq compile-command "make mv")
  (my:compile))

(defun my:make-bklog ()
  "Make command for bklog."
  (interactive)
  (setq compile-command "make bk")
  (my:compile))

(defun my:make-git ()
  "Make command for git."
  (interactive)
  (setq compile-command "make git")
  (my:compile))

(defun my:make-clean ()
  "Make command for clean."
  (interactive)
  (setq compile-command "make clean")
  (my:compile))

(defun my:compile ()
  "Restore compile command after recompile."
  (interactive)
  (recompile)
  (setq compile-command "make -k"))

;; Local Variables:
;; byte-compile-warnings: (not free-vars callargs)
;; End:
;;; 50_hydra-compile ends here

更に使いやすくする

compileshell-command を実行すると結果のログが表示されます。その都度閉じるのが面倒なので popwin で表示させるようにします。popwin windowは “C-g” で閉じることができます。emacsでは何かと “C-g” を使うことが多いので、私はキーハックアプリで command_L に割り当ててワンキーで実行できるようにしています。

(use-package popwin)
(popwin-mode 1)

;; M-!
(push "*Shell Command Output*" popwin:special-display-config)

;; M-x compile
(push '(compilation-mode :noselect t) popwin:special-display-config)