Existe uma maneira de compartilhar o histórico de comandos do vim?

8

Posso compartilhar o histórico de comandos do Vim entre instâncias em tempo real?

Com isso, quero dizer o que as pessoas fazem no bash desta maneira:

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Ou seja, quando executo um comando echo test1em um shell e pressiono Upoutro, entendo echo test1. (Para ser preciso, é preciso pressionar Enterantes Uppara que funcione.)

Isso é possível com o Vim? No começo eu pensei que usar a +clientserveropção funcionaria. Mas isso parece ser outra coisa.

x-yuri
fonte

Respostas:

13

O histórico do comando é armazenado no arquivo viminfo ( :help viminfo). Geralmente, isso é lido na inicialização e gravado na saída, mas você pode explicitamente persistir e sincronizar as instâncias do Vim com uma combinação de :wviminfoe :rviminfo. Observe que isso sincronizará toda a informação; ou seja, também registrar conteúdo, marcas, listas de buffer, etc.

Ingo Karkat
fonte
1

No Vim, o mais próximo que você pode chegar é (como a resposta de Ingo e o comentário de Christian mencionados) é:

augroup viminfo
    autocmd!
    autocmd FocusLost   * wviminfo
    autocmd FocusGained * rviminfo
augroup end

É importante perceber que os Focus*comandos automáticos nem sempre são executados quando você usa o Vim em um terminal, principalmente se você estiver usando tmux ou screen. Você deve testar isso primeiro usando :au FocusLost :echoerr "Focus lost!".

Até onde eu sei, não há uma boa solução alternativa, se esses comandos automáticos não funcionarem para você. Usar outros eventos (como CursorHold) parece problemático para mim devido a problemas de tempo que quase certamente surgirão.


O Neovim vem com o "ShaDa", que substitui o sistema viminfo do Vim. Um aspecto em que é melhor é mesclar arquivos de diferentes instâncias, e enquanto ele não suporta diretamente a sincronização entre várias instâncias ( ainda ), este parece funcionar bem para pelo menos um desenvolvedor Neovim :

augroup shada
  autocmd!
  autocmd CursorHold * rshada | wshada
augroup end

Veja :help shada-mergingpara detalhes sobre o processo de mesclagem.

Martin Tournoij
fonte
Nota: Eu acho que o Vim 8 também introduz a funcionalidade de mesclagem porque marca os timestamps dos comandos digitados. Veja:h viminfo-timestamp
Christian Brabandt
Eu tentei no meu sistema antes de postar esta resposta @ChristianBrabandt, e não parecia funcionar muito bem. Talvez eu tenha feito algo errado.
Martin Tournoij
talvez um bug? seria necessário um bom exemplo reproduzível na lista @ vim-dev
Christian Brabandt