Login


 
Newsletter
Werbung

Mi, 6. August 2003, 00:00

VIM kannste knicken!

Kein Flame, sondern ein neues Feature von VIM 6.0: Folding.

Folding

Das Fold-Feature ist seit der VIM-Version 6.0 integriert. Generell kann man darunter verstehen, Teile des zu editierenden Textes zu knicken oder zu falten (engl. to fold). So können Texte in verschiedene Teilbereiche gegliedert und für den Editierenden momentan uninteressante Bereiche einfach ausgeblendet werden. Ein gutes Beispiel hierfür ist zum Beispiel das Zusammenklappen von Funktionen in Quellcode.

Hier ist ein Screenshot von gefaltetem Quellcode:

geknickt.png
Am Rande: beim Schreiben dieses Textes in texinfo verwende ich auch Faltungen für jedes Kapitel, jede Section und jedes Menü.

Im Screenshot sieht man deutlich zwei gefaltete Funktionen und eine dargestellte, in der verschiedene if-Blöcke aus dem Sichtfeld genommen wurden. Es werden dabei mehrere Textzeilen als eine einzelne angezeigt, wobei der Block jedoch unverändert bleibt. Wenn eine Aktion in der Zeile ausgeführt wird, in der die Faltung angezeigt wird (z.B. <d><d>, für das Löschen einer Zeile) so wird diese auf den gesamten gefalteten Block ausgeführt. Das ist zum Beispiel sehr nützlich, um Kapitel oder Funktionen neu anzuordnen.

Folds erhöhen also einerseits die Übersichtlichkeit und andererseits können sie zur Gliederung von Dokumenten verwendet werden.

Die Verschachtelung der Faltungen passt sich Ihren Wünschen an, wenn Sie manuell falten, oder richtet sich nach der Syntax oder einer Fold Expression.

Es gibt auch zahlreiche Varianten, in Folds zu navigieren oder diese zu manipulieren. Einerseits per Tastenkombination, wie es das üblichere in VIM ist, oder per Maus in GVIM.

Methoden

VIM unterstützt verschiedene Methoden, um zu erkennen, wann eine Faltung veranlasst wird oder um ihren Verschachtelungsgrad zu errechnen. Dabei sollte darauf geachtet werden, dass manche Methoden die Auswertung jeder einzelnen Zeile nach einer Regular Expression erfordern und im schlimmsten Fall, bei relativen Faltungsgrad-Angaben, diese wieder zurückverfolgen müssen. Dafür wird eine Menge Zeit benötigt, und das kann bei langen Dateien zur Last werden.

Die Faltungsmethode wird durch die Variable foldmethod bestimmt. Also lässt sich die Methode durch :set foldmethod=METHODE festlegen.

Übersicht

manual
Faltungen werden manuell vorgenommen und nicht in der Datei gespeichert
indent
Faltungslevel entspricht Einrückungslevel bei jeder Zeile
expr
Stufe der Verschachtelung wird aus einem Ausdruck oder einer Funktion berechnet
syntax
Syntax-Hilighting bestimmt faltbare Regionen
marker
Ist wie manual, aber Markierungen werden in den Dateien gespeichert.

Manuelle Faltung

Manuelle Faltung geschieht durch Markierung einer Region (VISUAL-Modus) und anschließendem Drücken von <z><f>. Durch <z><d> wird ein Fold wieder gelöscht, jedoch bleibt dessen Inhalt erhalten, er wird nur entfaltet. Um eine Faltung samt Inhalt zu löschen, dient ein normales <d><d>.

Die vorgenommenen Faltungen werden in der Datei nicht vermerkt, können jedoch über das VIM-Kommando :mkview mit dem Rest der Ansicht-Einstellungen für diese Datei gespeichert werden. Mit :loadview werden diese dann wiederhergestellt.

Falten nach Einrückung

Bei dieser Methode wird der Faltungsgrad anhand der Einrückung bestimmt. Es wird dabei die tatsächliche Einrückung durch die Variable shiftwidth geteilt, welche festlegt, wie breit eine Einrückung ist. Das heißt, standardmäßig bedeutet die Einrückung von acht Leerzeichen oder einem Tabulator die Erweiterung um ein Foldlevel.

Wenn man Code sinnvoll einrückt, lassen sich mit dieser Methode also durchaus sinnvolle Ergebnisse erzielen, falls es kein syntax File für das Dateiformat gibt, welches Sie editieren wollen. Sie müssen dann lediglich die Zeilen, die in eine Faltung sollen, in die gleiche Spalte rücken.

Faltungslevel von Ausdruck

Bei dieser Methode wird das Foldlevel durch einen Ausdruck in der Variablen foldexpr berechnet. Was sich in diesem Ausdruck befindet, ist Ihnen selbst überlassen. Es können hier simple VIM-Kommandos stehen, aber auch komplexe Funktionen eingearbeitet werden. Der angegebene Ausdruck muss sich zu einer oder mehrerer der folgenden Möglichkeiten auswerten lassen.

0
Zeile befindet sich in keinem Faltungsbereich.
1, 2, ..., n
Zeile befindet sich im Foldlevel 1, 2, ..., n
-1
Faltungsgrad soll von vorherigen oder nachkommenden Zeilen übernommen werden. Dabei wird der niedrigere von beiden verwendet.
=
Faltungsgrad der vorherigen Zeile wird übernommen.
a1, a2, ..., an
Es werden 1, 2, ..., n Foldlevels zu dem der vorherigen Zeile addiert.
s1, s2, ..., sn
Es werden 1, 2, ..., n Foldlevels von dem der vorherigen Zeile subtrahiert.
&lt;1, &lt;2, ..., &lt;n
Faltung mit angegebenem Level endet in dieser Zeile
&gt;1, &gt;2, ..., &gt;n
Faltung mit angegebenem Level beginnt hier.

Die Angabe neuer Foldlevels durch &gt;1 oder &lt;1 ist optional, da bei jedem Level-Unterschied zur vorherigen oder nachkommenden Zeile eine neue Faltung gemacht wird. Sich auf die vorhergehende oder nachfolgende Zeile beziehende Werte sollten vor allem bei großen Dateien vermieden werden, da sie oft das Zurückverfolgen vieler Zeilen in der ganzen Datei auslösen.

Falls der Ausdruck fehlschlägt, kommt es zu keiner Fehlermeldung, stattdessen wird ein Standard-Foldlevel von 0 angenommen.

Im folgenden Beispiel wird eine Funktion zur Auswertung des Faltungsgrades mit der Zeilennummer als Parameter verwendet. Diese sollte eine der obenstehenden Möglichkeiten zurückgeben.

:set foldexpr=FaltungsGrad(v:lnum)

Falten nach Syntax

Dies ist meiner Meinung nach die sinnvollste Methode der automatischen Faltungsgradbestimmung. Hier werden einfach die Syntaxhighlight-Definitionen zu Rate gezogen. Man definiert hier Blöcke zwischen einer Anfangs- und Endmarkierung, in denen ein neuer Foldlevel begonnen werden soll. Im Falle von C wäre das einfachsterweise alles zwischen { und }. Man benötigt dazu nur folgende Zeile:

:syn region cBlock start="{" end="}" transparent <em>fold</em>

Das ausschlaggebende Mittel ist hier das Keyword fold, was VIM dazu veranlasst, den angegebenen Block automatisch zu falten.

Für eine Reihe von Sprachen existieren solche Definitionen bereits und müssen lediglich durch das Setzen von Variablen noch aktiviert werden. Für Perl zum Beispiel reichen folgende Kommandos aus, um das Falten in vollem Sprachumfang zu aktivieren:

:let perl_fold=1
:let perl_fold_blocks=1
Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung