让gVim始终运行单个实例

让gVim始终运行单个实例,vim,single-instance,Vim,Single Instance,有没有办法让gVim只运行一个实例,这样当打开一个新文件时,它会在当前运行的实例的新选项卡中自动打开 我知道您可以通过传递--remote tab silent来实现这一点,但我希望配置gvim,使其成为默认行为。i、 e.我想键入gvim filename,并使其看起来好像我将--remote tab silent选项传递给它一样 gVim 7.2 编辑 我在windows(vista)如果您使用的是bash shell(在Linux/OS X上/使用Cygwin),则要添加您的~/.bash

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

我知道您可以通过传递
--remote tab silent
来实现这一点,但我希望配置gvim,使其成为默认行为。i、 e.我想键入
gvim filename
,并使其看起来好像我将
--remote tab silent
选项传递给它一样

gVim 7.2

编辑
我在windows(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不在您的路径中

Run > Search "Environment"

编辑当前用户或系统的路径变量。

它取决于您的操作系统和shell。使用linux,您始终可以设置别名,如:

alias gvim='gvim --remote-tab-silent'
.bashrc
中(如果使用bash作为登录shell)


在windows上,请参阅Vim wiki以获取解决方案:。

我经常发现我想要转到文件中的特定位置。我找到的唯一方法是:

gvim --remote-send '^[:tabnew +$lineno $filename ^M'
其中,
^[
是esc(键入ctrl-v esc),而
^M
是enter(键入ctrl-v enter)

希望这能有所帮助。如果有人知道如何使用远程expr,请给我一声欢呼

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

这使vim在同一个vim实例的new tab中打开一个新文件。来源:

使用MacVim,我发现默认服务器名只是vim。按照这个主题,我在bashrc中抛出了以下函数,它工作起来很有魅力:

mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
我发现别名中的
--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标记文件名
我的解决方案是如下围绕
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 }
}
!/usr/bin/perl
使用v5.10;
sub gvim{exec{'/usr/bin/gvim'}'/usr/bin/gvim',@;}
if(标量@ARGV){
取消移位@ARGV,“--remote tab silent”,除非/^--?/~~@ARGV;
gvim@ARGV
}
否则{
chomp(my$serverlist=`gvim--serverlist`);
if(长度$serverlist){
gvim'--远程发送',':tabnew'
}else{gvim}
}

我正在使用TotalCommander进行文件浏览。它允许您按“F4”编辑文件。因此,在“F4编辑器”选项窗口中,您只需执行以下操作:

C:\Program Files (x86)\Vim\vim73\gvim.exe --remote-tab-silent
在我的win7 64位机器上工作。

我实际上正在使用

gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab $@ || command gvim $@; }
  gvim () { 
    if [ "$#" -gt 0 ]
    then
      gvim --remote-tab-silent "$@" &
    else
      gvim "$@" &
    fi
  }

它会消除错误,并且仅在存在参数时使用该标志。上述解决方案不会在第一次执行时启动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
修改自可移植包装器脚本: 我对在cygwin+windows中处理这个问题感到有点厌倦,所以我最终做了一些事情。我从上面定义的包装器脚本开始,但最终使它更加健壮,并且能够支持*nix和Win



如何有效地使用它:

  • 将上面的代码安装到你所在路径上的脚本文件中
  • 将WINVIM环境变量添加到windows或~/.bashrc文件中,以设置默认脚本行为。true/use windows.false/use x11
  • 将某些命令别名为cygwin和/或windows gvim,如下所示:

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

  • 注意:如果gvim的硬编码路径不适用于您的系统,您可以直接编辑脚本、别名和/或添加环境变量WINVIM和/或VIMRUN。您可以在别名中设置它们,就像我上面对gwrap所做的那样,也可以将它们添加到.bashrc或Windows系统环境中


    • 不适用于WINDOWS

      我使用MacVim(快照73)

      将此添加到您的.bash_配置文件中

      它不会生成“没有名字”和错误消息

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

      您需要
      alias gvim=“gvim--remote tab silent | | gvim”
      以避免在“--remote tab silent”之后缺少
      参数
      当您在没有文件名的情况下调用以打开空白文档,或者更确切地说是在~/bin/gvimt或类似文件中的可执行文件中放置
      gvim--remote tab silent$@| gvim$@
      。@TomViner现在我意识到,即使使用这些解决方案,消息“Arguement missing after…”仍然会出现,但gvim能够打开(通常情况下不是这样。)上面建议的别名不起作用,它只会打开一个新的gvim实例。但是,您关于使用可执行文件的建议起了作用,正如在my.bashrc中添加以下内容一样:
      gvimt(){command gvim--remote silent$@| | command gvim$@}
      。即使这样,它仍然会打印“--remote tab silent”之后缺少的错误参数,因此我将stderr重定向到/dev/null,如下所示
      gvim(){command mvim$@--remote silent 2>/dev/null | | command mvim$@;}
      迟到:始终引用
      “$@”
      以保护带有空格的文件名(或$IFS中的其他字符)嗨,s.bhooshi,欢迎来到stackoverflow,谢谢你的回答。你应该能够使用escape和enter。我阅读了下面的回复,建议作者阅读此脚本和代码的详细信息。它比其他脚本更具可移植性和实用性。路径、窗口和c
      vi() {
      
          if [[ `mvim --serverlist` == 'VIM' ]]; then
              command mvim --remote-tab-silent "$@"
          else
              command mvim "$@"
          fi
      }