如何从cygwin运行windows gvim?

时间:2012-09-29 15:42:09

标签: vim cygwin

我无法从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 个答案:

答案 0 :(得分:8)

帮自己一个忙,不要试图从cygwin运行windows gvim。环境变量集可能完全不同,反斜杠目录分隔符的痛苦,文件名中的空白,无法理解/ cygwin路径使得这一操作变得徒劳无功。

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

答案 1 :(得分:8)

我出于这个目的写了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中使用以下函数来运行gvim with 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 "$@"
}

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

答案 2 :(得分:7)

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

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

您只需将HOME更改为您自己的。要找出放置什么,从windows运行gvim然后放入":echo $ HOME"并在我的情况下按Enter键显示P:\所以转换为/ cygdrive / p /

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

现在当我输入' gvim script.sh'在cygwin命令提示符下,它启动gvim文件,一切都很好,整洁!

<强> 更新

我发现了一种更好的方法。使用别名占用了我运行gvim的会话,我希望它作为一个单独的进程启动,使用&#34; gvim&amp;&#34;因为它在启动时列出了工作号并且显示了一个&#34;完成&#34;线完成后。我太挑剔了所以我想通过使用一个函数来弄清楚如何整理。

只需将其添加到.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用户

UPDATE 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弄乱你的干净外壳,而你不再需要&#34; disown&#34;

P.S。现在唯一剩下的烦恼就是你不能退出&#34; babun shell直到你发起的所有gvim实例都关闭了。也许有人能想出自己的想法。我试过了。当您输入exit时,它会挂起,直到您退出所有gvims。

答案 3 :(得分: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"

答案 4 :(得分:3)

我有同样的问题 因为$ SHELL var

所以,我很简单就喜欢这个

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

它适用于我,也许这对你也有帮助。

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

答案 5 :(得分: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。

它也适用于带空格的文件......

答案 6 :(得分:1)

这是low351的回答。因为我在本地使用cygwin HOME而不是我的windows home,我很不高兴离开HOME在cygwin终端。但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)但使用w / unix'/'分隔符,因此您可以省略/cygdrive/c。我相信这是完全兼容的w / bash。这给出了以下输出:

> gvim
[2] 5060
>

答案 7 :(得分:0)

我刚刚将标准Win32 vim安装附带的gvim.bat重命名为gvim并将其放入/ usr / bin。

我还在Win32 GVim和Cygwin VIM之间共享设置,参考这篇文章:

http://vim.wikia.com/wiki/Synchronize_configuration_to_many_computers

这样我可以使用相同的插件和设置运行Vim和Win32 Gvim。

答案 8 :(得分:0)

由于我已经尝试了所有这些并且遇到了问题,我将展示我正在使用的内容。我在ruby中编写它,它处理我抛出的所有内容(文件,目录或什么都没有),没有任何错误/弹出/等等。

我将它保存为〜{Dropbox / bin / cygwin /中的gvim(在我的路径中)

#!/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

答案 9 :(得分:0)

这是我用于~/bin/gvim的脚本。它就像我从&#34; Run&#34;中调用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 "$@" | 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"

特别感谢explorer.exe技术的this answer

答案 10 :(得分:0)

似乎主要的问题是在运行Windows gvim时,适合于cygwin环境的HOME和VIM变量被导出,导致问题,因为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'