【问题标题】:Setting Cygwin shell path on Vim for Windows在 Vim for Windows 上设置 Cygwin shell 路径
【发布时间】:2012-12-04 09:56:41
【问题描述】:

我正在尝试在 Windows 上设置 Vim,使用 Git bash (Cygwin) 作为 shell 环境。我收到一个关于临时文件的错误,我 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 路径?

【问题讨论】:

    标签: windows vim cygwin git-bash


    【解决方案1】:

    你几乎猜对了。您需要转义每个周围的 "。w​​indows 要求您将字符串括在引号中,而不是转义一个空格。但是 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 中使用这个 sn-p 将 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 在评论中提到的,当 shell 设置为 bash 或 sh 时,在 win32 gvim 上不起作用的插件应该被修复。我同意......但根据我的经验,这并不总是可行的。所以我总是将 shell 设置回 $COMSPEC(通常是 cmd.exe)。如果您的插件没有任何问题,那很好,请忽略我的旁注。)

    【讨论】:

    • 我确实使用win32版本的vim和cygwin,以及bash作为&shell,到目前为止我没有任何问题。可以修复有缺陷的插件,并且应通知作者他们必须操作的更正以使其插件可移植。
    • @LucHermitte - 你说得对,应该修复有问题的插件。我过去曾报告过问题,但无法让作者接受我的拉取请求。如果你的插件没有问题,那么在 win32 gvim 中使用 cygwin bash 作为 shell 是不错的选择。我只是说我的经验是我必须重置 &shell。
    • 感谢您的意见。 @darcyparker 我选择您的答案作为正确答案,纯粹是因为它解决了我在转义空格方面遇到的特定问题,但这是一个有趣的观点,即使用has() 检测外壳的正确性。
    • 当我尝试使用 Windows 7 和 vim 7.4 时,即:set shell=\"C:\Program\ Files\Git\bin\sh.exe\" 我得到'C:\Program' is not recognized as an internal or external command, operable program or batch file.'。它对其他人有用吗?
    【解决方案2】:

    我使用以下定义从 win32-gvim 运行外部 cygwin 相关的可执行文件:https://github.com/LucHermitte/vim-system-tools/blob/master/plugin/system_utils.vim#L467(其他 shell 选项也很重要)

    但是,我建议您将 cygwin 入口点放入 %PATH%。这将是最简单的方法。

    【讨论】:

    • 该示例并未真正展示如何将 shell 设置为带空格的路径。添加到 %PATH% 可能有效...然后您不需要定义 shell 可执行文件的完整路径。但这更像是一种解决方法。
    • 确实,这是一种解决方法。我通常的做法是let &shell=FixPathName('c:/path with spaces/and/so/on/bash')
    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 2014-02-08
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2013-11-22
    相关资源
    最近更新 更多