让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
不适用于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 }
它杀死错误,只有在有参数时才使用该标志