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 $@; }