2012-09-29 198 views
15

我无法从cygwin运行gvim。当我尝试打开一个新的文件,:如何从cygwin运行windows gvim?

gvim的文件名 gvim的打开与“没有名字”,并显示错误文件中:

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仍然

回答

6

发现这个线索,我觉得从jens不可接受的答案。我们不是要求被告知不要这样做。我不喜欢其他答案,总是有一些怪癖,比如没有使用的设置或弹出一个额外的命令行窗口。我做了一些挖掘,这对我有用。没有额外的命令行框,它使用我正确的gvim设置。

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

你只需要改变你自己的HOME。为了找出要在那里运行gvim,然后放入“:echo $ HOME”,并在我的情况下输入显示P:\,以便翻译为/ cygdrive/p/

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

现在,当我在cygwin命令提示符下键入'gvim script.sh'时,它会用该文件启动gvim,所有的都很好,很整洁!

UPDATE

我找到了一个稍微好一点的方式来做到这一点。使用别名绑定我的会话,我运行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 

更新2 babun用户!自从有了这个本来我已经结束了再杀原来的cygwin赞成babun的,这似乎是在窗户那些想要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,你不再需要“断绝关系”

PS现在唯一剩下的烦恼就是在你启动的所有gvim实例都关闭之前,你不能“退出”babun shell。也许有人可以认为这是自己的。我试过了。当你键入exit时,它会挂在那里,直到你退出所有的gvim。

+0

谢谢你的烦恼!这个工作就像我想要的一样,有一个缺点:HOME按照gvim的方式设置,而不是我的cygwin shell想要的方式。另外,我认为对于C:\ P,你会想使用'/ cygdrive/c/P'。 – jspencer

+0

你是正确的,它应该是/ cygdrive/c/P,但当我以某种方式键入它时,它显示P:\,因为我的Windows homedir被设置为P驱动器。我没有注意到cygwin vs gvim home设置的问题,我只是试了一下,你是正确的,它会让我的cygwin shell改变$ HOME,我将通过命令修复我的脚本以携带原始的$ HOME。 – low351

+0

@jspencer,刚注意到你发布了一个修复程序,做得很好。感谢像我一样挑剔:)我正在使用你的版本... – low351

9

帮你一个忙,不要试图从cygwin运行Windows gvim。这组环境变量可能完全不同,并且反斜线目录分隔符,文件名中的空白,无法理解/ cygwin路径的痛苦使得这是徒劳的。

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

+0

谢谢Jens。在> startxwin后,我可以在新窗口中用gvim打开文件。但我的主目录中的.gvimrc文件未被识别。请让知道如何。 –

+0

可能你和gvim不同意你的主目录是哪个目录。 'gvim -u .gvimrc'工作吗? – Jens

+0

yes gvim -u .gvimrc.vim文件名打开一个文件名背景为黑色的文件。但是现在,在设置别名后,现在在Luc的页面中给出了我之前安装的语法插件,所以我更喜欢这一点。 –

7

为了这个唯一目的,我写了cyg-wrapper.sh

它支持:

  • 符号链接必须不能被解释为路径名(见-c与GVIM,或任何标志开始用减号)
  • 选项。

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

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() { 
    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 "[email protected]" 
} 

运行GVIM

编辑:目前(2014年9月26日,使用Vim 7.4),Windows gVim使用C:\Windows\gvim.bat从命令lin启动gVim即使用此脚本替换gvim()函数中的gvim.exe路径允许启动gvim而不更改路径以匹配当前的Vim版本(实际上可能在Progra~2);不过,它似乎也打开了一个多余的窗口。

+0

非常感谢Luc ..它终于成功了 –

+0

这真棒。谢谢。 –

3

我因为$ SHELL VAR

同样的问题 所以,我简单的做这样的

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的。

它工作正常的文件用空格,太...

+0

值得注意的是我唯一可以得到这个工作的方式是用简短的窗口路径(/ cygdrive/c/PROGRA〜2/Vim/vim74而不是/ cygdrive/c/Program \ Files \ \(x86 \)/VIM/vim74)。您可以使用cygpath为您的系统获取正确的路径:$ cygpath -d/cygdrive/c/Program \ Files \ \(x86 \)/ Vim/vim74/ – roguenet

0

因为我已经尝试了所有这些,并遇到问题,我会显示我正在使用的。我用红宝石编写它,它处理所有我扔在它(文件,目录,或什么都没有),没有任何错误/弹出/等等。

我保存为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 
4

这里是所有你需要做的:

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

作品也与记事本+ +,就像这样:

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

这似乎工作,但对我来说它不会加载我的Windows主目录中的_vimrc正确。它不会将.vimrc加载到我的cygwin主目录中。 –

0

下面是我用于~/bin/gvim的脚本。它运行它就好像我从“运行”对话框调用gvim FOO(感谢批处理文件被explorer.exe调用)。使用命令行不能很好地播放,但是自删除批处理文件可以解决问题。

#!/bin/bash 

TEMPFILE_NAME=gvim-`date +%s`-${RANDOM}.bat 
TEMPFILE=$TMP/$TEMPFILE_NAME 
TEMPFILE_W=`cygpath --windows --absolute --long-name "$TEMPFILE"` 
TARGET= 

if [ "$1" = "" ] ; then 
    TARGET=`cygpath --windows --absolute --long-name "."` 
else 
    TARGET=`cygpath --windows --absolute --long-name "[email protected]" | tr '\n' ' '` 
fi 

WIN_GVIM=`where gvim.exe | tr -d '\r\n'` 
WIN_GVIM=`cygpath "$WIN_GVIM" --windows --absolute --long-name` 

unix2dos > $TEMPFILE << EOF 
start "gvim" "$WIN_GVIM" $TARGET 
DEL %~f0 
EOF 
chmod +x $TEMPFILE 

explorer.exe "$TEMPFILE_W" 

特别感谢this answerexplorer.exe技术。

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。我相信这是所有兼容w/bash。这给出了以下的输出:

> gvim 
[2] 5060 
> 
0

这似乎是主要问题是运行Windows gvim的时候,造成的问题,因为Windows GVIM一无所知的Cygwin这是适合于Cygwin环境HOME和VIM变量获得出口。这修复它:

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'