Skip to content

Instantly share code, notes, and snippets.

@ujihisa
Created June 21, 2013 06:27
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ujihisa/5829271 to your computer and use it in GitHub Desktop.
Save ujihisa/5829271 to your computer and use it in GitHub Desktop.
Vim Advent Calendar 2012 http://atnd.org/events/33746

Vim Advent Calendar 2012 ujihisa 12 (202日目)

Vim Advent Calendar 2012 の202日目の記事です。昨日はkamichiduさんでした。明日はrbtnnさんの予定です。

さて、前回の著者による記事をお覚えでしょうか。前回の記事を執筆した日は著者の誕生日です。

この記事にて、起動の遅いプログラムを例示しました。

著者はScalaやClojureなどの言語を使っていることが多いです。これらの言語は、主にJVM上で動作するということも関係し、起動が非常に遅いことで有名です。最新のコンピュータを用いてもClojureの起動は1秒以上かかります。JVMのオプションをいじっても、0.5秒以上かかります。Scalaにおいては悲惨の一言で、3.5秒以上かかります。JVMのオプションをいじっても効果はないようです。ライブラリを読み込むと、事態は悪化します。

(中略)

この問題を汎用的に解決するために著者が開発したのがVitalのProcessManagerです。

(中略)

著者がいくつか既存のプラギンをProcessManagerを用いて高速化してみました。いずれもまだ本家にマージされていません(*5)。

このうち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を用いています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment