Как запустить 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'