Frage Stoppen Sie vim, Falten dynamisch zu aktualisieren


Gibt es eine Möglichkeit, Vim davon abzuhalten, Falten automatisch im laufenden Betrieb zu aktualisieren? Ich liebe die Faltung von vim, und ich bevorzuge es im Syntax-Modus, so dass Falten entstehen, wenn ich tippe. Aber zum Beispiel, wenn ich Code C ++ und ich schreibe eine Klammer {es schließt automatisch alle nachfolgenden Falten, und wenn ich schließen Sie dann die Klammer wieder mit a}, automatisch vim erweitert alle nachfolgenden Falten, was bedeutet, dass ich alles refold.

Ein anderes verwandtes Problem, wenn ich das gleiche Dokument in einem anderen Puffer geöffnet habe, sage ich habe ": split", dann schreibe ich eine offene Klammer {schachtelt alle Falten in den Puffer unter der Falte, in der ich die Klammer geöffnet habe, und schließe es wird die Falten entketten, aber auch alle schließen. Wenn ich entweder "." oder "->", um auf eine Mitgliedsfunktion / -variable zuzugreifen, setzt sie alle Falten im Puffer zurück, egal was der aktuelle Faltlevel ist, unabhängig davon, welche Falten ich selbst geöffnet / geschlossen habe.

Das ist etwas frustrierend, wenn ich das gleiche Dokument in zwei Puffern geöffnet habe, damit ich den Inhalt einer Funktion lesen kann, wenn ich eine andere schreibe, da ich ständig die Puffer wechseln und meine Falten wieder öffnen muss.

In meiner .vimrc habe ich

set foldmethod=syntax

und das ist es. Für die automatische Vervollständigung verwende ich clang-complete und supertab mit:

let g:SuperTabDefaultCompletionType = "<c-x><c-u><c-p>"

Ich denke, das ist alles, was das beeinflussen kann.

Bearbeiten:

Einige Bilder hinzugefügt, um das Problem zu veranschaulichen


7
2018-01-22 10:36


Ursprung


Antworten:


Beide Probleme können mit den folgenden beiden gelöst werden autocmds:

autocmd InsertLeave,WinEnter * setlocal foldmethod=syntax
autocmd InsertEnter,WinLeave * setlocal foldmethod=manual

Dies setzt den Puffer lokal 'foldmethod' zu manual wenn der Einfügemodus eingegeben wird oder sein Fenster (eine Pufferanzeige) verlassen wird und auf es gesetzt wird syntax wenn der Einfügemodus verlassen oder sein Fenster eingegeben wird.

Dies funktioniert, weil Einstellung 'foldmethod' zu manual behält die automatisch erstellten Falten bei syntax als ob Sie sie selbst einstellen (manuell), und manuelle Falten werden nicht basierend auf der Syntax der Datei aktualisiert.

Ich habe zwei Fehler mit dieser Lösung gefunden:

  1. Wenn Sie im Einfügemodus Fenster wechseln, wird autocmd wird das einstellen 'foldmethod' zu syntax für das neue Fenster, obwohl es im Einfügemodus ist und auf eingestellt werden sollte manual.

    Das ist nicht wirklich ein Problem für mich, weil ich Vim wie eine zivilisierte Person benutze und standardmäßig im normalen Modus arbeite.

  2. Wann

    • ein neuer Puffer wird erstellt (z. B. durch Lesen einer Datei)
    • und 'foldlevel' ist 0
    • und eine bestimmte Syntax wird verwendet (Ich bin in der Lage, das Problem mit einer C-Datei zu duplizieren)
    • und das o oder O Mit dem Befehl wird der Einfügemodus aufgerufen zum ersten Mal in diesem Puffer (tun i<esc>o dupliziert den Fehler nicht),

    dann werden alle Falten unterhalb des Cursors geöffnet.

    Ich habe dies beim Testen der obigen Lösung zufällig entdeckt, und jetzt, im Rückblick, bin ich überrascht, dass ich es gefunden habe; es ist fast nicht erwähnenswert. Ich habe nicht vor, eine Testdatei zu schreiben, die die genaue Syntax hat, die notwendig ist, um den Fehler zu duplizieren, so dass dies für einen anderen Äon unbemerkt bleibt.


Ich habe diese Frage vor einigen Monaten entdeckt und die Lösung Ben benutzt verbunden mit für eine Weile, bevor schließlich genug genervt mit dem multiplen Fenster für einen Puffer-Problem (Ihr zweites Problem), um es zu beheben.

Also danke an Ben für seine Lösung, und Sie für diese Frage!


5
2018-06-03 11:13



Ich habe eine kleine Änderung an der Antwort von user4830797 vorgenommen, die hilft, Situationen zu behandeln, in denen die Datei, die Sie bearbeiten, nicht verwendet wird foldmethod=syntax (Zum Beispiel eine .vimrc-Datei, die möglicherweise verwendet wird foldmethod=marker):

autocmd InsertLeave,WinEnter * let &l:foldmethod=g:oldfoldmethod
autocmd InsertEnter,WinLeave * let g:oldfoldmethod=&l:foldmethod | setlocal foldmethod=manual

3
2018-02-17 00:55



Ich denke, du musst nachsehen :h 'foldlevel. Du solltest es vielleicht auch benutzen :mkviewwahrscheinlich in autocmd welche manuell offene und geschlossene Falten wiederherstellt.

Abgesehen davon, dass Sie die Faltmethode möglicherweise für verschiedene Dateitypen anders einstellen sollten (zum Beispiel bei C könnten Sie sie auf manuell oder als Marker setzen)


0
2018-01-22 13:50



Wenn Sie die faltenmethode vorübergehend auf manuell setzen, behält Vim alle Falten, die derzeit durch die Syntax definiert sind, und behält sie im exakten offenen / geschlossenen Zustand, in dem Sie sie jetzt haben. Dies kann automatisch mit einem InsertEnter-Befehl autocmd ausgeführt und auf InsertLeave wiederhergestellt werden, um Ihre Faltzustände in einem einzigen Fenster zu schützen. Leider habe ich noch keine Zeit damit verbracht, es in geteilten Fenstern zum Laufen zu bringen, aber mit windowlokalen Variablen ist es einfach genug, sogar den Benutzer zu berücksichtigen, der Fenster oder etwas wechselt, ohne den Einfügemodus zu verlassen. Sehen http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text für Details und Diskussion.


0
2018-01-23 03:56