vim-users.jp

Hack #168: シェル以外から立ち上げたVimでもシェル側の環境変数PATHを考慮したコマンドの呼び出しを行う

Posted at 2010/08/18
このエントリーをはてなブックマークに追加

問題

:!ruby %

このコマンドが呼び出すrubyとして期待されるものは、/usr/bin/rubyであったり、/usr/local/bin/rubyであったり、はたまた~/git/ruby/local/bin/rubyのように独自で用意したものであったりします。

zshなどのシェルでは、~/.zshrcなどの設定ファイルに

export PATH=~/git/ruby/local/bin/ruby:$PATH

などと記述することによって、単にrubyなどとしてコマンドを呼び出したときに実際にどの場所のコマンドが呼び出されるか制御でき、またそのシェルから起動したVimもそれに準拠します。これはCUIでもGUIでも同様です。

しかしながら、シェルを経由せずVimを起動した場合。~/.zshrcなどに記述したロードパスに関する情報は得られません。MacのDockなどから起動しつつ、そのVimであなたのホームディレクトリ以下にあるrubyなどを呼び出すにはどうすればいいのでしょうか。

解決法

vimprocを用います。vimprocはVimの変数$PATHを参照してコマンドを実行します。

vimprocを用いてのコマンドの実行とVimのデフォルトの機能との対応は以下のようになります。

  • コマンドを単に実行する

    • Vim: :!command
    • vimproc: :call vimproc#system('command')
    • vimproc’: :VimProcBang command
  • コマンドを実行した結果をバッファに書き足す

    • Vim: :r!command
    • vimproc: :call append(line('.'), vimproc#system('command'))
    • vimproc’: :VimProcRead command
  • コマンドを実行した結果を変数に格納する

    • Vim: :let x = system('command')
    • vimproc: :let x = vimproc#system('command')
  • コマンドをバックグラウンドで実行する

    • Vim: :!command &
    • vimproc: :call vimproc#system_bg('command')

冗長で不便なので、キーマッピングを追加するか、あるいは:!の使用をさけてかわりにvimshellを用いるとよいでしょう。

nnoremap :! :call vimproc#system('

さて、:!system()を間接的にもっとも頻繁に使うのはなんといってもquickrunでしょう。quickrunでvimprocを用いるためには、以下の設定を~/.vimrcに記述します。

let g:quickrun_config['*'].runmode = "async:remote:vimproc"}

余談ですが、著者はこれにquickrun分割場所指定もあわせ、以下のように指定しています。

let g:quickrun_config['*'] = {'runmode': "async:remote:vimproc", 'split': 'below'}

これで、quickrunで好きなrubyを使いたい放題です。

補足

本Hackは一般的な外部コマンドの実行について述べましたが、この方法は特に、Rubyのような複数の同名のコマンドをインストールする必要があるようなコマンドで役に立ちます。著者はRuby 1.8.6, 1.8.7, 1.9.2, 1.9.3をすべて使用しているため、本設定が大変効いてきています。

なおVimによるRubyプログラミングをより効率的かつ快適に行うための方法については、“Vim” at RubyKaigiに参加し、基調講演を聞く、ライトニングトークの発表を聞く、ライトニングトークで発表する、そしてほかの参加者とその場で情報交換することによって、活き活きとした生の情報を大量に得ることができることは疑いの余地がないでしょう。

参考文献

ujihisa

もどる
blog comments powered by Disqus