如何在Vim脚本中使用Windows环境变量?

时间:2012-02-19 03:03:50

标签: windows vim environment

我有一个Vim脚本,它调用外部shell脚本并将输出读入当前缓冲区。它在Unix系统中运行良好。我试图使脚本与操作系统无关,所以我希望它也适用于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"没找到。

换句话说,在将$HOME传递给cmd.exe之前,Vim似乎没有扩展%APPDATA%的值。

我无法使用%,因为Vim会将APPDATA解释为当前文件,并将文件名前/后附加到%。很奇怪Vim 扩展$HOME但不扩展$HOME

如何正确展开exe?是因为我在vim脚本中使用{{1}}吗?

4 个答案:

答案 0 :(得分:6)

您不需要!来阅读文件。

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

或者在Windows中读取type命令(如linux中的cat):

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

注意:

  • type在Windows shell中执行,因此路径中需要\(反斜杠)
  • 如果$HOME包含space,您需要"(双引号)来保留space s
  • 的字面值

答案 1 :(得分:4)

澄清kev给出的答案:

在Windows上,当您转到控制台时,$ HOME变量无法正确展开。例如,请考虑以下代码:

:e $HOME/myscript

这是有效的,因为vim正常扩展$ HOME。另一方面,这不起作用:

:%! $HOME/myscript

为什么呢?因为vim将!之后的所有内容传递给底层shell,而在Windows上cmd.exe执行环境变量%LIKE_THIS%。如果您尝试使用该表示法,vim将跳入并将%扩展为当前文件的名称 - 转到图。

如何绕过它?使用exe关键字:

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

让我们分析一下:

  • :exe是一个接受字符串并对其进行评估的命令(在大多数语言中都认为是eval)
  • "!% "转到shell命令。请注意,引用它以便exe可以对其进行评估。还要注意那里有一个额外的空间,以便当我们附加home var时它不会反对它
  • .$HOME点是字符串连接符号。 $HOME在引号之外但是连接在一起,以便vim可以正确扩展它
  • ."/myscript"脚本路径和可能的参数(也引用)

    这里重要的是将$HOME保留在引号之外,否则可能无法在Windows上正确展开。

答案 2 :(得分:1)

这里有一些关于vim中斜杠和反斜杠的信息:

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

  

如果您更喜欢使用正斜杠,请设置'shellslash'选项。   然后Vim在扩展时用正斜杠替换反斜杠   文件名。这在使用类似Unix的“shell”时特别有用。

答案 3 :(得分:1)

你可能需要像expand这样的功能。例如:

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

您可以使用:help expand了解有关expand()的更多信息。