有没有办法让gVim只运行一个实例,这样当用它打开一个新文件时,它会自动在当前运行的实例的新选项卡中打开?
我知道你可以通过传递--remote-tab-silent
来做到这一点但是我想配置gvim以便这成为默认行为。即我想输入gvim filename
并使其表现得好像我将--remote-tab-silent
选项传递给它。
gVim 7.2
我在Windows(vista)
答案 0 :(得分:38)
如果您正在使用bash shell(在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。
答案 1 :(得分:11)
这取决于您的操作系统和shell。使用linux,您始终可以设置一个别名:
alias gvim='gvim --remote-tab-silent'
在.bashrc
中(如果您使用bash作为登录shell)。
在Windows上,请参阅Vim wiki获取解决方案:http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows。
答案 2 :(得分:4)
我发现别名中的--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
)的以下包装器脚本,如Tom Veiner所示,但如果没有任何参数是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 }
}
答案 3 :(得分:3)
alias tvim="gvim --servername `gvim --serverlist | head -1` --remote-tab"
这使得vim在同一个vim实例的新标签页中打开一个新文件。资料来源:http://eustaquiorangel.com/posts/477
答案 4 :(得分:3)
我厌倦了在cygwin + windows中解决这个问题,所以我终于做了些什么。我从上面定义的包装器脚本开始,但最终使它变得更加强大,并且能够实现* nix和Win的多个env。
#!/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:
如何有效地使用它:
将一些命令别名给cygwin和/或windows gvim,如下所示:
echo&#34;别名gwrap =&#39; WINVIM = false~ / src / localscripts / wgwrap&#39;&#34; &GT;&GT;在〜/ .bashrc echo&#34;别名wgvim =&#39; wgwrap&#39;&#34; &GT;&GT;的〜/ .bashrc
注意:如果gvim的硬编码路径对您的系统不正确,您可以直接编辑脚本,别名和/或添加环境变量WINVIM和/或者VIMRUN。您可以像上面的gwrap一样在别名中设置它们,也可以将它们添加到.bashrc或Windows系统环境中。
答案 5 :(得分:2)
我经常发现我想去文件中的特定位置。我发现这样做的唯一方法是:
gvim --remote-send '^[:tabnew +$lineno $filename ^M'
其中^[
为esc(输入ctrl-v esc)并输入^M
(ctrl-v enter)。
希望这会有所帮助。如果有人理解如何使用--remote-expr,请给我一个喊叫。
答案 6 :(得分:2)
我正在使用TotalCommander进行文件浏览。它允许您按“F4”编辑文件。因此,在“F4编辑器”选项窗口中,您只需执行以下操作:
C:\Program Files (x86)\Vim\vim73\gvim.exe --remote-tab-silent
适用于我的win7 64bit机器。
答案 7 :(得分:2)
上述解决方案在首次执行时不启动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
答案 8 :(得分:2)
不适用于WINDOWS
我使用的是MacVim(快照73)。
将此添加到.bash_profile。
它不会产生&#34; NO NAME&#34;和错误信息。
vi() {
if [[ `mvim --serverlist` == 'VIM' ]]; then
command mvim --remote-tab-silent "$@"
else
command mvim "$@"
fi
}
答案 9 :(得分:1)
使用MacVim,我发现默认服务器名称只是VIM。坚持这个主题,我在我的bashrc中抛出了以下功能,它就像一个魅力:
mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
答案 10 :(得分:1)
gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab $@ || command gvim $@; }
答案 11 :(得分:1)
我实际上正在使用
gvim () {
if [ "$#" -gt 0 ]
then
gvim --remote-tab-silent "$@" &
else
gvim "$@" &
fi
}
它会导致错误并仅在有参数时使用该标志