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

StackOverflow https://stackoverflow.com/questions/936501

  •  06-09-2019
  •  | 
  •  

Вопрос

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

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

gVim 7.2

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

Я использую Windows (Vista)

Это было полезно?

Решение

Если вы используете оболочку 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 var для текущего пользователя или системы.

Другие советы

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

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

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

В Windows решение см. в Vim wiki: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows .

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

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

  • 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 }
}
alias tvim="gvim --servername `gvim --serverlist | head -1` --remote-tab"

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

Переносной скрипт- оболочка:

Мне немного надоело работать с этим в 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, чтобы задать поведение скрипта по умолчанию.верно / используйте Windows.false/использовать x11
  • переименуйте какую-нибудь команду в cygwin и / или Windows gvim примерно так:

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

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

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

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

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

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

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

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

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

Приведенные выше решения не запускают 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

НЕ Для WINDOWS

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

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

Он не будет генерировать "НЕТ ИМЕНИ" и сообщение об ошибке.

vi() {

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

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

mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab $@ || command gvim $@; }

Я на самом деле использую

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top