2012-02-19 103 views
8

我有一個Vim腳本調用外部shell腳本並將輸出讀入當前緩衝區。它在Unix系統中工作正常。我試圖讓腳本與操作系統無關,所以我希望它也可以用於Windows用戶。下面是從腳本中的相關行:如何在Vim腳本中使用Windows環境變量?

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

根據Vim的文檔,$HOME應該爲Windows用戶翻譯也沒關係。在Win XP上以命令模式使用gvim,做

:echo $HOME 

確實產生「C:\ Documents and Settings \ my_user」。

然而,我的Vim腳本(調整反斜槓)在Windows機器上失敗,並在DOS窗口的CMD.EXE說

$ HOME \ BIN \的shell_script」未找到的消息。

換句話說,Vim中似乎沒有將它傳遞給cmd.exe的前擴大$HOME值。

我不能使用%APPDATA%要麼因爲Vim解釋%作爲真正水流nt文件並預先/附加文件名到APPDATA。奇怪的是Vim 確實擴大%但不擴大$HOME。如何獲得$HOME正確擴展?是否因爲我在vim腳本中使用exe

回答

0

在這裏,你有VIM約斜線和反斜線的一些信息:

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

如果你喜歡使用斜線,設置了「shellslash」選項。 當擴展 文件名時,Vim將用正斜槓替換反斜槓。這在使用類Unix的'shell'時特別有用。

+0

這個問題不是關於(後退)斜線。這裏的問題是shell根本不理解'$ HOME' – doubleDown 2013-08-14 19:38:00

6

您不需要!來讀取文件。

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

或Windows(如在Linux cat)讀type命令:

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

注:

  • type在Windows中執行的外殼,所以你需要\(反斜槓)
  • 如果$HOME包含space S,你需要"(雙引號),以保留的字面意義space小號
+1

爲了澄清,我想執行外部腳本並將輸出插入緩衝區。 – 2012-02-19 04:29:15

+0

@NickColeman只要刪除'type',並再次運行。 – kev 2012-02-19 04:45:16

+0

我錯過了您在報價之外移動了$ HOME。這解決了它。謝謝回覆。 – 2012-02-19 10:53:21

4

要澄清千電子伏給出了答案:

在Windows上,$ HOME變量不擴大當你逃到控制檯時正確。因爲Vim擴展$ HOME正常

:e $HOME/myscript 

這個工作:例如,請考慮此代碼。另一方面,這將不起作用:

:%! $HOME/myscript 

爲什麼?因爲vim將!之後的所有內容都傳遞給底層的外殼,在Windows上它是cmd.exe,它的作用是環境變量%LIKE_THIS%。如果您嘗試使用該表示法,vim將跳入並將%擴展爲當前文件的名稱 - 請參閱圖。

如何避開它?使用exe關鍵字:

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

我們來分析一下:

  • :exe是接受一個字符串,並評估它(認爲大多數語言EVAL)
  • "!% "逃逸到shell命令的命令。請注意,它被引用以便exe可以評估它。還要注意這裏有多餘的空間,這樣當我們追加home var時,它不會但是正確地抵抗它
  • .$HOME點是一個字符串連接符號。該$HOME是報價之外,但串聯使得Vim可以展開適當
  • ."/myscript"路徑腳本和可能的參數(還援引)

    這裏最重要的是保持$HOME外引號,否則它可能無法在Windows上正確展開。

1

您可能需要類似expand函數。例如:

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

您可以通過:help expand找到更多關於expand()的信息。