Zweifache Methoden gleichzeitig

8

Ich möchte zwei Methoden zum Falten festlegen

  1. :set foldmethod=indent und behält alle seine Funktionen
  2. Kommentare ausblenden mit

    :set foldmethod=marker

    :set foldmarker=/*,*/

Ich habe herausgefunden, dass dies nicht möglich ist. Ist es möglich, die gewünschte Faltung zu erreichen und dies in .vimrc zu setzen oder dafür ein Skript oder Plugin zu verwenden?

    
xralf 11.05.2011, 20:00
quelle

3 Antworten

8

Es ist nicht möglich, verschiedene Faltungsmethoden in demselben Puffer zu verwenden. Wie kann Vim wissen, dass es auf derselben Ebene wie der andere Text einige Kommentare gibt, die Sie als eine andere (höher nummerierte) Ebene behandeln möchten?

Ich bin sicher, dass Sie erreichen können, was Sie wollen, indem Sie foldmethod auf 'expr' setzen. Dies ist der flexibelste Weg, Falten in Vim zu machen, kann aber kompliziert (und / oder langsam) werden, je nachdem, was Sie wollen. Ich denke, dass es für Ihren Anwendungsfall ziemlich leicht funktionieren würde.

Zuerst müssen Sie irgendwo in Ihren vimrc oder vimscripts sicherstellen, dass foldexpr für den fraglichen Dateityp definiert wird.

%Vor%

und Sie müssen dann Ihre foldexpr-Funktion so anpassen, dass sie Ebenen auf eine Weise zuordnet, die zu dem von Ihnen gewünschten Verhalten führt. Etwas wie der folgende Code könnte in Situationen, in denen jede Kommentarzeile ein Präfix-Symbol hat (d. H. Nicht in Ihrem Fall), fast funktionieren, aber ich erwarte, dass es einige Optimierungen benötigt. h: fold-expr wäre ein guter Ort, um nach Hilfe zu suchen:

%Vor%

Müsste geändert werden, um eine höhere Ebene für Zeilen zwischen Anfangs- und Endmarkierungen für Kommentare wie gewünscht zu vergeben:

%Vor%

Ich erwarte nicht, dass die foldmethod-Funktionen, die ich geschrieben habe, genauso funktionieren würden wie geschrieben. Aber sie zeigen den Weg zu etwas, das funktionieren würde.

Beachten Sie, dass die Verwendung der Stufe '20' für Kommentare nur eine willkürliche Ebene ist, die es erlaubt, sie zu falten, während alle eingerückten Code (vermutlich unterer Level) sichtbar sein könnten. '21' für die letzte Zeile des Kommentarbereichs dient lediglich dazu, sie von den vorherigen Zeilen mit Kommentaren zu unterscheiden, die eine Stufe von 20 haben, um zu wissen, dass die nächste Zeile als reguläre Codezeile behandelt werden sollte.

Auch Tastenkommandos wie 'zc' und 'zo' funktionieren bei Kommentaren nicht ganz richtig, wenn sie viel höher als der umgebende Code eingestellt sind. Möchten Sie den direkten Befehl wie :set foldlevel=21 verwenden, um alle Kommentarzeilen anzuzeigen.

Nicht hübsch, und ich nehme an, es könnte ein wenig vereinfacht werden, aber etwas wie das ist, was ich für das, was Sie wollen, erforderlich ist.

Wenn ich mir das etwas genauer durchführe, denke ich, dass die erste Zeile aller Kommentarblöcke auf derselben Ebene sein sollte, als wäre sie eine Nichtkommentarzeile, dann müssten nur nachfolgende Kommentarzeilen im selben Block vorhanden sein auf höherer Ebene, um sie in die Startkommentarzeile "falten" zu lassen. In dem Code, den ich gab, wenn es überhaupt funktioniert oder überhaupt funktioniert, glaube ich, dass vim alle die Kommentarzeilen hinter der vorhergehenden Nichtkommentarzeile falten würde, was aber nicht das ist, was Sie wollen Ich habe leider keine Zeit mehr für dieses kleine Puzzle. . . Ich habe diese Art von Custom-Folding schon einige Male gemacht und habe immer ein bisschen Versuch und Irrtum, genau das zu bekommen, was ich will.

    
Herbert Sitz 11.05.2011, 21:59
quelle
1

Syntax-basierte Faltung ist möglicherweise ein besserer Weg, um zu bekommen, was Sie wollen, als die expr-basierte Methode, die ich in verschiedenen Antworten auf Ihre Frage vorgeschlagen habe. Überprüfen Sie :h fold-syn auf weitere Informationen. Ich denke, dass es bereits einige gute Lösungen für das c-basierte Falten gibt. Ich weiß nicht, wie gut es ist, aber hier ist eine C-Syntax-Datei mit Unterstützung für Syntax-basierte Faltung: Ссылка und ein anderer: Ссылка

Die obigen Lösungen sind vollständig syntaxbasiert und beinhalten keine Einrückungen, um die Falzebenen zu bestimmen. Sie könnten jedoch die syntaxbasierte Faltung ändern, um die Hauptfaltung nach eingerückten Bereichen durchzuführen. Wenn Sie einen Einzug auf Basis von syntaktischen Elementen durchführen, kann das Ergebnis trotzdem gleich sein.

Hier ist ein Tipp, der zeigt, wie man Kommentare im C-Stil einfach faltet (nicht den eigentlichen Code)   Ссылка

    
Herbert Sitz 11.05.2011 23:16
quelle
0

Ich habe die gleichen Wünsche wie Ihre, hier ist meine nicht perfekte Lösung

Mein Herstellerpaar ist # & lt; === und # === & gt; (oder #region und # endregion wie in pycharm)

%Vor%

Jetzt kann ich alle Funktionen beibehalten, wenn ich die Einzugfaltenmethode verwende, und ich kann jedes # & lt; =, # = & gt; marker block, Außerdem werden die Faltungsrelationen der Linien in jedem Block beibehalten.

In dieser Funktion vermeide ich die Verwendung von "a1", "s1" und "=", was eine Iteration für diese Funktion verursacht und bei großen Dateien langsam sein kann. Wenn Sie jedoch Zeilen aktualisieren, ist die Berechnung der Falzebene möglicherweise falsch (weil vim möglicherweise nicht alle Falzebenen von Anfang an aktualisiert und daher einen falschen inBlock-Wert aufweist)

Sie können zx verwenden, um die Falzstufen manuell zu aktualisieren.

Weitere Informationen finden Sie unter Ссылка

    
Major F 09.06.2016 15:30
quelle

Tags und Links