Przeczytałem stronę pomocy dotyczącą fold-expr ( :h fold-expr
), ale nie wyjaśniło to, jakiej składni użyto w wyrażeniu.
Były cztery przykłady:
: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
Zrozumiałem, że v:lnum
jest to linia, która wymaga poziomu wcięcia, a to wyrażenie drugie jest wywołaniem funkcji.
co z wyrażeniami 1,3 i 4? Czy ktoś może mi je wyjaśnić?
Odpowiedzi:
Od
:help 'foldexpr'
:foldexpr
Jest oceniany, więc to musi być kod VimL; nie ma wzmianki o „specjalnej składni” lub podobnej. Wynik tej oceny kontroluje to, co Vim uważa za pasowanie, czy nie.Możliwe wartości to
To nie jest pełna lista; tylko te użyte w przykładach w twoim pytaniu. Zobacz
:help foldexpr
pełną listę.Pierwszy
Pierwszy z nich jest dość prosty po dodaniu spacji i usunięciu ukośników odwrotnych potrzebnych do uruchomienia tego
:set
polecenia:getline(v:lnum)
pobiera całą linię.[0]
dostaje pierwszą tego postać== "\t"
sprawdza, czy jest to znak tabulacji.Jeśli rozwinąłbyś to, by policzyć liczbę zakładek, miałbyś składanie oparte na wcięciach (przynajmniej wtedy, gdy
expandtab
nie jest włączone).Trzeci
Trzeci nie jest tak naprawdę bardziej skomplikowany niż pierwszy; tak jak w pierwszym przykładzie, najpierw chcemy, aby był bardziej czytelny:
getline(v:lnum)
=~
do do'^\s*$'
;^
zakotwiczenia na początku,\s
oznacza dowolny znak spacji,*
oznacza powtórzenie poprzedniego zero lub więcej razy i$
zakotwiczenie na końcu. Tak więc wyrażenie regularne dopasowuje (zwraca true) dla pustych linii lub linii tylko z białymi spacjami.getline(v:lnum + 1)
dostaje następną linię.\S
Dopasowujemy to do , co odpowiada dowolnemu znakowi spoza dowolnego miejsca w tym wierszu.<1
, w przeciwnym razie1
. Odbywa się to z „trójskładnikowego”if
znanego z C oraz niektórych innych językach:condition ? return_if_true : return_if_false
.<1
oznacza,1
że zakładka kończy się na tej linii, i oznacza zakładkę pierwszego poziomu.Więc jeśli zakończymy pas, jeśli linia jest pusta, a następna linia nie będzie pusta. W przeciwnym razie jesteśmy na foldlevel 1. Lub, jak
:h foldexpr
to mówi:Czwarty
Czwarty zachowuje się tak samo jak trzeci, ale robi to w nieco inny sposób. Rozszerzony, to:
Jeśli poprzednia linia jest pustą linią, a bieżąca linia jest
>1
niepustą linią, rozpoczynamy składanie na tej linii ( ), jeśli nie, ustawiamy poziom foldelowania na 1.Posłowie
Logika wszystkich 3 przykładów jest naprawdę bardzo prosta. Większość trudności wynika z braku spacji i użycia odwrotnego ukośnika.
Podejrzewam, że wywołanie funkcji ma pewne obciążenie, a ponieważ jest to oceniane dla każdej linii, chcesz mieć przyzwoitą wydajność. Nie wiem jednak, jak duża jest różnica na nowoczesnych komputerach, i zaleciłbym użycie funkcji (jak w drugim przykładzie), chyba że masz problemy z wydajnością. Pamiętajmy o Knutcie: „przedwczesna optymalizacja jest źródłem wszelkiego zła” .
To pytanie dotyczy także StackOverflow , który ma nieco inną odpowiedź. Ale mój jest oczywiście lepszy ;-)
źródło
Zasadniczo pytasz, jakie są inne elementy tych wyrażeń, które można znaleźć, wywołując kolejno
:help
jeden z nich:Podzieliłem te wyrażenia według ich części poniżej, aby pomóc zilustrować ich znaczenie:
1 Zwraca 1 dla wszystkich linii zaczynających się od tabulatora i 0 dla innych linii:
3 Kończy fałdy na pustych liniach po akapitach:
4 Rozpoczyna fałdy na pustych liniach rozpoczynających akapity:
Znaczenia
<1
,>1
itp są tuż poniżej tych wyrażeń w:help fold-expr
źródło
Przypadkowo opublikowałem moją odpowiedź jako komentarz i przesłałem ją wcześnie. Darn mobile.
Rozumiem, że wyrażenie powinno zwracać liczbę i ta liczba zostanie wykorzystana do ustalenia, na którym poziomie dana linia zostanie zwinięta. 0 nie jest złożone, 1 jest najbardziej zewnętrznym zagięciem, 2 jest zagięciem zagiętym wewnątrz zagięcia poziomu 1 i tak dalej.
Wyrażenia w przykładach wyglądają tak, jakby miały wartość prawda lub fałsz. VimScript nie ma odpowiedniego typu logicznego, więc tak naprawdę będzie to 1 lub 0, które są prawidłowymi poziomami foldowania.
Możesz napisać własne wyrażenie za pomocą VimScript, który jest tak prosty, jak zwracanie 1 lub 0, lub bardziej skomplikowany, pozwalając na zagnieżdżanie zagięć.
źródło