Como o histórico de comandos é resolvido entre várias instâncias do Vim?

15

O Vim mantém um histórico dos comandos ex (acessíveis via :e q:), e esse histórico persiste após o encerramento.

Se eu executar várias instâncias do Vim (mesmo usuário, mesmo diretório inicial), como o Vim arbitrará entre os históricos de comandos? Parece que o último processo para sair vence. Existe uma maneira de manter o histórico de comandos de todas as instâncias?

200_success
fonte
1
Verdade? Essa história não persiste depois de sair por mim. (Vim 7.4.52, Ubuntu 14.04)
Maçaneta da
3
@Doorknob Verifique se você ~/.viminfopertence a você. Um erro comum é que as pessoas executem o sudo vim ...que, se você não executou o vim como seu próprio usuário, criará ~/.viminfocomo root. Se esse for o problema, sugiro aprender a usar sudoeditou sudo -eeditar arquivos privilegiados.
jamessan
@jamessan Huh, parece que esse foi realmente o problema; chownquando meu .viminfo voltou para mim, o consertei. (Não sei como sua propriedade tem mudado para a raiz, desde que eu sempre usei sudoedit, mas tudo bem.)
Doorknob

Respostas:

10

A resposta para sua pergunta do título é o que você observou. No manual do usuário do vim:help 21.3

Quando você executa o Vim várias vezes, a última saída armazena suas informações. Isso pode causar a perda de informações que saíam anteriormente do Vims armazenadas. Cada item pode ser lembrado apenas uma vez.

No entanto, o nome do arquivo do arquivo viminfo (onde o histórico de comandos está armazenado, entre outras coisas, como marcas globais e conteúdo do registro, se estiver configurado) é alterável! Isso significa que você pode configurar diferentes 'históricos' para diferentes projetos ou instâncias do vim. Supondo que você não execute mais de uma instância do vim por projeto, gerenciar o nome do arquivo viminfo via vimrc (ou outro plugin de configurações do projeto) é uma ótima maneira de lidar com isso.

Configurar arquivos viminfo alternativos

Para o gerenciamento no nível do projeto, queremos configurar o vim para salvar seu viminfo em um arquivo diferente. Isso pode ser feito dentro de um vim em execução antes de sair ou pelo vimrc, por exemplo, você pode ter linhas no vimrc que detectam um diretório específico como pertencente a um projeto.

:set viminfo+=nPath/to/custom/viminfofile

Um exemplo de como o vimrc o define automaticamente com base no diretório:

 if getcwd() == "/projects/projA"
     set viminfo+=n~/.viminfo-projA
 endif

O resultado acima é que o histórico específico do projeto será carregado na inicialização e salvo na saída, se o vim for iniciado no diretório / projects / projA.

Carregar um viminfo alternativo durante a inicialização

Isso é bom para o caso em que você deseja salvar seu histórico para o lado e carregá-lo mais tarde, sem gerenciá-lo no nível do projeto.

Primeiro, para salvar o histórico, você adiciona à opção viminfo como acima antes de sair. Para carregar o histórico, inicie o vim com a opção -i

vim -i Path/to/custom/viminfofile

Se você não deseja sair do vim para salvar o arquivo viminfo, pode usar :wv( :wviminfo). Isso salva o arquivo viminfo sem sair do vim de acordo com a configuração n acima. E você também pode :wv SomeOtherFilesalvar para um local que não seja o mesmo da configuração na opção viminfo. Isso pode ser mais conveniente do que configurar o nome do arquivo a ser usado na saída, mas não impede o vim de usar o arquivo padrão depois que ele sai.

Por exemplo, no primeiro vim:

:wv ~/customInfo

e no segundo terminal:

vim -i ~/customInfo

Ou, se um segundo vim já estiver em execução e você desejar carregar o viminfo:

:rv ~/customInfo

Observe que, :wve :rvnão altere o nome do arquivo, o vim salvará na saída nem o nome do arquivo lido durante a inicialização.

Informação adicional

Descrição de set viminfo+=nSomePath: Usamos o comando set para ajustar a opção denominada viminfo. O +=indica que queremos acrescentar à opção, não mudar tudo. nAnexamos a opção que especifica o nome do arquivo para viminfo. Imediatamente após ntermos SomePathqual será o nome do arquivo usado para salvar o viminfo.

A documentação para wv( :help wv) indica que este comando primeiro lê o arquivo viminfo e depois mescla entre informações antigas e novas. Até o momento, não tenho informações sobre como a fusão funciona nesse caso, mas acho que mantém marcas de arquivos e registros desconhecidos que não estão definidos na sessão atual.

John O'M.
fonte