2017-09-04 4 views
0

ich eine Debug-Datei, die wie folgt aussieht:vim - mit mehr als einem Marker Falten

==>func1: 
..... 
.. 
==>func2: 
...... 
... 
<==func2 
.. 
<==func1 
==>func3: 
...... 
... 
<==func3 

Grundsätzlich wäre Ich mag Lage sein, jede der Funktionen zu falten, um schließlich so etwas wie dies zu sehen:

+-- x lines: ==> func1: 
+-- x lines: ==> func3: 

aber noch in der Lage sein func1 um zu erweitern und func2 gefaltet:

==>func1: 
..... 
.. 
+-- x lines: ==> func2: 
.. 
<==func1 

gibt es eine Möglichkeit, dies zu tun? Vielen Dank.

Antwort

0

Die unerreichte Marker benötigen zusätzliche Griff, hier ist eine ausdr Lösung (siehe :h fold-expr):

setlocal foldmethod=expr 
setlocal foldexpr=GetFoldlevel(v:lnum) 

function GetFoldlevel(lnum) 
    let line = getline(a:lnum) 

    let ret = '=' 
    if line[0:2] == '==>' 
     let name = matchstr(line, '^==>\zs\w*') 
     let has_match = HasMarkerMatch(a:lnum, name) 
     if has_match 
      let ret = 'a1' 
     endif 
    elseif line[0:2] == '<==' 
     let ret ='s1' 
    endif 

    return ret 
endfunction 

function HasMarkerMatch(lnum, name) 
    let endline = line('$') 
    let current = a:lnum + 1 

    let has_match = 0 
    while current <= endline 
     let line = getline(current) 

     if line =~ '^<=='.a:name 
      let has_match = 1 
      break 
     endif 

     let current += 1 
    endwhile 

    return has_match 
endfunction 
+0

mein Problem ist, dass es Fälle geben kann, wo in der Debug-Datei, Funktion wie zum Beispiel func4 die haben öffnender Marker aber kein schließender Marker und es wird die gesamte Faltung zerstören: ==> func1: ..... .. ==> func2: ...... == func4: ... <== func2. <==func1 ==> func3: ...... ... <== func3. Es sieht so aus, als ob Ihre Lösung fast das ist, was ich brauche, außer für das Problem, dass func4 opening marker auch mit dem schließenden Marker von func2 gefaltet wird. Gibt es eine Möglichkeit, deine Lösung so zu ändern, dass das Falten genau nach dem Funktionsnamen erfolgt? –

+0

Antwort wird aktualisiert, um nur diese gepaarten Marker zu falten. – leaf