![gVim 作为 cygwin 下的 git 编辑器](https://linux22.com/image/1289525/gVim%20%E4%BD%9C%E4%B8%BA%20cygwin%20%E4%B8%8B%E7%9A%84%20git%20%E7%BC%96%E8%BE%91%E5%99%A8.png)
我使用 msysgit 并且希望将 gvim 作为我的 git 编辑器。
我使用 cygwin bash 而不是 git bash。
跑步
$ /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe
启动 gvim。但如果我将其设置为 git 编辑器:
$ git config core.editor /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe
并运行提交我得到:
/cygdrive/c/Program Files (x86)/Vim/vim73/gvim.exe: -c: line 0: syntax error near unexpected token `('
然后我在需要的地方添加转义的反斜杠:
$ git config core.editor /cygdrive/c/Program\\\ Files\\\ \\\(x86\\\)/Vim/vim73/gvim.exe
这仍然给我:
/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe: /cygdrive/c/Program Files (x86)/Vim/vim73/gvim.exe: No such file or directory
error: cannot run /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe: No such file or directory
error: There was a problem with the editor '/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe'.
问题是,我可以复制“无法运行”后面的字符串并粘贴它,它就可以运行。我猜这可能是由 Program Files (x86) 中的空格或括号引起的(他们到底在想什么?)。
由于 cygwin 似乎可以很好地处理它,我认为我可以在 /usr/local/bin 中创建一个符号链接,因为它在我的 $PATH 中,并设置
$ git config core.editor /usr/local/bin/gvim
我确认 /usr/local/bin/gvim 启动了 gvim。但是,运行提交后,我得到:
error: cannot spawn /usr/local/bin/gvim.exe: No such file or directory
error: There was a problem with the editor '/usr/local/bin/gvim.exe'.
取消设置 core.editor 并尝试
$ export GIT_EDITOR=/usr/local/bin/gvim.exe
给了我同样的错误。
这所以回答建议我使用脚本来打开编辑器。
我从 /usr/local/bin 中删除软链接 gvim.exe,然后
$ cat > gvim
#!/bin/sh
/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe
$ chmod u+x gvim
我测试运行该脚本,它运行正常,gvim 启动了。
$ gvim
不幸的是当我运行提交时我收到错误
$ git commit
error: cannot spawn /usr/local/bin/gvim: No such file or directory
error: There was a problem with the editor '/usr/local/bin/gvim'.
我该怎么做才能使用 gVim 作为 git 编辑器?有人试过吗?我犯过错误吗?我必须承认,在 Linux 方面,我是个新手。
答案1
git config 似乎删除了一层引号,因此请添加另一层。这对我来说有效(使用另一个编辑器):
git config core.editor "\"c:/Program Files (x86)/Vim/vim73/gvim.exe\""
(请注意路径周围的转义引号,这会导致编辑器在您执行例如 git commit 时启动为“c:/Program Files (x86)/Vim/vim73/gvim.exe”,因此使用引号告诉 bash shell 不要尝试将 () 解释为它认为的任何意思。)
答案2
当使用路径名中的空格时,通常最好将它们括在引号中。这将解决您的问题:
git config core.editor "/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim73/gvim.exe"
答案3
#!/bin/dash -e
if [ "${1#/}" != "$1" ]
then k=$(cygpath -w "$1")
elif [ "$#" != 0 ]
then k=$1
fi
exec gvim ${k+"$k"}
若无路径,则不通过任何路径
如果路径为空,则传递空路径
如果路径是相对的,则按原样传递
如果路径是绝对路径,则转换为 Windows 格式
然后我设置这些变量:
export EDITOR=gvim.sh
export GIT_EDITOR='dash /usr/local/bin/gvim.sh'
EDITOR 允许脚本与 Git 协同工作
GIT_EDITOR 允许脚本使用中心命令