Vim スクリプトを書いていると、どうしても Vim だけの機能では難しい、または面倒な場面にでくわすことはよくある。特に通信周りなんかはそうだ。
外部コマンド 1 つで済めばいいが、複雑になってくると Ruby などでスクリプトを書きたくなってくる。かと言ってファイルが増えるのは嫌だし、そもそも plugin ディレクトリなどに .rb などのファイルが入るのも気にくわない。
そこでいっそ Vim スクリプト内にコードを書きたくなるわけだけど、各種言語のインターフェースはオプションなので、組込まれていない Vim では使えなくなる。マシン自体に言語環境は入っているけど Vim には組込まれていない、なんてことは割とありがち。外部コマンドとしてなら使えるのに…。
と言うわけで、Vim スクリプトにインターフェースを使わずに他の言語を埋め込む方法。用途を考えると半分ネタなのであんまり本気にしないように。
let result = system('ruby -x ' . shellescape(expand('<sfile>'))) echo '--- result ---' echo result finish ruby << #!ruby puts 'Hello, Ruby!'
途中の ruby << は syntax ハイライトを有効にするだけで Ruby インターフェースは使ってません。
Ruby の -x オプションで Vim スクリプトの部分を飛ばしてるわけです。キモい。
-x オプションは Perl にもあるので、Perl でももちろん可。
let ruby = system('ruby -x ' . shellescape(expand('<sfile>'))) let perl = system('perl -x ' . shellescape(expand('<sfile>'))) echo '--- result ---' echo ruby echo perl finish ruby << #!ruby puts 'Hello, Ruby!' __END__ #!perl print 'Hello, Perl!'
__END__ を使えば併用もできる。意味あるのかは知らない。__END__ のせいでハイライトが終了してくれなくなったので以下のハイライトは省略。
頑張れば Python だって!
""" let ruby = system('ruby -x ' . shellescape(expand('<sfile>'))) let perl = system('perl -x ' . shellescape(expand('<sfile>'))) let python = system('python ' . shellescape(expand('<sfile>'))) echo '--- result ---' echo ruby echo perl echo python finish ruby << #!ruby puts 'Hello, Ruby!' __END__ perl << #!perl print 'Hello, Perl!' __END__ """ print('Hello, Python!')
何がしたいのかわからなくなってきた。えーい、Gauche も入れてしまえ!
""" " #| let ruby = system('ruby -x ' . shellescape(expand('<sfile>'))) let perl = system('perl -x ' . shellescape(expand('<sfile>'))) let python = system('python ' . shellescape(expand('<sfile>'))) let gauche = system('gosh ' . shellescape(expand('<sfile>'))) echo '--- result ---' echo ruby echo perl echo python echo gauche finish ruby << #!ruby puts 'Hello, Ruby!' __END__ #!perl print "Hello, Perl!\n"; __END__ """ print('Hello, Python!') """ |# (print "Hello, Gauche!") ;"""
一番下は Python のコメントにするため面倒なことをしてるけど、Gauche 単体で埋め込むならここまでしなくても大丈夫。最初の行も "" #| で OK。
目的を見失って暴走し始めたのでこの辺りで。くれぐれも無理は禁物だぞ!