如何在Cygwin中运行Windows版GVim?

16

我无法在Cygwin中运行gvim。当我尝试使用以下命令打开新文件时:

gvim 文件名

gvim会打开一个名为“No name”的文件,并显示以下错误:

Error detected while processing command line
E492: Not editor command: C:\cygwin\home\chandan\l
Press enter or type command to continue 
更令人困扰的是,我无法打开路径中现有的文件。 >which gvim 显示 /usr/bin/gvim 我已经添加了别名 alias gvim=/cygdrive/c/Program\Files\(x86\)/Vim/vim73/gvim.exe,但仍然无法。
11个回答

9

我为了这个目的编写了cyg-wrapper.sh

它支持:

  • 符号链接
  • 不能解释为路径名的选项(参见gvim的-c,或任何以减号开头的标志)。

换句话说,它使我们能够输入:

  gvim /etc/profile -c /PS1 -c "echo 'correctly opened'"
# or even:
  cd ~/tmp ; ln -s ~/bin/cyg-wrapper.sh 
  gvim -d http://hermitte.free.fr/cygwin/cyg-wrapper.sh cyg-wrapper.sh

  explorer -e
  explorer "$vim"
  explorer http://hermitte.free.fr/

注意:我在我的.profile中使用以下函数来使用cyg-wrapper.sh运行gvim。
gvim() {
    opt=''
    if [ `expr "$*" : '.*tex\>'` -gt 0 ] ; then
    opt='--servername LATEX '
    fi
    cyg-wrapper.sh "C:/Progra~1/Edition/vim/vim73/gvim.exe" --binary-opt=-c,--cmd,-T,-t,--servername,--remote-send,--remote-expr --cyg-verbose --fork=2 $opt "$@"
}

编辑:目前(2014年9月26日,使用Vim 7.4),Windows gVim使用C:\Windows\gvim.bat从命令行启动gVim。将gvim()函数中的gvim.exe路径替换为此脚本可在不更改路径以匹配当前Vim版本(实际上可能位于Progra~2中)的情况下启动gvim;但是,它似乎还会打开一个多余的cmd.exe窗口。

这太棒了。谢谢。 - Kyle Strand
现在我可以输入“gvim /tmp/myfile.txt”而不会看到“新目录”。两年来,我一直使用c:\temp,因为我想要vim.org gvim(主要是为了资源管理器集成)。这样好多了。 - johnk73

8

我在这个帖子中找到了答案,但是我认为jens的回答是不可接受的。我们不是要求被告知不要这样做。我也不喜欢其他答案,因为总是有一些怪癖,比如未使用设置或多余的命令行窗口弹出。我进行了一些调查,对我来说这很有效。没有额外的命令行框,它使用我的正确的gvim设置。

alias gvim='HOME=/cygdrive/p/ cygstart /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe'

您只需要将HOME更改为您自己的路径。要找出应该放什么,请从Windows运行gvim,然后输入“:echo $ HOME”,在我的情况下它显示为P:\,因此转换为/cygdrive/p/。

如果您的gvim.exe位于不同的目录/版本中,则需要进行调整。

现在,当我在cygwin命令提示符下键入“gvim script.sh”时,它会启动带有文件的gvim,非常整洁!

更新

我发现了一种稍微更好的方法来做到这一点。使用别名会占用我运行gvim的会话,我希望它作为单独的进程启动,使用“gvim &”是不优雅的,因为它在启动时列出作业编号,并在完成时显示“完成”行。我太过挑剔,所以我想出了如何通过使用函数使其整齐。

只需将以下内容添加到您的.bash_functions文件中,它基于关于主目录和反斜杠使用的先前部分构建。

gvim() {
   ORIGHOME=$HOME
   HOME=/cygdrive/p/
   /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $1 & disown
   HOME=$ORIGHOME
} 2>/dev/null

针对babun用户的更新2!

好的,既然一开始已经尝试过很多方法,我最终放弃了原始的cygwin安装,转而选择了babun,它似乎是一个更少麻烦的设置,适用于那些想要在Windows中获得Linux功能而不需要完整虚拟机的用户。当然,我的gvim启动脚本坏了,我必须在我的.zshrc文件中执行以下操作(babun使用zsh,在一开始我抗拒并将其切换到bash,但后来我屈服了,因为我认为他们必须有理由,他们确实有,我喜欢它)。

gvim() {
   OLD_HOME=$HOME
   OLD_VIMRUNTIME=$VIMRUNTIME
   export HOME=/cygdrive/c/Users/gmitchell/
   export VIMRUNTIME="C:\Program Files (x86)\VIM\vim74"
   TARGET=$(cygpath -w $1)   
   (/cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $TARGET &)
   export HOME=$OLD_HOME
   export VIMRUNTIME=$OLD_VIMRUNTIME
} 

*注意:周围的括号 ( ) 可以防止作业 ID 破坏您的干净 shell,您不再需要 "disown"。

附注:现在唯一剩下的烦恼是,在关闭您启动的所有 gvim 实例之前,您无法 "退出" babun shell。也许有人可以解决这个问题。我试过了。当您键入 exit 时,它只会挂起,直到您退出所有 gvims 为止。


感谢您的细心!这正是我想要的,但有一个缺点:HOME被设置为gvim想要的方式,而不是我的cygwin shell想要的方式。此外,我认为对于C:\P,您应该使用'/cygdrive/c/P'。 - jspencer
你说得对,本来应该是 /cygdrive/c/P 的,但是当我输入时搞错了,因为我的Windows主目录被设置为P驱动器,所以显示的是P:\。我没有注意到这个问题是关于cygwin和gvim主目录设置的区别,我刚试过了,你是对的,它会改变我的cygwin shell的$HOME。我将修改我的脚本,以通过命令传递原始的 $HOME。 - low351
@jspencer,刚刚注意到您发布了修复程序,干得好。感谢您和我一样讲究:)我正在使用您的版本... - low351

8

请自己一个忙,不要试图从cygwin运行Windows gvim。环境变量的集合可能完全不同,反斜杠目录分隔符、文件名中的空格、无法理解/cygwin路径的痛苦使这成为一种徒劳的练习。

那么,接下来呢?安装cygwin版本的gvim并忘记所有这些问题。


谢谢Jens。在执行>startxwin之后,我能够在新窗口中打开gvim文件。但是我的主目录中的.gvimrc文件没有被识别。请告知如何解决。 - Chandan Choudhury
我通常使用Windows gVim进行编辑;我甚至使用Cygwin gVim只是为了从Cygwin shell中快速访问编辑器(我使用它来轻松访问友好的*NIX命令行实用程序)。但我发现在一台机器上使用两个不同版本的Vim是一场噩梦;即使我设法让它们都使用相同的“vimrc”文件,我仍然需要启动XWin才能启动编辑器,并且我还遇到了各种奇怪的问题。因此,不要简单地拒绝使用本地版本;对于我们中的一些人来说,这是非常痛苦的。 - Kyle Strand
1
@Kyle Strand,只需将xinit添加到Windows启动项中即可。它占用不到2MB的空间,我可以随时使用漂亮的gvim与我的控制台vim相匹配。能否详细说明其他问题?scrooloose vimrc对我来说没有任何问题... - Gordon
@Gordon 我想我可以这样做,那样的话我可能会一直使用Cygwin vim - 虽然我不确定如何使启动它像启动本地gVim一样容易(例如通过右键单击上下文菜单),或者是否可能;无论如何,我需要花更多的时间来尝试让它像我想要的那样好用。无论如何,我的另一个主要问题是字体;也许对于更熟悉Cygwin/XWin中字体工作方式的人来说,可以快速轻松地获得可接受的字体,但我无法证明花费时间是有道理的。 - Kyle Strand
简而言之,这并不是“Cygwin解决方案根本行不通,因为<无论什么>”,而是“尽管Cygwin解决方案可能可行,但cyg-wrapper解决方案快速简便,并且到目前为止似乎完全符合我的要求”。 - Kyle Strand
显示剩余2条评论

4
以下是您需要做的所有事情:

步骤如下:

alias gvim="run.exe /cygdrive/c/Programming/Tools/Vim/vim74/gvim.exe"

这也适用于Notepad++,操作如下:

alias np="run.exe /cygdrive/c/Programming/Tools/Notepad++/notepad++.exe"

1
这似乎可以工作,但对我来说它无法正确加载我Windows主目录中的_vimrc文件。它也无法加载我cygwin主目录中的.vimrc文件。 - Kevin S.

3

我有相同的问题,因为$SHELL变量

所以,我简单地像这样做:

alias gvim='cmd /c "set SHELL=cmd & start gvim"'

对我来说有效,也许对你有帮助。

也许你想在vim中使用相同的别名。


2
我将以下的函数写入了我的.bashrc配置文件中:
function gvim
{
    GVIM_CMD=/cygdrive/c/path/to/gVimPortable.exe
    if [[ -z "$1" ]]
    then
      $GVIM_CMD
    else
      $GVIM_CMD `cygpath -w $1`
    fi
}

这使我能够从任何地方启动gVim。

对于名字中有空格的文件也可以正常工作...


值得注意的是,我只能通过使用短格式的Windows路径(/cygdrive/c/PROGRA~2/Vim/vim74而不是/cygdrive/c/Program\ Files\ (x86)/Vim/vim74)才能使其正常工作。您可以使用cygpath获取系统的正确路径:$ cygpath -d /cygdrive/c/Program\ Files\ (x86)/Vim/vim74/ - roguenet

1
这是对low351答案的补充。我不满意在cygwin终端中更改HOME,因为我在本地使用它作为cygwin HOME,而不是我的Windows home。但是gvim已经设置好了Windows HOME。我在我的.zshrc文件中添加了以下内容:
# run windows gvim from command line
gvim() {
   local OLD_HOME=$HOME
   HOME=/cygdrive/c/Users/jason/
   local TARGET=$(cygpath -w $1)
   /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe $TARGET & disown
   HOME=$OLD_HOME
} 2>/dev/null

实际上,只需存储和恢复HOME即可。由于OLD_HOME是本地的,所以当函数返回时会被清除,因此不会污染环境。如果您正在编辑cygwin文件,则通过cygpath -w运行它将使其成为windows gvim可以理解的文件路径。它还允许您使用窗口路径(例如C:/tmp/foo.txt),但带有unix“/”分隔符,因此您可以省略/cygdrive/c。我相信这与bash是兼容的。这将给出以下输出:

> gvim
[2] 5060
>

1
似乎主要问题在于HOME和VIM变量,它们适用于cygwin环境,但在运行Windows gvim时被导出,导致问题,因为Windows gvim不了解cygwin。这样修复它:
alias gvim='env -u HOME -u VIM /cygdrive/c/Program\ Files\ \(x86\)/Vim/vim74/gvim.exe'

我将Windows gvim设置为许多文件类型的默认应用程序(在Windows中),因此Windows gvim经常通过open别名打开。以下解决了这种情况:

alias open='env -u HOME -u VIM cygstart'

0

既然我尝试了所有这些并遇到了问题,我将展示我正在使用的内容。我用Ruby编写了它,并且可以处理我抛出的所有内容(文件、目录或无)而不会出现任何错误/弹出窗口等。

我将其保存为gvim在~/Dropbox/bin/cygwin/中(该路径已在我的PATH中)

#!/usr/bin/env ruby

args=''
filepath=''
arg=ARGV[0]

if arg
    if File.exist? arg
        if File.file? arg
            args+="--remote-tab-silent "
        end
        filepath=`cygpath -w '#{arg}'`.strip
        filepath="'#{filepath}'"
    end
else
end


exe="'/c/Program\ Files\ \(x86\)/vim/vim73/gvim.exe' #{args} #{filepath}"
spawn exe

0

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