2012-02-19 27 views
8

私は外部シェルスクリプトを呼び出し、出力を現在のバッファに読み込むVimスクリプトを持っています。 Unixシステムでうまく動作します。スクリプトをOSに依存しないようにしようとしているので、Windowsユーザーもこのスクリプトを使用したいと思っています。ここでは、スクリプトから関連する行です:VimスクリプトでWindows環境変数を使用するには?

:exe ":0r !$HOME/bin/shell_script" 

Vimのドキュメントによると、$HOMEがあまりにもWindowsユーザーのための罰金翻訳しなければなりません。コマンドモードでWin XPでgvimを使用すると、実際に "C:¥Documents and Settings¥my_user"が生成されます。しかし、(バックスラッシュ調整後)私のVimスクリプトは

$ HOMEの\ビン\のshell_script」が見つかりませんと言っDOS cmd.exeのウィンドウにメッセージをWindowsマシンに障害が発生した

つまり

、VimはCMD.EXEにそれを渡す前に$HOMEの価値を拡大することがないように見える。

Vimは電流増幅率として%解釈するので、私は%APPDATA%のいずれかを使用することはできませんntファイルを開き、ファイル名をAPPDATAに追加または追加します。奇妙なVim を展開します%を展開しません$HOME

$HOMEを正しく展開するにはどうすればよいですか?それはvimスクリプトでexeを使用しているからですか?ここで

答えて

0

あなたはvimの中でスラッシュとバックスラッシュに関するいくつかの情報を持っている:

http://vimdoc.sourceforge.net/htmldoc/os_dos.html

あなたはスラッシュを使用することを好む

は、「shellslash」オプションを設定します。 ファイル名を展開するときに、Vimはバックスラッシュをスラッシュに置き換えます。これは、Unixのような 'シェル'を使用する場合に特に便利です。

+0

この質問は(バック)スラッシュについてではありません。ここでの問題はシェルが '$ HOME'を理解できないことです。 – doubleDown

6

ファイルを読むには!は必要ありません。

:exe ":0r $HOME/bin/shell_script" 

またはWindows typeコマンドを読んで(Linuxの場合のようにcat):

:exe '0r !type "'. $HOME . '\bin\shell_script"' 

注:

  • typeは、Windowsで実行されるシェルので、あなたは(\を必要としますバックスラッシュ)
  • $HOMEspace Sが含まれている場合、あなたはKEVによって与えられた答えを明確にするためにspace
+1

明確にするために、外部スクリプトを実行して出力をバッファに挿入します。 –

+0

@NickColeman 'type'を削除して、もう一度実行してください。 – kev

+0

私はあなたが$ HOMEを引用符の外に移動したことを忘れていました。それはそれを修正した。返信いただきありがとうございます。 –

4

のリテラル値を保持するために(二重引用符)"を必要とする:Windows上

の$ HOME変数展開されません。コンソールにエスケープすると正しくたとえば、次のコードを考えてみてください。

これは、vimが$ HOMEを通常どおり展開するために機能します。一方、これは動作しません:

:%! $HOME/myscript 

なぜですか? vimは!の後にあるすべてのものを基底のシェルに渡すので、Windowsではcmd.exeで、これは環境変数%LIKE_THIS%です。その表記法を使用しようとすると、vimはジャンプして%を現在のファイル名に展開します。

どうすればいいですか? exeキーワードを使用します

:exe "%! ".$HOME."\myscript" 

をさんは分析してみましょう:

  • :exeは、文字列を受け取り、それを評価するコマンドである(ほとんどの言語ではeval思う)
  • "!% "エスケープシェルコマンドに。 exeが評価できるように引用符で囲むことに注意してください。また、そこに余分なスペースがあることに注意してください。そうすれば、家庭用の変数を追加するときには、正しくはありません。
  • .$HOMEドットは文字列連結記号です。 $HOMEは、それはそれ以外の場合は、引用符の外にあるが、それVimはここで重要なことは、引用符の$HOME外を保っている(これも引用された)スクリプトおよび可能な引数

    に適切に

  • ."/myscript"パス、それを展開することができるように連結しますWindows上で正しく展開されないことがあります。

1

おそらくexpandのような機能が必要です。例:

:echo expand("$HOME/hello") 
/home/amir/hello 

でexpand()の詳細を確認できます。

関連する問題