我有一个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}}吗?
答案 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()的更多信息。