Vim Advent Calendar 2012 の202日目の記事です。昨日はkamichiduさんでした。明日はrbtnnさんの予定です。
さて、前回の著者による記事をお覚えでしょうか。前回の記事を執筆した日は著者の誕生日です。
- Vital.ProcessManager https://gist.github.com/ujihisa/5761509
この記事にて、起動の遅いプログラムを例示しました。
著者はScalaやClojureなどの言語を使っていることが多いです。これらの言語は、主にJVM上で動作するということも関係し、起動が非常に遅いことで有名です。最新のコンピュータを用いてもClojureの起動は1秒以上かかります。JVMのオプションをいじっても、0.5秒以上かかります。Scalaにおいては悲惨の一言で、3.5秒以上かかります。JVMのオプションをいじっても効果はないようです。ライブラリを読み込むと、事態は悪化します。
(中略)
この問題を汎用的に解決するために著者が開発したのがVitalのProcessManagerです。
(中略)
著者がいくつか既存のプラギンをProcessManagerを用いて高速化してみました。いずれもまだ本家にマージされていません(*5)。
- thinca/vim-ref (clojureのみ)
- thinca/vim-quickrun (clojureとscalaのみ)
- shougo/unite-build (途中!)
このうちquickrunへの変更をpullreqし、正式にマージされました。
デフォルトでclojureとscalaのための設定が入っています。 ちょっとのぞいてみましょう。
'clojure/process_manager': {
'command': 'clojure-1.5',
'runner': 'process_manager',
'runner/process_manager/load': '(load-file "%s")',
'runner/process_manager/prompt': 'user=> ',
},
さて、clojureについて詳しくない方について簡単に説明します。以後、_
はカーソルとします。
$ clojure-1.5_
のようにしてclojureを引数なしで起動すると、REPLが立ち上がります。REPLとはようするにVimにおけるEx modeのすごいやつのようなものです。
$ clojure-1.5
user=> _
プロンプトがでてきました。さて、/home/ujihisa/a.clj
に実行したいファイルがあります。実行させてみましょう。
$ clojure-1.5
user=> (load-file "/home/ujihisa/a.clj")_
これでファイルを読み込んで実行してくれます。ここまでの流れはclojure-1.5 /home/ujihisa/a.clj
をシェルから直接実行することも可能ですが、一旦clojureを起動してそのclojure内で何度もload-file
した方が速いです。具体的には毎回0.5秒程度の節約が可能です。この差は目視できるレベルであり、言い換えると、許されない差です。quickrunのrunnerのprocess_manager
への設定により、上記作業をquickrunがかわりにすべてやってくれます。つまり、たんにa.clj
を開いている状態でquickrunすることで、clojureのプロセスに対してload-file
を行ってくれます。もちろん、従来のquickrun通り、無名のファイルに対して保存することなく実行させることができます。
Scalaの場合の例もお見せしましょう。
'scala/process_manager': {
'command': 'scala',
'cmdopt': '-nc',
'runner': 'process_manager',
'runner/process_manager/load': ':load %s',
'runner/process_manager/prompt': 'scala> ',
},
Rubyのための対話的環境であるIRBでも同様のことを行ってみましょう。以下の設定を自分で~/.vimrc
に記述します。なお、g:quickrun_config
はすでに辞書になっていると仮定します。
let g:quickrun_config.ruby = {
\ 'command': 'irb',
\ 'cmdopt': '--simple-prompt',
\ 'runner': 'process_manager',
\ 'runner/process_manager/load': "load '%s'",
\ 'runner/process_manager/prompt': '>> ',
\ }
- irbのデフォルトのプロンプトは可変です。わかりずらいので固定のプロンプトにするため
--simple-prompt
という引数つきで起動しています- 恐ろしくひどい名前ですね。なぜ
--constant-prompt
などといった、一定であるという具体的な性質を述べる名称にしなかったのでしょうか。
- 恐ろしくひどい名前ですね。なぜ
- 実際にはrubyの起動はとてもはやいので、この設定はあまりメリットがありません。が、たとえばこれがJRubyなら・・・? そう、とても実用的です。
irb
のかわりにjruby -S irb
などとしましょう
- あるいは
rails console
なら・・・?
そう、可能性は無限大です。
著者は他にも仕事用に「sshして接続先でmongoを起動してその中で・・」などといったものにたいしquickrunのProcessManagerを用いています。