web-dev-qa-db-ja.com

gVimに常に単一のインスタンスを実行させる

GVimに単一のインスタンスのみを実行させて、新しいファイルを開いたときに、現在実行中のインスタンスの新しいタブで自動的に開かれるようにする方法はありますか?

--remote-tab-silentを渡すことでそれができることは知っていますが、これがデフォルトの動作になるようにgvimを構成したいと思います。つまり、gvim filenameと入力して、--remote-tab-silentオプションを渡したかのように動作させたいと考えています。

gVim 7.2

編集

私は窓にいます(ビスタ)

39
hasen

Bashシェルを使用している場合(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変数を編集します。

39
dbr

オペレーティングシステムとシェルによって異なります。 Linuxを使用すると、いつでも次のようなエイリアスを設定できます。

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

あなたの.bashrc(ログインシェルとしてbashを使用する場合)。

Windowsでは、解決策についてVim wikiを参照してください: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows

11
Zsolt Botykai

エイリアスの--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

私の解決策は、 Tom Veiner が示唆するように、gvim~/.bin/gvim)を囲む次のラッパースクリプトですが、引数が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 }
}
5
shalomb

ポータブルラッパースクリプト:

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:

それを効果的に使用する方法:

  • 上記のコードをどこかのパスのスクリプトファイルにインストールします
  • デフォルトのスクリプト動作を設定するために、WINVIM環境変数をwindowsまたは〜/ .bashrcファイルに追加します。 true/useウィンドウ。 false/x11を使用
  • 次のように、cygwinやwindowsgvimにコマンドをエイリアスします。

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

  • [〜#〜] note [〜#〜]:gvimへのハードコードされたパスがシステムに対して正しくない場合は、スクリプト、エイリアスを直接編集したり、環境を追加したりできます変数WINVIMおよび/またはVIMRUN。上記のgwrapの場合と同じようにエイリアスに設定するか、.bashrcまたはWindowsシステム環境に追加することができます。

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

これにより、vimはvimの同じインスタンスの新しいタブで新しいファイルを開くようになります。出典: http://eustaquiorangel.com/posts/477

3
SergioAraujo

ファイルの参照にTotalCommanderを使用しています。 「F4」を押してファイルを編集できます。したがって、「Editor for F4」オプションウィンドウでは、次のことを行う必要があります。

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

私のwin764ビットマシンで動作します。

2
AZ.

上記のソリューションは最初の実行時に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 から変更

2

WINDOWS用ではありません

MacVim(スナップショット73)を使用しています。

これを.bash_profileに追加します。

「NONAME」とエラーメッセージは生成されません。

vi() {

    if [[ `mvim --serverlist` == 'VIM' ]]; then
        command mvim --remote-tab-silent "$@"
    else
        command mvim "$@"
    fi
}
2
zclin

ファイル内の特定の場所に行きたいと思うことがよくあります。私がこれを行うために見つけた唯一の方法は:

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

どこ ^[はesc(ctrl-v escと入力)および^Mはenter(ctrl-v enter)です。

お役に立てれば。 --remote-exprの使い方を誰かが理解しているなら、私に一言お願いします。

2
alsuren

MacVimを使用して、デフォルトのサーバー名が単にVIMであることを発見しました。そのテーマに固執して、私は私のbashrcに次の関数を投げました、そしてそれは魅力のように働きます:

mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }
1
Benjamin Riggs
gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab $@ || command gvim $@; }
1
Sven

私は実際に使用しています

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

エラーを強制終了し、パラメータがある場合にのみフラグを使用しました

1
blockloop