在Windows上为Vim设置Cygwin shell路径

7
我正试图在Windows上使用Git Bash(Cygwin)作为Shell环境来设置Vim。我遇到了一个关于临时文件的错误,我99%确定与无法加载Shell有关(即“!”命令无法工作)。
在我的_vimrc文件中,我尝试将shell选项设置为各种内容,但都没有成功。我的Cygwin / Git Bash命令路径为C:\Program Files\Git\bin\sh.exe,空格似乎引起了问题。以下是我尝试过的一些方法,但都没有成功:
:set shell=C:\Program Files\Git\bin\sh.exe    " Error = Unknown options: Files/Git/bin/sh.exe

:set shell=C:/Program Files/Git/bin/sh.exe    " Error = Unknown options: Files/Git/bin/sh.exe

:set shell="C:/Program Files/Git/bin/sh.exe"  " Error when running a command: shell option is empty

:set shell=C:/Program\ Files/Git/bin/sh.exe   " Error when running a command: 'C:/Program' is not recognized as an internal or external command...

有人知道我如何设置包含空格的shell路径吗?
2个回答

10

你差不多做对了。你需要转义每个双引号。Windows需要你将字符串用引号括起来而不是转义空格。但是Vim会将引号解释为注释,所以你需要转义双引号。你还需要使用反斜杠来转义空格。

请参考:h 'shell'中的示例(注意在shell周围加上单引号是必要的,这样才能获得有关shell选项的帮助。否则,您会得到有关shell ex命令的帮助)。

:set shell=\"C:\Program\ Files\Git\bin\sh.exe\"

您可以通过输入以下命令来检查该值:

:echo &shell

附带一提,我建议不要在win32 gvim中使用bash/sh。许多插件测试has("win32")并构建适用于cmd.exe而不是&shell值的shell命令。结果,如果shell不是cmd.exe,这些插件将失败。理想情况下,这些插件应该测试&shell值,而不是使用has("win32")。因此,即使我从cygwin中调用win32 gvim,我也总是在我的vimrc中使用这个片段将shell设置回cmd.exe或更好的是$COMSPEC

if has("win32") || has("win64") || has("win16")
  "I do other stuff in here...

  "Then only inside this if block for windows, I test the shell value
  "On windows, if called from cygwin or msys, the shell needs to be changed to cmd.exe
  if &shell=~#'bash$'
    set shell=$COMSPEC " sets shell to correct path for cmd.exe
  endif
endif

编辑:正如@LucHermitte在评论中提到的,如果设置为bash或sh时不适用于win32 gvim的插件应进行修复。我同意...但是根据我的经验,这并不总是可行的。因此,我总是将shell设置回$COMSPEC(通常是cmd.exe)。如果您的插件没有任何问题,那就很好,请忽略我的侧记。


我使用cygwin的win32版本vim,以bash作为&shell,目前还没有遇到任何问题。有问题的插件可以修复,并且应该通知作者进行更正以使其插件可移植。 - Luc Hermitte
@LucHermitte - 您说的没错,有问题的插件应该被修复。我以前也报告过问题,但无法让作者接受我的拉取请求。如果您的插件没有问题,那么在win32 gvim中使用cygwin bash作为shell是不错的选择。我只是想说我的经验是我必须重置&shell。 - darcyparker
感谢你们两位的回答。@darcyparker 我选择你的答案作为正确答案,因为它纯粹解决了我在转义空格方面遇到的问题,但是关于使用 has() 检测 shell 的正确性提出了一个有趣的观点。 - Jon Cairns
1
当我尝试使用以下命令:set shell=\"C:\Program\ Files\Git\bin\sh.exe\"时,我在Windows 7和vim 7.4上遇到了错误消息“'C:\Program' is not recognized as an internal or external command, operable program or batch file.'”,其他人能否正常工作? - mjeppesen

1

这个例子并没有真正展示如何将shell设置到带有空格的路径。将其添加到%PATH%可能会起作用...然后您就不需要定义shell可执行文件的完整路径。但这更像是一种解决方法。 - darcyparker
确实,这是一个解决方法。我的通常做法会像这样:let &shell=FixPathName('c:/path with spaces/and/so/on/bash') - Luc Hermitte

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