16

我无法从 cygwin 运行 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

4

11 回答 11

9

我为此编写了cyg-wrapper.sh

它支持:

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

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

  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.exe中的路径gvim()允许启动 gvim 而无需更改路径以匹配当前的 Vim 版本(实际上可能在Progra~2);但是,它似乎也打开了一个多余的cmd.exe窗口。

于 2012-09-30T12:38:17.690 回答
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

更新 2 给 babun 用户!

好的,自从最初与这个搏斗后,我最终放弃了原来的 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 弄乱您的干净外壳,并且您不再需要“拒绝”

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

于 2015-04-03T19:27:48.343 回答
8

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

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

于 2012-09-29T19:03:53.270 回答
4

这是您需要做的所有事情:

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

也适用于记事本++,如下所示:

alias np="run.exe /cygdrive/c/Programming/Tools/Notepad++/notepad++.exe"
于 2014-06-04T19:06:42.773 回答
3

由于 $SHELL var,我遇到了同样的问题

所以,我很喜欢这样

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

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

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

于 2013-04-18T00:46:09.630 回答
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。

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

于 2013-08-13T07:34:00.500 回答
1

这是对low351的回答的起飞。我对在 cygwin 终端中更改 HOME 感到不满意,因为我在本地将其用于 cygwin HOME,而不是我的 Windows 主页。但是 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
>
于 2016-01-22T19:03:36.683 回答
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
于 2014-04-07T20:58:04.113 回答
0

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

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

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

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

于 2013-12-15T17:53:04.437 回答
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'
于 2016-10-17T13:04:01.767 回答
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 "$@" | 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

于 2015-08-13T19:58:35.733 回答