Как запустить windows gvim из cygwin?

Я не могу запустить gvim из cygwin. Когда я пытаюсь открыть новый файл с помощью

gvim filename 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 еще

Ответы

Ответ 1

Нашел эту тему, я нашел ответ от jens неприемлемым. Мы не просим, ​​чтобы мне сказали не делать этого. Мне не нравились другие ответы, либо всегда была какая-то причуда, например, настройки не использовались или появилось дополнительное окно командной строки. Я сделал некоторые копания, и это работает для меня. Нет лишнего окна командной строки для ничего, и он использует мои собственные настройки gvim.

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

Вам просто нужно изменить ДОМОЙ к своему. Чтобы узнать, что положить туда запустить gvim из окон, тогда введите ": echo $HOME" и нажмите enter в моем случае, показывая P: \, чтобы он переводился в /cygdrive/p/

Также, если ваш gvim.exe находится в другом каталоге/версии, вам нужно будет настроить.

Теперь, когда я набираю 'gvim script.sh' в командной строке cygwin, он запускает 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 в пользу бабуна, которая кажется менее сложной для тех, кто хочет использовать функциональность linux в окнах без полномасштабного виртуального. Конечно, мой gvim-запуск script сломался, и мне пришлось сделать следующее в моем файле .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
} 

* Примечание: окружающие изогнутые фигурные скобки() останавливают идентификатор задания от испортить вашу чистую оболочку, и вам больше не нужно "отключать"

P.S. Единственная оставшаяся досада с этим сейчас заключается в том, что вы не можете "выйти" из оболочки babun до тех пор, пока все запущенные вами экземпляры gvim не будут закрыты. Может быть, кто-то может понять это. Я пробовал. Когда вы вводите exit, он просто зависает там, пока вы не выйдете из всех gvims.

Ответ 2

Сделайте себе одолжение, не пытайтесь запускать windows gvim из cygwin. Множество переменных окружения, вероятно, совершенно иное, и боль от разделителей каталогов обратной косой черты, пробелов в именах файлов, невозможность понять/пути cygwin делает это упражнение бесполезным.

Тогда что? Установите cygwin версию gvim и забудьте обо всех этих проблемах.

Ответ 3

Я написал 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 для запуска gvim с 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]"
}

EDIT: В настоящее время (26 сентября 2014 года, используя Vim 7.4), Windows gVim использует C:\Windows\gvim.bat для запуска gVim из командной строки. Замена пути gvim.exe в функции gvim() с помощью этого script позволяет запускать gvim без изменения пути в соответствии с текущей версией Vim (которая может фактически находиться в Progra~2); однако, похоже, также открывается избыточное окно cmd.exe.

Ответ 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"

Ответ 5

У меня такая же проблема из-за $SHELL var

Итак, я просто делаю это

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

Это работает для меня, может быть, это тоже поможет вам.

и, возможно, вы хотите использовать один и тот же псевдоним для vim.

Ответ 6

Я помещаю следующую функцию в свой .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 из любого места.

Он отлично работает для файлов с пробелами...

Ответ 7

Это взлет на low351. Я был недоволен тем, что HOME изменился на терминале cygwin, поскольку я использую его локально для дома 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

действительно, просто сохраняя и восстанавливая ДОМ. Будучи локальным, OLD_HOME уходит, когда функция возвращается, поэтому она не загрязняет окружающую среду. Если вы редактируете файл cygwin, запускайте его через cygpath -w, это сделает путь к файлу, который понимает Windows gvim. Он также позволяет использовать оконные дорожки (например, C:/tmp/foo.txt), но w/unix '/' разделители, поэтому вы можете обойтись без /cygdrive/c. Я считаю, что это совместимо с w/bash. Это дает следующий результат:

> gvim
[2] 5060
>

Ответ 8

Я просто переименовал gvim.bat, который поставляется со стандартной установкой Win32 vim до gvim и помещал ее в /usr/bin.

Я также использую настройки между Win32 GVim и Cygwin VIM, ссылаясь на эту статью:

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

Таким образом, я могу использовать как Vim, так и Win32 Gvim с теми же плагинами и настройками.

Ответ 9

Поскольку я пробовал все это и имел проблемы, я покажу, что я использую. Я написал его в 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

Ответ 10

Здесь script я использую для ~/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"

Особая благодарность этому ответу за технику explorer.exe.

Ответ 11

Похоже, основная проблема заключается в том, что переменные 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'