Пусть gVim всегда запускает один экземпляр
Есть ли способ, чтобы gVim запускал только один экземпляр, так что, когда новый файл открывается с ним, он автоматически открывается на новой вкладке в текущем экземпляре?
Я знаю, что вы можете сделать это, передав --remote-tab-silent
, но я хочу настроить gvim, чтобы это стало поведением по умолчанию. то есть я хочу набрать gvim filename
и заставить его действовать так, как будто я передал ему параметр --remote-tab-silent
.
gVim 7.2
Изменить
Я на windows (vista)
Ответы
Ответ 1
Если вы используете оболочку bash (в Linux/OS X/с помощью Cygwin), вы должны добавить файл ~/.bashrc
:
gvim () { command gvim --remote-silent "[email protected]" || command gvim "[email protected]"; }
В Windows я думаю, что вы могли бы иметь gvim.bat
batch- script для достижения того же самого.
gvim.exe -p --remote-tab-silent %1 %*
Если gvim.exe не находится на вашем пути
Run > Search "Environment"
Изменить PATH var для текущего пользователя или системы.
Ответ 2
Это зависит от вашей операционной системы и оболочки. Используя linux, вы всегда можете настроить псевдоним:
alias gvim='gvim --remote-tab-silent'
в .bashrc
(если вы используете bash в качестве вашей оболочки входа).
В окнах см. вики Vim для решения: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows.
Ответ 3
Я обнаружил, что параметр --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
Мое решение - это следующая оболочка script вокруг gvim
(~/.bin/gvim
) как Tom Veiner, но это будет использовать только существующий сервер, если ни один из аргументы gvim
options - в противном случае создается новый сервер.
#!/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 }
}
Ответ 4
alias tvim="gvim --servername `gvim --serverlist | head -1` --remote-tab"
Это заставит vim открыть новый файл на новой вкладке в том же экземпляре vim. Источник: http://eustaquiorangel.com/posts/477
Ответ 5
Portable Wrapper Script:
Мне немного надоело обходить это в окнах cygwin +, поэтому я, наконец, что-то с этим поделал. Я начал с описанной выше оболочки script, но я запустил ее гораздо более надежную и многопользовательскую, способную к * 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:
Как эффективно использовать его:
- Установите вышеуказанный код в файл script на пути yor где-нибудь
- Добавьте переменную среды WINVIM в окна или файл ~/.bashrc, чтобы установить поведение по умолчанию script. true/use windows. false/use x11
-
alias некоторая команда для cygwin и/или windows gvim следующим образом:
echo "alias gwrap = 'WINVIM = false ~/src/localscripts/wgwrap'" → ~/.bashrc
echo "alias wgvim = 'wgwrap'" → ~/.bashrc
-
ПРИМЕЧАНИЕ. Если жестко закодированные пути к gvim неверны для вашей системы, вы можете напрямую отредактировать script, псевдоним и/или добавить переменные окружения WINVIM и/или VIMRUN. Вы можете установить их в псевдониме, как я делаю выше для gwrap, или вы можете добавить их в свою .bashrc или системную среду Windows.
Ответ 6
Я часто обнаруживаю, что хочу перейти в определенное место в файле. Единственный способ, которым я нашел это, заключался в следующем:
gvim --remote-send '^[:tabnew +$lineno $filename ^M'
где ^[
- esc (введите ctrl-v esc) и ^M
введите (ctrl-v enter).
Надеюсь, это поможет. Если кто-то понимает, как использовать -remote-expr, дай мне крик.
Ответ 7
Я использую TotalCommander для просмотра файлов. Он позволяет вам нажать "F4", чтобы отредактировать файл. Поэтому в окне параметров "Редактор для F4" вам просто нужно сделать следующее:
C:\Program Files (x86)\Vim\vim73\gvim.exe --remote-tab-silent
Работает на моей 64-разрядной машине win7.
Ответ 8
Вышеупомянутые решения не запускают сервер gvim при первом выполнении, поэтому я использую:
ANS=`pgrep -fx "$VIM"`
# Launch server if needed
if [[ ! $ANS ]]; then
$VIM
fi
# Now open the file
if [[ $1 ]]; then
$VIM --remote-tab "[email protected]"
fi
изменен из fooobar.com/questions/137738/...
Ответ 9
НЕ ДЛЯ WINDOWS
Я использую MacVim (снимок 73).
Добавьте это в свой .bash_profile.
Он не будет генерировать "НЕТ ИМЯ" и сообщение об ошибке.
vi() {
if [[ `mvim --serverlist` == 'VIM' ]]; then
command mvim --remote-tab-silent "[email protected]"
else
command mvim "[email protected]"
fi
}
Ответ 10
Используя MacVim, я обнаружил, что по умолчанию имя сервера было просто VIM. Придерживаясь этой темы, я бросил следующую функцию в моем bashrc, и она работает как шарм:
mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
Ответ 11
gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab [email protected] || command gvim [email protected]; }
Ответ 12
Я использую
gvim () {
if [ "$#" -gt 0 ]
then
gvim --remote-tab-silent "[email protected]" &
else
gvim "[email protected]" &
fi
}
Он убивает ошибки и использует флаг только при наличии параметра