この記事はEmacs Advent Calender 2011の1日目です。
今年も始まりました、Emacs Advent Calendar。
まだ枠が空いているので、何か書いてもいいよって方は是非登録してみてください。
先日紹介した quickrun.elについて紹介します。
はじめに
quickrun.elは quickrun.vimの Emacs版です.
Emacsには executable-interpretがあるにはあるんですが、
直接実行されるファイルに限られること等の問題があったので、
思い切ってEmacs版の開発に取り組みました。
動作確認
Emacs 22.1以上で動作することを確認しています。
Windowsでの動作確認は現状行えていません。ちゃんと
リリースするまでには確認するつもりですが、現状動作を保証
できません。Unix系の環境であれば動作するものと思います。
インストール
auto-install.elをインストールしている方は以下の S式を実行してください。
auto-install.elについてよくわからない方はこちらを参照してください。
(auto-install-from-url "https://raw.github.com/syohex/emacs-quickrun/master/quickrun.el")
まだ開発中のものなので、頻繁にアップデートをすることを推奨します。
以下の内容ももしかすると変更があるかもしれません。その時はブログに
書くなりしますので、よろしくお願いします。
設定
requireするだけです。ポップアップするバッファの扱いを楽にするために
popwinの設定も行うことをおすすめします。
(require 'quickrun) ;; 結果の出力バッファと元のバッファを行き来したい場合は ;; ':stick t'の設定をするとよいでしょう (push '("*quickrun*") popwin:special-display-config) ;; よく使うならキーを割り当てるとよいでしょう (global-set-key (kbd "<f5>") 'quickrun)
対応言語
前回より増やしました。括弧の中は必要になるコマンドです。
- C(gcc or clang or Visual C++)
- C++(g++ or clang++ or Visual C++)
- Objective-C(gobjc[gcc -lobjc])
- D言語(dmd)
- Java(JDK)
- Perl(perl)
- Ruby(ruby)
- Python(python)
- PHP(php)
- Emacs Lisp(emacs)
- Scheme(gosh)
- Common Lisp(clisp)
- Clojure(jark or clj-env-dir)
- Javascript(node.js or v8 or js or jrunscript or cscript)
- Coffee Script(node.js and coffee)
- Markdown(Markdown.pl or bluecloth or kramdown or pandoc or redcarpet)
- Haskell(runghc)
- Go Language(8g or 6g or 5g)
- Io(io)
- Groovy(groovy)
- Scala(scala)
- SASS(sass)
- LESS(lessc)
- Erlang(escript)
- Ocaml(ocamlc)
- ShellScript(shabangに記述したシェル)
- AWK(awk)
quickrunを使う
"M-x quickrun"するだけです. プログラミング言語は major-mode及び拡張子から
決定されます。major-modeの設定を行っていない言語の場合は適切な拡張子
(一番メジャーであろう拡張子)を指定してください。
(追記)C-uプレフィックスをつけて quickrunを実行すると、利用するコマンドを
選択することができます。
quickrunの他には、
- quickrun-with-arg(コマンドライン引数の指定)
- quickrun-compile-only(後述)
があります。
コンパイルのみを行う quickrun-compile-only
コンパイルのみを行います。通常コンパイルは call-process関数を用いますが、
quickrun-compile-onlyを実行した場合は, Emacsの compileの枠組みを利用します。
なんでエラーの形式が compileに対応していれば next-error等の関数で、
問題箇所にジャンプできます。
flymakeを設定していれば不要ですが、flymakeを設定していない人、
flymakeの設定をしていない言語での利用を想定して作成しました。
quickrunだけでもコンパイルエラーが起きればバッファはポップアップ
されますが、効率的に修正もしたいという場合はこちらを使うのもありでしょう。
quickrun-compile-onlyはすべての言語で実行できるわけではないので
注意してください。
ファイルローカル変数
デフォルトで実行するコマンドはオプションや引数がないものです、
quickrun-argで指定できますが、決められたものを指定したい場合は
面倒なので、quickrun-command-optionと quickrun-command-argumentと
いうファイルローカル変数を用意しました. 例を示します。
(追記) file local variable名の修正
#!perl use strict; use warnings; binmode STDOUT, ":utf8"; for my $arg (@ARGV) { if (looks_like_number($arg) && $arg == 72) { print "くっ\n"; } } # Local Variables: # quickrun-option-cmdopt: "-MScalar::Util=looks_like_number -Mutf8" # quickrun-option-args: "765 IdleM@ster 72" # End:
この場合、quickrunを実行すると以下のコマンドが実行されます。
% perl -MScalar::Util=looks_like_number -Mutf8 source.pl 765 IdleM@ster 72
タイムアウト
無限ループ防止のために、デフォルトでは 10秒でプログラムの実行を
打ち切ります。この時間は quickrun-timeout-secondsで変更可能です。
負数に設定するとタイムアウトしなくなります。
なおコンパイルについては同期的に行いますが、実行については非同期に
行います。なんで sleepだけするプログラムを動作させても、編集が妨げる
ということにはなりません。また Javaを除き、ファイルは一時ファイルに
コピーされるので、実行中に編集しまくろうが気にする必要はありません。
制限
- 標準入力からの読み込み
- リダイレクト(あるファイルからの読み取り、あるファイルへ結果を書き出し)
- リージョンでの実行
初め2つは実装を検討したいと考えていますが、現状ではコマンドライン引数と
して情報を与え、対応を行うようにしてください。リージョンでの実行もいずれ
実装したいと考えています。
拡張性
一応新規言語の対応はユーザが行えるように作ったつもりですが、
完全に固まっているわけではないので、それが決まってから拡張性について
明記しようと考えています。
問題点
問題点があればgithubのissueトラッカまでお願いします。
コードもきっちり書けていないので、pull requestをいただいても僕自身戸惑う
おそれがあるので、現状は指摘・提言だけの方がいいかなと思います。pull requestも
もちろん歓迎ですけどね。
この言語に対応してほしいとか、こんな機能がほしい、などなど何でも
構いませんので、何かあったらよろしくお願いします。
現状問題があるとしたら、中途半端なところでプログラムが停止し、
qr_{ランダムな文字列}というファイルに残るおそれがあります。もしそのような
場合でも報告していただけると助かります。
おわりに
quickrun.elについて紹介しました。
Vimのいいところはガンガン取り込めればいいかなと思いました。
その前にそれを実現するための Emacs Lispの知識が必要なんで
勉強していきたいと思います。