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:
-
コマンドを実行した結果をバッファに書き足す
- Vim:
:r!command
- vimproc:
:call append(line('.'), vimproc#system('command'))
- vimproc’:
:VimProcRead command
- Vim:
-
コマンドを実行した結果を変数に格納する
- Vim:
:let x = system('command')
- vimproc:
:let x = vimproc#system('command')
- Vim:
-
コマンドをバックグラウンドで実行する
- Vim:
:!command &
- vimproc:
:call vimproc#system_bg('command')
- Vim:
冗長で不便なので、キーマッピングを追加するか、あるいは:!
の使用をさけてかわりに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