Пусть gVim всегда запускает один экземпляр

Есть ли способ разрешить gVim запускать только один экземпляр, чтобы при открытии нового файла он автоматически открывался на новой вкладке в текущем запущенном экземпляре?

Я знаю, что вы можете сделать это, передав --remote-tab-silent, но я хочу настроить gvim так, чтобы это стало поведением по умолчанию. т.е. я хочу ввести gvim filename и заставить его действовать так, как будто я передал ему параметр --remote-tab-silent.

gVim 7.2

Редактировать

Я нахожусь в окнах (перспектива)


person hasen    schedule 01.06.2009    source источник
comment
Я написал сценарий оболочки, который делает именно это и немного больше (например, добавляет параметр контекстного меню для открытия файлов в том же экземпляре GVim, щелкнув их правой кнопкой мыши). Вот ссылка: github.com/susam/vimer. Он работает в Windows, Linux и OS X. В Windows просто загрузите скрипт и переименуйте его в gvim.cmd, и тогда все три часто используемые команды будут работать так, как вы ожидаете, т.е. gvim запустит новый экземпляр GVim, gvim foo.txt bar.txt откроет файлы в запущенный в данный момент экземпляр (если он существует, в противном случае - новый экземпляр), и dir | gvim - направит вывод в gvim.   -  person Susam Pal    schedule 07.01.2016
comment
Однако обратите внимание, что github.com/susam/vimer будет открывать файлы в новых буферах (вместо tabs) в существующем экземпляре GVim. Чтобы вместо этого открывать их в новых вкладках, вам придется использовать параметр -t. Подробнее об этом читайте на странице github.com/susam/vimer#getting-started. Причина использования буферов по умолчанию вместо вкладок: (1) stackoverflow.com / a / 103590/303363 (2) stackoverflow.com/a/26710166/303363 (3) joshldavis.com/2014/04/05/vim- таб-безумие-буферы-против-вкладки   -  person Susam Pal    schedule 07.01.2016


Ответы (11)


Если вы используете оболочку bash (в Linux / OS X / с помощью Cygwin), вам нужно добавить ~/.bashrc файл:

gvim () { command gvim --remote-silent "$@" || command gvim "$@"; }

В Windows, я думаю, у вас может быть gvim.bat пакетный скрипт для достижения того же ...

gvim.exe -p --remote-tab-silent %1 %*

Если gvim.exe отсутствует на вашем пути

Run > Search "Environment"

Отредактируйте переменную PATH для текущего пользователя или системы.

person dbr    schedule 01.06.2009
comment
Вам понадобится alias gvim="gvim --remote-tab-silent || gvim", чтобы избежать Argument missing after: "--remote-tab-silent", когда вы вызываете без имени файла, чтобы открыть пустой документ. - person Tom Viner; 22.03.2011
comment
или, скорее, поместить gvim --remote-tab-silent $@ || gvim $@ в исполняемый файл в ~ / bin / gvimt или подобном. - person Tom Viner; 23.03.2011
comment
@TomViner Теперь я понимаю, что даже с этими решениями сообщение "Аргумент отсутствует после ..." все еще появляется, но затем gvim может открыться (что не в обычном случае.) Это предлагаемый псевдоним выше, это не работает, он только когда-либо открывает новый экземпляр gvim. Однако ваше предложение использовать исполняемый файл сработало, как и добавление следующего в мой .bashrc: gvimt () { command gvim --remote-silent $@ || command gvim $@; }. - person Johann; 29.03.2012
comment
@Johann обновил ответ с вашей функцией (кажется, что быть проблемой при использовании $@ в псевдонимах) - person dbr; 30.03.2012
comment
Несмотря на то, что это работает, он все равно выводит ошибку. Аргумент отсутствует после: --remote-tab-silent. Итак, я перенаправил stderr на / dev / null, как это gvim () { command mvim $@ --remote-silent 2> /dev/null || command mvim $@; } - person blockloop; 05.07.2013
comment
Опоздание на вечеринку: всегда цитируйте "$@", чтобы защитить имена файлов пробелами (или другими символами в $ IFS) - person glenn jackman; 19.07.2013
comment
Мне интересно узнать о% * в командной строке Windows. Насколько я могу судить, это распространяется на все аргументы. Значит, включение% 1 и% * не приведет к повторению% 1? - person Owen; 13.11.2015

Это зависит от вашей операционной системы и оболочки. Используя Linux, вы всегда можете настроить псевдоним, например:

alias gvim='gvim --remote-tab-silent'

в вашем .bashrc (если вы используете bash в качестве оболочки для входа в систему).

В Windows см. Вики-страницу Vim для решения: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows/ >.

person Zsolt Botykai    schedule 01.06.2009

Я обнаружил, что параметр --remote-tab-silent в псевдониме работает по большей части, за исключением случаев, когда я хотел передать параметры в gvim (например, gvim --serverlist) - в этом случае gvim рассматривает параметр как буквальное имя файла, что не годится, поскольку во-первых, это не то, что вы хотели, и, во-вторых, вам нужно очистить буферы от вашего теперь испорченного сеанса vim.

Нецелесообразно использовать другой псевдоним или разрешать _3 _ / _ 4_ иначе для некоторых случаев, таких как следующие.

  • gvim
  • gvim /path/to/files
  • gvim --serverlist
  • gvim -p /path/to/file1 /path/to/file2
  • gvim -t tag filename

Мое решение - следующий сценарий оболочки вокруг gvim (~/.bin/gvim), как предлагает Том Вейнер, но он будет использовать только существующий сервер если ни один из аргументов не является gvim опциями - в противном случае создается новый сервер.

#!/usr/bin/perl

use v5.10;

sub gvim { exec { '/usr/bin/gvim' } '/usr/bin/gvim', @_; }

if (scalar @ARGV) {
  unshift @ARGV, '--remote-tab-silent' unless /^--?/ ~~ @ARGV;
  gvim @ARGV 
}
else {
  chomp(my $serverlist = `gvim --serverlist`);
  if (length $serverlist) {
    gvim '--remote-send', '<Esc>:tabnew<CR>'
  } else { gvim }
}
person shalomb    schedule 22.12.2011
comment
Привет, s.bhooshi, добро пожаловать в stackoverflow и спасибо за ответ. - person Maarten Bodewes; 22.12.2011

alias tvim="gvim --servername `gvim --serverlist | head -1` --remote-tab"

Это заставляет vim открывать новый файл на новой вкладке в том же экземпляре vim. Источник: http://eustaquiorangel.com/posts/477

person SergioAraujo    schedule 28.11.2011

Портативный сценарий оболочки:

Мне немного надоело работать над этим в cygwin + windows, поэтому я, наконец, что-то с этим сделал. Я начал с описанного выше сценария-оболочки, но в итоге сделал его более надежным и многопользовательским, способным работать с * nix и Win.


#!/bin/bash
#bash wrapper for windows/cygwin gvim

#####################################################################
## Cygwin/*nix and Windows gvim wrapper script, alias friendly, path friendly
## Author: Matt Gregory (skyleach (AT) geemale (dot) com)
## Version: 1.5
## Date: Thu Jun 12 10:02:54 2014
## Known Bugs:
## Changes:
##      Thu Jun 12 10:04:08 2014 : Initital posting to StackOverflow
#####################################################################

[[ -z ${WINVIM} ]] && WINVIM=true
[[ -z ${VIMRUN} ]] && export VIMRUN='' #scoping
if [[ ${WINVIM} = false ]]; then
    [[ ! ${VIMRUN} ]] && VIMRUN='/bin/gvim'
    ANS=$("${VIMRUN}" --serverlist | grep GVIM)
else
    [[ ! "${VIMRUN}" ]] && VIMRUN='/cygdrive/c/Program Files/vim/vim74/gvim'
    ANS=$(ps -Wsl | grep "${VIMRUN}" | sed -e "s/\s\+\([0-9]\+\).*/\1/g")
fi
[[ ! -z ${VIM} && ${WINVIM} = true ]] && export VIM=$(cygpath -wal "${VIM}")
RT="--remote-tab"
[[ $ANS ]] || unset RT
if [ ! -z ${DEBUG} ]; then
    echo "WINVIM: ${WINVIM}"
    echo "VIMRUN: ${VIMRUN}"
    echo "ANS: ${ANS}"
    echo "VIM: ${VIM}"
fi
#process arguments or stdin
if [ ${#} -ne 0 ]; then
    [[ ! -z ${DEBUG} ]] && echo "Got arguments [${#}]:'${@}'"
    for OFILE in "${@}"; do # if [ -f "${OFILE}" ] || [ -d "${OFILE}" ]; then
        [[ -h ${OFILE} ]] && OFILE="$(readlink -f "${OFILE}")"
        [[ ${WINVIM} == true ]] && OFILE=$(cygpath -wal "${OFILE}")
        echo "\"${VIMRUN}\" --servername GVIM $RT \"${OFILE}\""
        "${VIMRUN}" --servername GVIM $RT "${OFILE}" &
        if [[ -z ${RT} ]] || [[ ! "${RT}" ]]; then
            RT="--remote-tab"
            sleep 5 #give gvim time to start up, running too fast messes things up
        else
            sleep .3 #shorter sleep for tabs
        fi
        #fi
    done
else
    while read OFILE; do
        [[ -h ${OFILE} ]] && OFILE="$(readlink -f "${OFILE}")"
        [[ ${WINVIM} == true ]] && OFILE=$(cygpath -wal "${OFILE}")
        echo "\"${VIMRUN}\" --servername GVIM $RT \"${OFILE}\""
        "${VIMRUN}" --servername GVIM $RT "${OFILE}" &
        if [[ -z ${RT} ]] || [[ ! "${RT}" ]]; then
            RT="--remote-tab"
            sleep 3 #give gvim time to start up, running too fast messes things up
        else
            sleep .3 #shorter sleep for tabs
        fi
    done
fi
# vim: set filetype=sh:

Как использовать это эффективно:

  • Установите приведенный выше код в файл сценария на ваш путь где-нибудь
  • Добавьте переменную среды WINVIM в Windows или в файл ~ / .bashrc, чтобы задать поведение сценария по умолчанию. true / использовать windows. ложь / использовать x11
  • псевдоним некоторой команды для cygwin и / или windows gvim, например:

    echo "псевдоним gwrap = 'WINVIM = false ~ / src / localscripts / wgwrap'" >> ~ / .bashrc echo "псевдоним wgvim = 'wgwrap'" >> ~ / .bashrc

  • ПРИМЕЧАНИЕ. Если жестко заданные пути к gvim неверны для вашей системы, вы можете напрямую отредактировать сценарий, псевдонимы и / или добавить переменные среды WINVIM и / или VIMRUN. Вы можете установить их в псевдониме, как я сделал выше для gwrap, или вы можете добавить их в свою системную среду .bashrc или Windows.

person SkyLeach    schedule 12.06.2014
comment
Я прочитал ответы ниже и предлагаю авторам прочитать подробности этого скрипта и кода. Он намного более портативный и полезный, чем другие. Пути, окна и серверы cygwin одновременно на одном компьютере, проверка процесса для окон (нельзя использовать --listservers с windows gvim и получить результаты обратно в оболочку. Моя не создает командную оболочку Windows при выполнении и больше - person SkyLeach; 12.06.2014

Я часто обнаруживаю, что хочу перейти в определенное место в файле. Я нашел единственный способ сделать это:

gvim --remote-send '^[:tabnew +$lineno $filename ^M'

где ^[ - esc (набирается ctrl-v esc), а ^M - вводится (ctrl-v enter).

Надеюсь это поможет. Если кто-нибудь понимает, как использовать --remote-expr, сообщите мне.

person alsuren    schedule 06.08.2010
comment
У вас должна быть возможность использовать ‹ESC› для выхода и ‹CR› для входа. - person retracile; 16.02.2012

Я использую TotalCommander для просмотра файлов. Это позволяет вам нажать «F4» для редактирования файла. Итак, в окне параметров «Редактор для F4» вам просто нужно сделать следующее:

C:\Program Files (x86)\Vim\vim73\gvim.exe --remote-tab-silent

Работает на моей 64-битной машине win7.

person AZ.    schedule 29.06.2012
comment
Я также использую Total Commander. Есть ли способ открыть новый файл с помощью gvim на текущей вкладке в качестве нового буфера, а не в другой вкладке? - person Validus Oculus; 02.10.2014
comment
@ MuratKarakuş используйте --remote-silent, и файл должен открываться как новый буфер вместо новой вкладки - person vappolinario; 05.02.2015
comment
@vappolinario большое спасибо, вы спасли меня от нескольких нажатий клавиш :)) - person Validus Oculus; 06.02.2015

Приведенные выше решения не запускают сервер gvim при первом запуске, поэтому я использую:

ANS=`pgrep -fx "$VIM"`

# Launch server if needed
if [[ ! $ANS ]]; then
   $VIM
fi

# Now open the file
if [[ $1 ]]; then
    $VIM --remote-tab "$@"
fi

изменено с https://stackoverflow.com/a/15335004/214686

person Stefan van der Walt    schedule 02.09.2013

НЕ ДЛЯ WINDOWS

Пользуюсь MacVim (снимок 73).

Добавьте это в свой .bash_profile.

Он не будет генерировать «NO NAME» и сообщение об ошибке.

vi() {

    if [[ `mvim --serverlist` == 'VIM' ]]; then
        command mvim --remote-tab-silent "$@"
    else
        command mvim "$@"
    fi
}
person zclin    schedule 13.09.2014

Используя MacVim, я обнаружил, что имя сервера по умолчанию было просто VIM. Придерживаясь этой темы, я добавил в свой bashrc следующую функцию, и она отлично работает:

mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
person Benjamin Riggs    schedule 13.12.2011

Я действительно использую

  gvim () { 
    if [ "$#" -gt 0 ]
    then
      gvim --remote-tab-silent "$@" &
    else
      gvim "$@" &
    fi
  }

Он убивает ошибки и использует флаг только тогда, когда есть параметр

person blockloop    schedule 05.08.2013