GVimに単一のインスタンスのみを実行させて、新しいファイルを開いたときに、現在実行中のインスタンスの新しいタブで自動的に開かれるようにする方法はありますか?
--remote-tab-silent
を渡すことでそれができることは知っていますが、これがデフォルトの動作になるようにgvimを構成したいと思います。つまり、gvim filename
と入力して、--remote-tab-silent
オプションを渡したかのように動作させたいと考えています。
gVim 7.2
私は窓にいます(ビスタ)
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変数を編集します。
オペレーティングシステムとシェルによって異なります。 Linuxを使用すると、いつでも次のようなエイリアスを設定できます。
alias gvim='gvim --remote-tab-silent'
あなたの.bashrc
(ログインシェルとしてbashを使用する場合)。
Windowsでは、解決策についてVim wikiを参照してください: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows 。
エイリアスの--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 }
}
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:
それを効果的に使用する方法:
次のように、cygwinやwindowsgvimにコマンドをエイリアスします。
echo "alias gwrap = 'WINVIM = false〜/src/localscripts/wgwrap'" >>〜/ .bashrc echo "alias wgvim = 'wgwrap'" >>〜/ .bashrc
[〜#〜] note [〜#〜]:gvimへのハードコードされたパスがシステムに対して正しくない場合は、スクリプト、エイリアスを直接編集したり、環境を追加したりできます変数WINVIMおよび/またはVIMRUN。上記のgwrapの場合と同じようにエイリアスに設定するか、.bashrcまたはWindowsシステム環境に追加することができます。
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
私のwin764ビットマシンで動作します。
上記のソリューションは最初の実行時に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
WINDOWS用ではありません
MacVim(スナップショット73)を使用しています。
これを.bash_profileに追加します。
「NONAME」とエラーメッセージは生成されません。
vi() {
if [[ `mvim --serverlist` == 'VIM' ]]; then
command mvim --remote-tab-silent "$@"
else
command mvim "$@"
fi
}
ファイル内の特定の場所に行きたいと思うことがよくあります。私がこれを行うために見つけた唯一の方法は:
gvim --remote-send '^[:tabnew +$lineno $filename ^M'
どこ ^[
はesc(ctrl-v escと入力)および^M
はenter(ctrl-v enter)です。
お役に立てれば。 --remote-exprの使い方を誰かが理解しているなら、私に一言お願いします。
MacVimを使用して、デフォルトのサーバー名が単にVIMであることを発見しました。そのテーマに固執して、私は私のbashrcに次の関数を投げました、そしてそれは魅力のように働きます:
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
}
エラーを強制終了し、パラメータがある場合にのみフラグを使用しました