Gibt es eine Möglichkeit, den vim-Befehlsverlauf zu teilen?

8

Kann ich den Vim-Befehlsverlauf in Echtzeit instanzübergreifend freigeben?

Damit meine ich, was die Leute auf diese Weise tun:

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

Das heißt, wenn ich einen Befehl echo test1in einer Shell ausführe und dann Upeine andere drücke , sehe ich echo test1. (Um genau zu sein, muss man Entervorher drücken, Updamit es funktioniert.)

Ist das mit Vim möglich? Zuerst dachte ich, dass die Verwendung der +clientserverOption funktionieren würde. Aber das scheint etwas anderes zu sein.

x-yuri
quelle

Antworten:

13

Der Befehlsverlauf wird in der viminfo- Datei ( :help viminfo) gespeichert . Normalerweise wird dies beim Start gelesen und beim Beenden geschrieben, aber Sie können Vim-Instanzen explizit mit einer Kombination aus :wviminfound beibehalten und synchronisieren :rviminfo. Beachten Sie, dass dadurch die gesamten Informationen synchronisiert werden. dh auch Inhalte, Marken, Pufferlisten usw. registrieren.

Ingo Karkat
quelle
1

In Vim ist der nächste, den Sie bekommen können (wie Ingos Antwort und Christians Kommentar erwähnt):

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

Es ist wichtig zu wissen, dass die Focus*automatischen Befehle nicht immer ausgeführt werden, wenn Sie Vim von einem Terminal aus verwenden, insbesondere nicht, wenn Sie tmux oder screen verwenden. Sie sollten dies zuerst mit testen :au FocusLost :echoerr "Focus lost!".

Soweit ich weiß, gibt es keine gute Lösung, wenn diese Autobefehle für Sie nicht funktionieren. Die Verwendung anderer Ereignisse (z. B. CursorHold) erscheint mir aufgrund von Zeitproblemen, die mit ziemlicher Sicherheit auftreten werden, problematisch.


Neovim wird mit "ShaDa" geliefert, einem Ersatz für das Viminfo-System von Vim. Ein Aspekt, bei dem es besser ist, Dateien aus verschiedenen Instanzen zusammenzuführen, und obwohl die Synchronisierung zwischen mehreren Instanzen ( noch ) nicht direkt unterstützt wird , scheint dies für mindestens einen Neovim-Entwickler gut zu funktionieren :

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

Weitere :help shada-mergingInformationen zum Zusammenführungsprozess finden Sie unter.

Martin Tournoij
quelle
Hinweis: Ich denke, Vim 8 führt auch die Zusammenführungsfunktion ein, da die eingegebenen Befehle mit einem Zeitstempel versehen werden. Siehe:h viminfo-timestamp
Christian Brabandt
Ich habe es auf meinem System versucht, bevor ich diese Antwort @ChristianBrabandt gepostet habe, und es schien nicht sehr gut zu funktionieren. Vielleicht habe ich etwas falsch gemacht.
Martin Tournoij
vielleicht ein Fehler? würde ein gutes reproduzierbares Beispiel bei @ vim-dev Liste brauchen
Christian Brabandt