multi-compile 20160306.1423(in MELPA)
Multi target interface to compile.

概要

multi-compile.el は名前が示すとおり、 M-x compile にメジャーモードやファイル名に応じて複数のコンパイルコマンド(アクション)を持たせるものです。

昔からある smart-compile.el に似ていますが、コンパイルコマンドを1つしか指定できません。
その点こちらの方が優位です。
シェルでhelm/anything風候補選択を行うpeco を使えば同じ効果は得られますが、こちらはEmacsで閉じています。

これを使うには multi-compile-alist にメジャーモード・ファイル名とアクションを設定する必要があります。

コマンドは以下のテンプレートが使えますが、 multi-compile-template を指定すれば自由に増やせます。

アクションの選択インターフェースは multi-compile-completion-system に指定します。
ido/helm/defaultで選べますが、デフォルトのidoが無難でしょう。
任意の関数も指定できます。

本設定ではデフォルトの設定に少し手を加えたものにコメントをつけます。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.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/")))

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

M-x package-install multi-compile

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

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

設定 151111092847.multi-compile.el(以下のコードと同一)

(setq multi-compile-alist
      '(;; rust-modeでは3つのアクション
        (rust-mode . (("rust-debug" . "cargo run")
                      ("rust-release" . "cargo run --release")
                      ("rust-test" . "cargo test")))
        ;; c++-modeでは1つのアクション
        ;; %make-dir は Makefile の存在するディレクトリ
        ;; (multi-compile-template参照)
        (c++-mode . (("cpp-run" . "make --no-print-directory -C %make-dir")))
        ;; *.txt (ファイル名の正規表現指定) もできる
        ("\\.txt\\'" . (("text-filename" . "echo %file-name")))))

;;; 使えるテンプレート
(setq multi-compile-template
      '(
        ;; /path/to/base.ext
        ("%path" . (buffer-file-name))
        ;; /path/to/
        ("%dir" . (file-name-directory (buffer-file-name)))
        ;; base.ext
        ("%file-name" . (file-name-nondirectory (buffer-file-name)))
        ;; base
        ("%file-sans" . (file-name-sans-extension (file-name-nondirectory (buffer-file-name))))
        ;; ext
        ("%file-ext" . (file-name-extension (file-name-nondirectory (buffer-file-name))))
        ;; Makefileのあるディレクトリ
        ("%make-dir" . (locate-dominating-file (buffer-file-name) "Makefile"))
        ;;; ここから追加!
        ;; Rakefileのあるディレクトリ
        ("%rake-dir" . (locate-dominating-file (buffer-file-name) "Rakefile"))
        ;; project-root (projectileを使用)
        ("%proj" . (projectile-project-root))
        ))

実行方法

$ wget http://rubikitch.com/f/151111092847.multi-compile.el
$ emacs -Q -f package-initialize -l 151111092847.multi-compile.el

本サイト内の関連パッケージ


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