Daraus :h :set
wissen wir das
:se[t]
Alle Optionen anzeigen, die von ihrem Standardwert abweichen.
In einem Vimscript möchte ich alle diese vom Benutzer geänderten Optionen speichern, ändern und später auf den vom Benutzer festgelegten Wert zurücksetzen.
Wie kann ich das einfach machen?
Kann ich das Ergebnis :set
(oder einen ähnlichen Befehl) einfach in einer Variablen speichern, die ich später als Quelle verwenden oder an einen anderen Befehl übergeben kann, um dessen Inhalt wiederherzustellen?
Oder muss ich die Ausgabe des Befehls manuell analysieren (was ich tun kann, aber viel Arbeit für nichts ist, wenn es eine einfachere Alternative gibt)?
:option
Befehl und einOptionSet
Autocommand-Ereignis, sodass möglicherweise genügend Interesse für eine Funktion zum Speichern / Wiederherstellen des Status besteht. Fragen Sie weitervim_dev
.:option
Befehl ziemlich cool ist! Du hast recht, vielleicht drücke ich vim_dev. @ Christian: Ja, ich verstehe, dass dies kein allgemeiner Workflow ist, eigentlich versuche ich nur, eine Idee von mir umzusetzen, aber vielleicht ist das nicht so gut :-)selection
eine lokale Version? Man muss die Quellen lesen, um herauszufinden.)Antworten:
1.
:mkexrc
Der einfachste Weg ist die Verwendung eines
:mkexrc
Befehls. Mit diesem Befehl können wir alle geänderten Optionen in einer Datei speichern. Wenn Sie alle gespeicherten Optionen aus der Datei wiederherstellen müssen, nur:source
diese.2.
:set
und:redir
Der
:mkexrc
Befehl verwendet notwendigerweise eine Datei, um alle Optionen zu speichern. (Und er speichert auch aktuelle Schlüsselzuordnungen.) Wenn wir keine Datei verwenden möchten, können wir die Ausgabe des:set
Befehls in die vim-Variable mit umleiten:redir
.Anschließend können wir alle Optionen aus dem Snapshot wie folgt wiederherstellen.
Der obige Ansatz ist schnell und einfach anzuwenden. Der Ansatz hat jedoch zwei Probleme. Zuerst müssen wir einige Zeichen, einschließlich Leerzeichen, aus dem Schnappschuss (
:help option-backslash
) entfernen . Andernfalls können Fehler auftreten, wenn diese Zeichen nicht maskiert werden. Zum Beispiel,löst den Fehler 'E518' aber aus,
funktioniert gut.
Und das zweite Problem ist, dass alle Sonderschlüssel in normale Zeichen geändert werden, wenn wir die Ausgabe auf den Schnappschuss umleiten. Zum Beispiel wird
^I
(tab) buchstäblich in^
und geändertI
. Die Problemumgehung könnte etwas kompliziert sein.3.
:setlocal
Wir können eine Wiederherstellungsoption auch manuell mit speichern
:setlocal
.:setlocal
wirkt sich nur auf den aktuellen Puffer oder das aktuelle Fenster aus. Wenn wir Optionen ändern mit:setlocal
,:setlocal {option}<
oder:set {option}<
können die geänderten Optionen wiederherstellen zurück. Ersteres setzt den lokalen Wert von {Option} von seinem globalen Wert und letzteres entfernt alle lokalen Optionen, sodass alle Optionswerte zu ihren globalen Werten zurückkehren. Zum Beispiel,quelle
Sie können mit
let option_val = &option
einem Skript auf den Wert einer Einstellung zugreifen . Was ich gesehen habe, ist die Verwendung eines Diktats zum Speichern der Optionen, die Sie ändern möchten. Sie durchlaufen das Diktat, um den alten Wert zu speichern und den neuen festzulegen.Beispiel
Dies ist ein direkterer Ansatz. Ich würde dies verwenden, wenn die Einstellungen im Voraus bekannt sind.
Die
plugin_options
Variable ist auf die Funktion beschränkt, sodass sie zum Speichern der alten Optionswerte wiederverwendet werden kann.Erweitertes Beispiel
Mit dem folgenden Skript können Sie die Einstellungen an einer beliebigen Stelle in Ihrem Skript ändern, während Sie die ursprünglichen Einstellungen beibehalten, bis Sie aufrufen
s:restore_settings()
s:set()
ist etwas ähnlich zuset
. Der Wert der ursprünglichen Einstellung wird gespeichert, wenn er noch nicht gespeichert wurde. Verwenden Sie dann den Wert Ihrer Einstellung.Wenn Sie
s:restore_settings()
ohne Argumente aufrufen, werden Ihre Änderungen vollständig wiederhergestellt. Mit Argumenten werden sie teilweise wiederhergestellt. Wenn Sie sich für diese Option entscheiden, sollten Sies:restore_settings()
vor dem ersten Aufruf aufrufen,s:set()
falls in Ihrem Skript vor der Wiederherstellung zuvor ein Fehler aufgetreten ist.quelle
'set statusline='.a:value
. Da die Variablenzuweisung verwendet wird, ist dies kein Problem. Sie können es mits:set('statusline', 'pipe | test')
oders:set('errorformat', '%A testing %m%Z')
let &{option}=a.value
könnte Probleme verursachen'set {option}'=a.value
. Aber Ihre Erwähnung ist immer noch wertvoll für die Leute (einschließlich mir), die wahrscheinlich nur benutzt haben'set {option}='a.value
.In lh-vim-lib
lh#on#exit()
stelle ich eine Funktion bereit , mit der verschiedene Dinge auf ihren vorherigen Wert zurückgesetzt werden können.In Bezug auf Optionen werden im Wesentlichen nur (für später) a registriert
exe 'let &opt='.&opt
. Ich benutze es so:Wir können so viele Restaurationen registrieren, wie wir möchten. Wir können explizit auf eine lokale Pufferoption abzielen, zum Beispiel :
l:&efm
. Mir ist jedoch keine Möglichkeit bekannt, zu sagen: "Auf den globalen Optionswert zurückgreifen".Beachten Sie, dass die
finally
Klausel wichtig ist. Wenn ein Vorgang fehlschlägt, wird die Option ohne diese Option nicht auf die Einstellungen des Endbenutzers zurückgesetzt.Ich habe keine Möglichkeit bereitgestellt, eine mögliche Option wiederherzustellen. In der Antwort von @ MS.Kim erfahren Sie, wie wir ihre Liste erhalten können. Oder wir könnten das Ereignis mit geänderter Option anhören oder mit dem alten
c_CTRL-A_HOME
Trick spielen (1). Aber ehrlich gesagt verstehe ich den Punkt wirklich nicht. Wenn ich lokal (in einer Funktion) Optionswerte ändere, weiß ich genau, welche Optionen ich optimieren werde.Beachten Sie, dass ich auch:
.restore_option(varname)
.register(':q')
.restore_buffer_mapping('<c-y>', 'i')
(1) Dass ich lh-vim-lib (wie üblich) berücksichtigt habe ->
echo lh#command#matching_askvim('option', '')
quelle
I haven't provided a way to restore any possible option [...]. I don't see the point. When, locally (in a function), I change option values, I exactly know which options I'll tweak.
fair zu sein, kann ich mich nicht erinnern, warum ich das gebraucht habe, aber ich stimme zu, dass es besser ist, nur die Optionen zu wechseln, die Sie ändern müssen.c_CTRL-A_HOME
Trick nicht und ich werde etwas Zeit brauchen, um deinen Code zu groken, aber vielen Dank für die Bereitstellung einer Lösung! (PS Ich würde dich gerne in einem nächsten Tuppervim treffen!)get(g:,
- was mich einige Zeit gekostet hat, um es herauszufinden. Es ist immer noch nützlich für nicht offiziell exponierte Dinge wie Optionen, Umgebungsvariablen usw.