Pergunta

Existe uma maneira de deixar gVim só correr uma única instância, de modo que quando um novo arquivo é aberto com ele é aberto automaticamente em uma nova guia na instância actualmente em execução?

Eu sei que você pode fazer isso passando --remote-tab-silent mas quero configure gvim para que isso se torna o comportamento padrão. ou seja, eu quero escrever gvim filename e torná-lo agir como se eu passei a opção --remote-tab-silent a ele.

gVim 7.2

Editar

Eu estou no Windows (Vista)

Foi útil?

Solução

Se você estiver usando o shell bash (em Linux / OS X / usando Cygwin) é para adicioná-lo ~/.bashrc arquivo:

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

No Windows eu acho que você poderia ter um lote-script gvim.bat para alcançar o mesmo ..

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

Se gvim.exe não estiver em seu caminho

Run > Search "Environment"

Editar PATH var para o usuário ou o sistema atual.

Outras dicas

Depende de seu sistema operacional e shell. Usando linux você sempre pode configurar um alias como:

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

no seu .bashrc (se você usa o bash como seu shell de login).

No windows ver a Vim Wiki para solução: http://vim.wikia.com/wiki/Launch_files_in_new_tabs_under_Windows .

Eu encontrei a opção --remote-tab-silent em um alias para o trabalho em sua maior parte, exceto quando eu queria passar as opções ao gvim (por exemplo gvim --serverlist) - caso em que gvim trata a opção como um nome de arquivo literal que não é bom como primeiro lugar, que não é o que você queria e em segundo lugar você tem que limpar os buffers de sua sessão vim agora contaminado.

Não é prático usar outro alias ou resolver vim / gvim de forma diferente para alguns casos, como o seguinte.

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

A minha solução é o seguinte script invólucro em torno gvim (~/.bin/gvim) como Tom Veiner sugere, mas isso vai apenas para uso um servidor existente, se nenhum dos argumentos são opções gvim -. caso contrário, um novo servidor é criado

#!/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 }
}
alias tvim="gvim --servername `gvim --serverlist | head -1` --remote-tab"

Este make Vim abrir um novo arquivo no novo guia on mesma instância do vim. Fonte: http://eustaquiorangel.com/posts/477

portátil Wrapper Script:

Eu tenho um pouco cansado de trabalhar em torno deste em janelas cygwin + então eu finalmente fez algo a respeito. I começou com o script wrapper definido acima, mas acabei tornando muito mais robusto e multi-env capaz para * nix e 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:

Como usá-lo de forma eficaz:

  • Instale o código acima em um arquivo de script em yor em algum caminho
  • Adicione uma variável de ambiente WINVIM em janelas ou seu arquivo ~ / .bashrc, a fim de definir o comportamento de script padrão. true / usar o Windows. false / uso x11
  • apelido algum comando para cygwin e / ou janelas gvim assim:

    echo "Alias ??gwrap = 'WINVIM = false ~ / src / localscripts / wgwrap'" >> ~ / .bashrc echo "Alias ??wgvim = 'wgwrap'" >> ~ / .bashrc

  • NOTA : Se os caminhos embutidos para gvim estão incorretas para o seu sistema você pode editar o script diretamente, o alias (s) e / ou adicionar as variáveis ??de ambiente WINVIM e / ou VIMRUN. Você pode configurá-los no alias como eu acima para gwrap ou você pode adicioná-los ao seu .bashrc ou ambiente do sistema Windows.

muitas vezes eu achar que eu quero ir para um lugar específico em um arquivo. A única maneira que eu encontrei para fazer isso foi:

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

onde ^[ é esc (digitado ctrl-v esc) e ^M é entrar (ctrl-v entrar).

Espero que isso ajude. Se alguém entende como usar --remote-expr, dar um grito de mim.

Eu estou usando TotalCommander para navegação de arquivos. Ele permite que você pressione "F4" para editar o arquivo. Então, na janela opção "Editor for F4", você só precisa fazer o seguinte:

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

funciona na minha máquina Win7 64bit.

As soluções acima não iniciar o servidor gvim na primeira execução, então eu 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

https://stackoverflow.com/a/15335004/214686

NÃO para Windows

Eu uso MacVim (instantâneo 73).

Adicione isto a sua .bash_profile.

Não vai gerar "NO NAME" e mensagem de erro.

vi() {

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

Usando MacVim, descobri o nome do servidor padrão era simplesmente VIM. Cumprindo com esse tema, eu joguei a seguinte função no meu bashrc e funciona como um encanto:

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

Na verdade, estou usando

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

Ele mata erros e só usou a bandeira quando há um parâmetro

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top