Ich habe die Hilfeseite zu fold-expr ( :h fold-expr
) gelesen, aber sie hat nicht erklärt, welche Syntax im Ausdruck verwendet wird.
Es gab dort vier Beispiele:
:set foldexpr=getline(v:lnum)[0]==\"\\t\"
:set foldexpr=MyFoldLevel(v:lnum)
:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
:set foldexpr=getline(v:lnum-1)=~'^\\s*$'&&getline(v:lnum)=~'\\S'?'>1':1
Ich habe verstanden, dass dies v:lnum
die Zeile ist, die eine Einrückungsstufe benötigt, und dass Ausdruck zwei ein Aufruf einer Funktion ist.
Was ist mit den Ausdrücken 1,3 und 4? Kann mir bitte jemand das erklären?
Antworten:
Von
:help 'foldexpr'
:Das
foldexpr
wird ausgewertet, daher muss es sich um VimL-Code handeln. "spezielle Syntax" oder ähnliches wird nicht erwähnt. Das Ergebnis dieser Bewertung steuert, was Vim als Falte ansieht oder nicht.Mögliche Werte sind
Dies ist nicht die vollständige Liste; nur die in den Beispielen in Ihrer Frage verwendeten. Siehe
:help foldexpr
für die vollständige Liste.Zuerst
Der erste ist ziemlich einfach, wenn wir einige Leerzeichen hinzufügen und die Backslashes entfernen, die wir benötigen, damit dies in einem
:set
Befehl funktioniert :getline(v:lnum)
bekommt die ganze Zeile.[0]
bekommt den ersten Charakter davon== "\t"
prüft, ob dies ein Tabulatorzeichen ist.Wenn Sie dies erweitern würden, um die Anzahl der Registerkarten zu zählen , hätten Sie einrückungsbasiertes Falten (zumindest, wenn
expandtab
es nicht aktiviert ist).Dritte
Der dritte ist wirklich nicht viel komplizierter als der erste; Wie beim ersten Beispiel möchten wir es zunächst lesbarer machen:
getline(v:lnum)
=~
zu'^\s*$'
;^
Anker am Anfang,\s
bedeutet ein beliebiges Leerzeichen,*
bedeutet, dass die vorherigen null oder mehrmals wiederholt werden, und$
Anker am Ende. Dieser reguläre Ausdruck entspricht also (gibt true zurück) für leere Zeilen oder Zeilen mit nur Leerzeichen.getline(v:lnum + 1)
bekommt die nächste Zeile.\S
, was mit jedem Nicht-Leerzeichen irgendwo in dieser Zeile übereinstimmt.<1
andernfalls1
. Dies geschieht mit demif
aus C und einigen anderen Sprachen bekannten "ternären" :condition ? return_if_true : return_if_false
.<1
bedeutet, dass eine Falte auf dieser Linie endet und1
eine Faltebene bedeutet.Wenn wir also eine Falte beenden, wenn die Zeile leer ist und die nächste Zeile nicht leer ist. Ansonsten sind wir auf Foldlevel 1. Oder, wie
:h foldexpr
es heißt:Vierte
Der vierte verhält sich genauso wie der dritte, macht es aber etwas anders. Erweitert ist es:
Wenn die vorherige Zeile eine leere Zeile ist und die aktuelle Zeile eine nicht leere Zeile ist, beginnen wir eine Falte in dieser Zeile (
>1
). Wenn nicht, setzen wir die Falzstufe auf 1.Nachwort
Die Logik aller drei Beispiele ist also sehr einfach. Die größte Schwierigkeit ergibt sich aus dem Platzmangel und der Verwendung von Backslashs.
Ich vermute, dass das Aufrufen einer Funktion einen gewissen Overhead hat, und da dies für jede Zeile ausgewertet wird, möchten Sie eine anständige Leistung erzielen. Ich weiß jedoch nicht, wie groß der Unterschied bei modernen Maschinen ist, und würde empfehlen, dass Sie eine Funktion (wie im zweiten Beispiel) verwenden, es sei denn, Sie haben Leistungsprobleme. Denken Sie an The Knuth: "Vorzeitige Optimierung ist die Wurzel allen Übels" .
Diese Frage bezieht sich auch auf StackOverflow , das eine etwas andere Antwort hat. Aber meins ist natürlich besser ;-)
quelle
Sie fragen sich im Wesentlichen, was die anderen Elemente in diesen Ausdrücken sind, die Sie finden können, indem
:help
Sie nacheinander eines von ihnen aufrufen :Ich habe diese Ausdrücke nach ihren Teilen unten aufgeschlüsselt, um ihre Bedeutung zu veranschaulichen:
1 Gibt 1 für alle Zeilen zurück, die mit einer Registerkarte beginnen, und 0 für andere Zeilen:
3 Endet Falten in Leerzeilen nach Absätzen:
4 Startet Falten in Leerzeilen, beginnend mit Absätzen:
Die Bedeutungen
<1
,>1
usw. sind direkt unter dieser Ausdrücke in:help fold-expr
quelle
Ich habe meine Antwort versehentlich als Kommentar gepostet und sie frühzeitig eingereicht. Verdammt mobil.
Nach meinem Verständnis sollte der Ausdruck eine Zahl zurückgeben, und diese Zahl wird verwendet, um zu bestimmen, auf welcher Ebene die angegebene Linie gefaltet wird. 0 ist nicht gefaltet, 1 ist die äußerste Falte, 2 ist eine Falte, die in einer Falte der Ebene 1 verschachtelt ist, und so weiter.
Die Ausdrücke in den Beispielen sehen so aus, als würden sie als wahr oder falsch bewertet. VimScript hat keinen richtigen Booleschen Typ, daher ist dies wirklich 1 oder 0, was gültige Falzstufen sind.
Sie können Ihren eigenen Ausdruck mit VimScript schreiben, das so einfach wie die Rückgabe von 1 oder 0 oder komplizierter ist und verschachtelte Falten zulässt.
quelle