vim singleinstance

Deja que gVim siempre ejecute una sola instancia



singleinstance (12)

Script portátil Wrapper:

Me cansé de trabajar en esto en cygwin + windows, así que finalmente hice algo al respecto. Empecé con el script de envoltura definido anteriormente pero terminé haciéndolo mucho más robusto y capaz de multi-env para * nix y 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:

Cómo usarlo de manera efectiva:

  • Instale el código anterior en un archivo de script en su ruta en algún lado
  • Agregue una variable de entorno WINVIM a Windows o su archivo ~ / .bashrc para establecer el comportamiento de script predeterminado. true / use windows. falso / uso x11
  • alias algún comando para cygwin y / o windows gvim así:

    echo "alias gwrap = ''WINVIM = falso ~ / src / localscripts / wgwrap''" >> ~ / .bashrc echo "alias wgvim = ''wgwrap''" >> ~ / .bashrc

  • NOTA : Si las rutas codificadas a gvim son incorrectas para su sistema, puede editar el script directamente, los alias y / o agregar las variables de entorno WINVIM y / o VIMRUN. Puede configurarlos en el alias como hago arriba para gwrap o puede agregarlos a su entorno de sistema .bashrc o Windows.

¿Hay alguna manera de que gVim solo ejecute una sola instancia, de modo que cuando se abre un nuevo archivo con ella se abra automáticamente en una nueva pestaña en la instancia en ejecución?

Sé que puedes hacerlo pasando --remote-tab-silent pero quiero configurar gvim para que se convierta en el comportamiento predeterminado. es decir, quiero escribir el gvim filename y hacer que actúe como si le pasara la --remote-tab-silent .

gVim 7.2

Editar

Estoy en Windows (vista)


A menudo me parece que quiero ir a un lugar específico en un archivo. La única forma en que encontré para hacer esto fue:

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

donde ^[ es esc (tipado ctrl-v esc) y ^M es enter (ctrl-v enter).

Espero que esto ayude. Si alguien entiende cómo usar --remote-expr, dame un grito.


Depende de tu sistema operativo y shell. Usando Linux siempre puedes configurar un alias como:

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

en tu .bashrc (si usas bash como tu shell de inicio de sesión).

En Windows, consulte la wiki de Vim para obtener una solución: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows .


En realidad estoy usando

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

Mata errores y solo usa la bandera cuando hay un parámetro


Estoy usando TotalCommander para la navegación de archivos. Le permite presionar "F4" para editar el archivo. Por lo tanto, en la ventana de opciones del "Editor para F4", solo necesita hacer lo siguiente:

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

Funciona en mi máquina win7 de 64 bits.


He encontrado la --remote-tab-silent en un alias para trabajar en su mayor parte, excepto cuando he querido pasar opciones a gvim (por ejemplo, gvim --serverlist ) - en cuyo caso gvim trata la opción como un nombre de archivo literal que no es bueno ya que, en primer lugar, eso no es lo que quería y, en segundo lugar, tiene que limpiar los almacenamientos intermedios de su sesión de vim ahora contaminada.

No es práctico usar otro alias o resolver vim / gvim diferente para algunos casos como el siguiente.

  • gvim
  • gvim /path/to/files
  • gvim --serverlist
  • gvim -p /path/to/file1 /path/to/file2
  • gvim -t tag filename

Mi solución es la siguiente secuencia de comandos envoltorio alrededor de gvim ( ~/.bin/gvim ) como sugiere Tom Veiner, pero esto solo utilizará un servidor existente si ninguno de los argumentos son opciones gvim ; de lo contrario, se crea un nuevo servidor.

#!/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 } }


Las soluciones anteriores no ejecutan el servidor gvim en la primera ejecución, entonces uso:

ANS=`pgrep -fx "$VIM"` # Launch server if needed if [[ ! $ANS ]]; then $VIM fi # Now open the file if [[ $1 ]]; then $VIM --remote-tab "$@" fi

modificado desde https://.com/a/15335004/214686


Si está utilizando el shell bash (en Linux / OS X / usando Cygwin) es agregarle el archivo ~/.bashrc :

gvim () { command gvim --remote-silent "$@" || command gvim "$@"; }

En Windows, creo que podrías tener un gvim.bat lotes gvim.bat para lograr lo mismo ...

gvim.exe -p --remote-tab-silent %1 %*

Si gvim.exe no está en su camino

Run > Search "Environment"

Edite la variable PATH para el usuario o sistema actual.


Usando MacVim, descubrí que el nombre de servidor predeterminado era simplemente VIM. Siguiendo con ese tema, lancé la siguiente función en mi bashrc y funciona como un encanto:

mvim() { ~/bin/mvim --servername VIM --remote-tab-wait-silent $* & }


NO para WINDOWS

Yo uso MacVim (instantánea 73).

Agregue esto a su .bash_profile.

No generará "NO NAME" y mensaje de error.

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


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

Esto hace que vim abra un nuevo archivo en una nueva pestaña en la misma instancia de vim. Fuente: http://eustaquiorangel.com/posts/477


gvimt () { [ $# -ne 0 ] && command gvim --remote-silent-tab $@ || command gvim $@; }