¿Hay alguna manera de compartir el historial de comandos vim?

8

¿Puedo compartir el historial de comandos de Vim entre instancias en tiempo real?

Con eso quiero decir lo que la gente hace en bash de esta manera:

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

Es decir, cuando ejecuto un comando echo test1en un shell y luego presiono Upen otro, veo echo test1. (Para ser precisos, uno tiene que presionar Enterantes Uppara que funcione).

¿Es esto posible con Vim? Al principio pensé que usar la +clientserveropción funcionaría. Pero eso parece ser otra cosa.

x-yuri
fuente

Respuestas:

13

El historial de comandos se almacena en el archivo viminfo ( :help viminfo). Por lo general, eso se lee al inicio y se escribe al salir, pero puede persistir explícitamente y sincronizarse entre las instancias de Vim con una combinación de :wviminfoy :rviminfo. Tenga en cuenta que esto sincronizará toda la información; es decir, también registrar contenidos, marcas, listas de búfer, etc.

Ingo Karkat
fuente
1

En Vim, lo más cercano que puede obtener es (como se menciona en la respuesta de Ingo y en el comentario de Christian) es:

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

Es importante darse cuenta de que los Focus*comandos automáticos no siempre se ejecutan cuando usa Vim desde un terminal, especialmente no si está usando tmux o screen. Debe probar esto primero usando :au FocusLost :echoerr "Focus lost!".

Hasta donde sé, no hay una buena solución si estos comandos automáticos no funcionan para usted. El uso de otros eventos (como CursorHold) me parece problemático debido a problemas de tiempo que seguramente surgirán.


Neovim viene con "ShaDa", que es un reemplazo para el sistema viminfo de Vim. Un aspecto en el que es mejor es fusionar archivos de diferentes instancias, y aunque no admite directamente la sincronización entre varias instancias ( todavía ), esto parece funcionar bien para al menos un desarrollador de Neovim :

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

Consulte :help shada-mergingpara obtener detalles sobre el proceso de fusión.

Martin Tournoij
fuente
Nota: Creo que Vim 8 también introduce la funcionalidad de fusión porque marca los comandos ingresados. Ver:h viminfo-timestamp
Christian Brabandt
Lo probé en mi sistema antes de publicar esta respuesta @ChristianBrabandt, y no pareció funcionar muy bien. Tal vez hice algo mal.
Martin Tournoij
tal vez un error? necesitaría un buen ejemplo reproducible en la lista @ vim-dev
Christian Brabandt