編集中のファイルをコンパイルして実行する

プログラミングの課題でちょっとしたプログラムを書いてはテストするのがちょっと面倒なのでelispで関数を作ってみた。c言語用だけどちょっと手直しすればほかの言語でもいけると思う。

(defun compile-and-execute-current-file ()
  (interactive)

  (when (and (buffer-modified-p) (y-or-n-p "file is modified. save?"))
    (save-buffer))

  (let* ((file-name (file-relative-name buffer-file-name))
	 (buf (get-buffer-create "*compile-and-execute*"))
	 (w2 (switch-to-buffer-other-window buf))

	 (compiler "gcc")        ;;<--
	 (executable "a.out"))   ;;<--

    (erase-buffer)
    (when (zerop 
	   (call-process compiler nil w2 t
			 (shell-quote-argument file-name)))
      (make-comint-in-buffer executable w2 (expand-file-name executable)))))

これをC-c C-eで評価するなり.emacsに入れて再起動するなりすればM-x compile-and-execute-current-fileで使える。

動作としては、ファイルの変更を保存していないようなら保存するかどうか聞いて保存したりしなかったりしたあと、画面を2分割して片方でコンパイルを実行。ここでエラーや警告が出ると表示する。警告が出た場合でも、コンパイルに成功した場合できたファイルがそのまま実行される。comintを使ってるのでちゃんとインタラクティブしてくれる。

↓M-x compile-and-execute-current-file

↓入力できる

違う言語で使うならソース中<--で示されているところを変えればいいはず。gccを使うコンパイラに、a.outをできる実行ファイル名に。