让gVim总是运行一个实例

有没有办法让gVim只运行一个单一的实例,所以当打开一个新的文件,它会自动打开在当前正在运行的实例中的新选项卡?

我知道你可以通过传递--remote-tab-silent来做到这一点,但是我想configurationgvim,这样就成了默认行为。 即我想键入gvim filename并使其行为,如果我通过--remote-tab-silent选项。

gVim 7.2

编辑

我在窗户(Vista)

如果你使用的是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不在您的path中

 Run > Search "Environment" 

编辑当前用户或系统的PATH var。

这取决于你的操作系统和shell。 使用Linux,你总是可以设置一个别名:

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

在你的.bashrc (如果你使用bash作为你的loginshell)。

在Windows上,请参阅Vim维基解决scheme: http : //vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows 。

我在别名中find了--remote-tab-silent选项,除了当我想要将选项传递给gvim时(例如gvim --serverlist ) – 在这种情况下,gvim将该选项当作字面的文件名,这是不好的,因为首先,这不是你想要的,其次你必须清理你现在感染的vim会话中的缓冲区。

对于下面的一些情况,使用其他别名或parsingvim / gvim不现实的。

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

我的解决scheme就是Tom Veiner所build议的gvim~/.bin/gvim )下面的包装器脚本,但是如果没有参数是gvim选项,这将只使用现有的服务器,否则会创build一个新的服务器。

 #!/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 } } 

便携包装脚本:

我有点厌倦了在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: 

如何有效地使用它:

  • 将上面的代码安装到yorpath上的某个脚本文件中
  • 将WINVIM环境variables添加到Windows或〜/ .bashrc文件以设置默认的脚本行为。 真实/使用窗口。 假/使用x11
  • 别名一些命令cygwin和/或窗口gvim像这样:

    echo“alias gwrap ='WINVIM = false〜/ src / localscripts / wgwrap'”>>〜/ .bashrc echo“alias wgvim ='wgwrap'”>>〜/ .bashrc

  • 注意 :如果你的系统的gvim的硬编码path不正确,你可以直接编辑脚本,别名和/或添加环境variablesWINVIM和/或VIMRUN。 你可以像上面那样设置别名,也可以将它们添加到你的.bashrc或Windows系统环境中。

我经常发现我想去一个文件中的特定位置。 我发现这样做的唯一方法是:

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

其中^[是esc(键入ctrl-v esc)和^M是input(ctrl-vinput)。

希望这可以帮助。 如果有人懂得如何使用–remote-expr,给我留言。

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

这使vim在vim的同一个实例上的新选项卡中打开一个新文件。 来源: http : //eustaquiorangel.com/posts/477

我正在使用TotalCommander进行文件浏览。 它可以让你按“F4”编辑文件。 所以在“Editor for F4”选项窗口中,您只需要执行以下操作:

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

适用于我的win7 64位机器。

上面的解决scheme在第一次执行时不会启动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。

它不会生成“NO NAME”和错误消息。

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

使用MacVim,我发现默认的服务器名称是简单的VIM。 坚持这个主题,我把我的bashrc中的以下function,它就像一个魅力:

 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 } 

它杀死错误,只有在有参数时才使用该标志