Пусть gVim всегда запускает один экземпляр
-
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
}
Он устраняет ошибки и использует флаг только при наличии параметра