2012-02-19 63 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()的信息。

相关问题