让gVim始终运行单个实例

时间:2009-06-01 20:03:50

标签: vim single-instance

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

我知道你可以通过传递--remote-tab-silent来做到这一点但是我想配置gvim以便这成为默认行为。即我想输入gvim filename并使其表现得好像我将--remote-tab-silent选项传递给它。

gVim 7.2

修改

我在Windows(vista)

12 个答案:

答案 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)

Portable Wrapper Script:

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

如何有效地使用它:

  • 将上述代码安装到yor路径上的脚本文件中
  • 将一个WINVIM环境变量添加到windows或〜/ .bashrc文件中,以设置默认的脚本行为。真/使用窗口。 false / use x11
  • 将一些命令别名给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

https://stackoverflow.com/a/15335004/214686修改

答案 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
  }

它会导致错误并仅在有参数时使用该标志