Existe-t-il un moyen de partager l'historique des commandes vim?

8

Puis-je partager l'historique des commandes Vim entre les instances en temps réel?

J'entends par là ce que les gens font en bash de cette façon:

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

Autrement dit, lorsque j'exécute une commande echo test1dans un shell, puis appuie Upsur un autre, je vois echo test1. (Pour être précis, il faut appuyer Enteravant Uppour que cela fonctionne.)

Est-ce possible avec Vim? Au début, je pensais que l'utilisation de l' +clientserveroption fonctionnerait. Mais cela semble être autre chose.

x-yuri
la source

Réponses:

13

L'historique des commandes est stocké dans le fichier viminfo ( :help viminfo). Habituellement, cela est lu au démarrage et écrit à la sortie, mais vous pouvez explicitement persister et synchroniser entre les instances de Vim avec une combinaison de :wviminfoet :rviminfo. Notez que cela synchronisera toutes les informations; c'est-à-dire également enregistrer le contenu, les marques, les listes de tampons, etc.

Ingo Karkat
la source
1

À Vim, le plus proche que vous pouvez obtenir est (comme mentionné la réponse d'Ingo et le commentaire de Christian) est:

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

Il est important de réaliser que les commandes Focus*automatiques ne sont pas toujours exécutées lorsque vous utilisez Vim à partir d'un terminal, surtout pas si vous utilisez tmux ou screen. Vous devez d'abord tester cela en utilisant :au FocusLost :echoerr "Focus lost!".

Autant que je sache, il n'y a pas de bonne solution si ces commandes automatiques ne fonctionnent pas pour vous. L'utilisation d'autres événements (tels que CursorHold) me semble problématique en raison de problèmes de synchronisation qui surviendront presque certainement.


Neovim est livré avec "ShaDa", qui remplace le système viminfo de Vim. Un aspect où il est préférable de fusionner des fichiers de différentes instances, et bien qu'il ne prenne pas en charge directement la synchronisation entre plusieurs instances (pour l' instant ), cela semble bien fonctionner pour au moins un développeur Neovim :

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

Voir :help shada-mergingpour plus de détails sur le processus de fusion.

Martin Tournoij
la source
Remarque: Je pense que Vim 8 introduit également la fonctionnalité de fusion car il horodate les commandes entrées. Voir:h viminfo-timestamp
Christian Brabandt
Je l'ai essayé sur mon système avant de poster cette réponse @ChristianBrabandt, et cela ne semble pas très bien fonctionner. J'ai peut-être fait quelque chose de mal.
Martin Tournoij
peut-être un bug? aurait besoin d'un bon exemple reproductible sur @ vim-dev list
Christian Brabandt