Anzahl der sichtbaren Linien im Dokument mit Faltung zählen?

7

Ich möchte ein Plugin schreiben, das das foldleveleines neu geöffneten Dokuments automatisch so einstellt , dass so viel wie möglich vom Dokument auf den Bildschirm passt. (Mit anderen Worten, ich möchte sicherstellen, dass kurze Dokumente vollständig erweitert geöffnet werden, während lange geöffnete Dokumente größtenteils reduziert sind.)

Gibt es in vim eine integrierte Funktion, die die Anzahl der sichtbaren Linien in einem Dokument angesichts des aktuellen Falzstatus oder einer bestimmten Faltebene angibt? ( Dh geschlossene Falten zählen als eine Zeile, aber auch Zeilen, die Sie nach unten scrollen müssen, um zu sehen, werden gezählt.)

Ryan Lue
quelle

Antworten:

6

Gute Idee! Hier ist eine Grundfunktion, mit der Sie Ihr Ziel mit einer anderen Technik erreichen können:

function! FitOnPage()
  normal! zR
  while &foldlevel > 0
    if line('w0') == 1 && line('w$') == line('$')
      break
    endif
    normal! zm
  endwhile
endfunction

Es funktioniert, indem zuerst alle Falten erweitert werden. Anschließend werden Falten (global) geschlossen, bis das gesamte Dokument auf dem Bildschirm angezeigt wird oder alle Falten geschlossen sind.

Es wird überprüft, ob die gesamte Datei auf dem Bildschirm angezeigt wird, indem überprüft wird, ob die erste und die letzte angezeigte Zeile die erste und die letzte Zeile der Datei sind.

Sie könnten dies ein wenig verbessern, indem Sie die Falten einzeln schließen, aber das wäre viel komplizierter.

Reich
quelle
Das ist eine clevere Alternative. Ich nehme an, wenn Sie wirklich wissen möchten, wie viele sichtbare Linien sich über dem gesamten Dokument befinden, können Sie so etwas tun normal G | let i = 0 | while line('.') > 1 | normal k | let i += 1 | endwhile. Vielleicht werde ich dieses Wochenende damit anfangen, daran zu basteln. Vielen Dank!
Ryan Lue
@RyanLue Ich habe gerade meine Funktion aktualisiert, um die line()Argumente zu verwenden, die Sie in Ihrer kurzlebigen Antwort erwähnt haben, anstatt den Cursor zu bewegen.
Rich
Ahahaha, ich habe diese Antwort schnell zurückgezogen, nachdem mir klar wurde, dass sie nicht wirklich das tat, was ich wollte. Es war ein Tag der Brainfarts. -_- '
Ryan Lue
@ RyanLue Könnte nicht getan haben, was Sie wollten, aber es tut sicher, was ich will! ;)
Rich