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

9

我有一个Vim脚本,调用外部shell脚本并将输出读入当前缓冲区。在Unix系统中它工作得很好。我正在尝试使脚本跨操作系统可用,所以我希望它也适用于Windows用户。以下是脚本中相关的行:

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

根据Vim的文档,$HOME应该对于Windows用户也可以正常使用。在Windows XP上使用gvim命令模式时,执行以下操作:
:echo $HOME

确实会产生"C:\Documents and Settings\my_user"。

然而,我的Vim脚本(已调整反斜杠)在Windows机器上失败,并在DOS cmd.exe窗口中显示消息:

$HOME\bin\shell_script"未找到。

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

我也不能使用%APPDATA%,因为Vim将%解释为当前文件,并将文件名预/附加到APPDATA。奇怪的是,Vim 确实扩展%,但不扩展$HOME

我如何正确扩展$HOME?这是因为我在Vim脚本中使用了exe吗?

4个回答

6
你无需使用 ! 来读取文件。
:exe ":0r $HOME/bin/shell_script"

或者在Windows中使用type命令(类似于Linux中的cat命令):

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

注意:

  • type 命令在 Windows shell 中执行,因此路径中需要使用 \(反斜杠)。
  • 如果 $HOME 包含空格,则需要使用 "(双引号)来保留空格的字面值。

1
澄清一下,我想执行外部脚本并将输出插入到缓冲区中。 - Nick Coleman
我没有注意到你将$HOME移动到引号外面了。这样就解决了。谢谢你的回复。 - Nick Coleman

4

为了澄清kev所给出的答案:

在Windows上,当你进入控制台时,$HOME变量无法正确展开。例如,请看下面的代码:

:e $HOME/myscript

这可以工作,因为vim会像往常一样扩展$HOME。另一方面,以下内容将无法正常工作:
:%! $HOME/myscript

为什么?因为vim会将!后的所有内容传递给底层shell,而在Windows上是cmd.exe,该shell支持环境变量%LIKE_THIS%。如果您尝试使用该符号,vim将展开%为当前文件的名称-不易理解。

如何解决?使用exe关键字:

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

让我们来分析一下:
  • :exe 是一个命令,它接受一个字符串并对其求值(类似于大多数语言中的 eval)

  • "!% " 是转义到 shell 命令。请注意,它被引用以便 exe 可以评估它。还要注意有一个额外的空格,这样当我们附加 home 变量时,它不会紧贴着它

  • .$HOME 点是一个字符串连接符号。 $HOME 在引号之外,但被串联起来,这样 vim 可以正确地扩展它

  • ."/myscript" 脚本路径和可能的参数(也被引用了)

    在这里重要的是将 $HOME 保持在引号标记之外,否则在 Windows 上可能无法正常扩展。


2
您可能需要像 expand 函数这样的东西。例如:
:echo expand("$HOME/hello")
/home/amir/hello

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


1

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

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

当您倾向于使用正斜杠时,请设置“shellslash”选项。Vim将在展开文件名时用正斜杠替换反斜杠。当使用类Unix的“shell”时,这特别有用。

这个问题与(反)斜杠无关。问题在于shell根本不理解“$HOME”。 - doubleDown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接