Tabs, Space (oder beides)?
Es ist ja ein längerer Streitpunkt zwischen Entwicklern, mit welchem Zeichen eingerückt wird. Vim bietet an dieser Stelle drei verschiedene Möglichkeiten:
- Einrückung mit Tabs - Jede Einrückung wird einfach durch ein Tab-Zeichen ersetzt. Dies ist die Standardmethode in den meisten Editoren so auch in vim. Steuern lässt sich dies mit der Option noexpandtab
- Einrückung mit Leerzeichen und Tabs - Da Tabs sehr schell sehr hässlich werden, wenn man sie nicht konsequent umsetzt gibt es die Möglichkeit die Breite eines Tabs konstant (default: acht Zeichen) zu lassen aber nur mit weniger einzurücken (shiftwidth). Also zum Beispiel Einrückung vier Zeichen, Tabbreite acht Zeichen: Einmal Tab bedeutet vier Leerzeichen werden eingefügt. Zweimal Tab machen ein wirkliches Tab. Und bei drei wären es ein Tab und 4 Leerzeichen. Setzen lässt sich das über smarttab.
- Einrückung nur mit Leerzeichen - Jeder Tab wird einfach durch die angegebene Anzahl von Leerzeichen ersetzt. Dies ist auch die von mir favorisierte Methode da nichts irgendwie verhauen wird wenn jemand anderes eine andere Breite von Tabs verwendet. Einstellen lässt sich die Option einfach durch expandtab.
Breite der Einrückung
Hierfür gibt es zwei Optionen. Einmal tabstop und dann noch shiftwidth. Üblicherweise sollte man beides auf den selben Wert lassen. Nur wenn man, wie oben beschrieben, Tabs und Leerzeichen mischen möchte, dann gibt tabstop an wie viele Leerzeichen durch ein Tab ersetzt werden und shiftwidth setzt die Breite einer Einrückungsstufe
Automatische Einrückung
Vim unterstützt selbstverständlich auch eine automatische Einrückung. Hierfür gibt es verschiedene Mods. Einmal gibt es autoindent welches einfach die Einrückung der letzten Zeile in die nächste übernimmt. Etwas Schlauer ist da smartindent. Hierbei werden einige Keywords und geschweifte Klammern beachtet. Diese beiden Methoden bilden die Basis und können immer aktiviert bleiben.
Unabhängig davon gibt es spezielle Einrückungen für eine große Anzahl von Sprachen. Einmal wäre da das eingebaute cindent welches sich auf Einrückung für c spezialisiert. Da man meistens
aber doch an anderen Sprachen als c arbeitet gibt es die Möglichkeit einige Einrückungs-Schematas, die in den meisten vim Installationen
mitgeliefert werden, zu aktivieren. Hierzu reicht ein einfaches filetype plugin indent on
. Hierdurch versucht vim beim laden der
Datei durch die Dateiendung oder Shee-Bang-Zeile zu erkennen um welche Art von Datei es sich handelt und lädt das entsprechende Profil. Die
installierten Profile liegen in einzelnen Dateien im indent Ordner von vim.
Für die vimrc
Merken wir uns also folgende Optionen für unsere vimrc:
" use only Spaces set expandtab " indent with two spaces set tabstop=2 set shiftwidth=2 " nativ indent detection set autoindent set smartindent " activate language detection filetype plugin indent on
Commands
Kommen wir nun zu der Anwendung.
Ein-/Ausrücken
Ist man gerade im Einfügemodus kann man einfach mit strg+T
eine Stufe einrücken bzw. mit strg+D
eine Stufe
wieder ausrücken. Viel flexibler ist man allerdings im Befehlsmodus. Hier lassen sich <
und >
verwenden
um entsprechend die Einrückung zu verändern. Am einfachsten über <<
und >>
. Dies verrückt einfach
die aktuelle Zeile um eine Stufe. Möchte man nun mehrere Zeilen verrücken dann kann man auch <{motion}
verwenden. Motion
ist hier jede beliebige Bewegung wie man sie in vim kennt. (G
= bis zum Ende des Dokumentes, 35G
= bis zur Zeile
35
, 3j
= 3 Zeilen nach unten, etc...) Interessant ist hierbei das man auch wie gewohnt den letzten Befehl mit
.
wiederholen kann. Also würde >4..
vier Zeilen drei mal einrücken. Wer sich da noch etwas unsicher ist
kann auch erstmal im visuellen Modus alles markieren und dann einfach die markierten Zeilen mit >
einrücken. Beispiel:
V2j3>
rückt die nächsten zwei Zeilen drei mal ein.
Und zum Schluss noch der Kommandozeilenmodus: Hier kann man mittels :left X
angeben, dass die Einrückung der aktuellen Zeile (mittels angegebenem Bereich auch mehr als
nur die aktuelle Zeile) auf X gesetzt wird.
Für den Spickzettel:
Sorry aber ich habe mal das mehr oder weniger aus der vim Hilfe übernommen. Ich glaub übersichtlicher hätte ich es nicht ausdrücken können.
<{motion}
- Shift
{motion}
lines one shiftwidth leftwards. <<
- Shift
[count]
lines one shiftwidth leftwards. {Visual}[count]<
- Shift the highlighted lines
[count]
shiftwidth leftwards. :[range]<
- Shift
[range]
lines one shiftwidth left. Repeat'<'
for shifting multiple shiftwidths. :[range]< {count}
- Shift
{count}
lines one shiftwidth left, starting with[range]
(default current line). Repeat'<'
for shifting multiple shiftwidths. :[range]le[ft] [indent]
- left align lines in
[range]
. Sets the indent in the lines to[indent]
(default 0).
Automatisch Einrücken
Und jetzt das Beste. Wer sich ärgert, dass seine Einrückung nicht mehr stimmt soll einfach mal ={motion}
ausprobieren. ==
korrigiert die aktuelle Zeile und
wie gewohnt lässt sich dies mit dem visuellen Modus etc kombinieren (siehe oben <
Operator). So rückt zum Beispiel ein gg=G
den kompletten
Text ein.
Misc
Eigentlich wollte ich ja mit diesem Beitrag die komplette Einrückung in vim erschlagen aber irgendwie ist es schon wieder viel zu lange geworden und ich bin immer noch nicht fertig. Es gibt noch Plugins die bei der Einrückung unterstützen und Einstellungen die ein detailiertes Konfigurieren ermöglichen. Was man aber auf jeden Fall noch kurz erwähnen sollte ist einmal :retab welches hilft die Einrückung von Text zu ändern. Und ganz wichtig die Option paste welche, wenn aktiviert einige Optionen so verändert, dass der eingefügt Text nicht durch automatische Einrückung verunstaltet wird. Einfach das nächste mal testen, wenn ihr Text vom Browser in vim einfügt.
1 Kommentar:
gg=G rockt!
Ich findes es einfach immer wieder faszinierend, dass man bekannte Befehle mit neuen kombinieren kann. So erkennt man in einem komplizierten Kommando wie V2j3> plötzlich jedes einzelne Zeichen und es erscheint gar nicht mehr so komplex wie am Anfang.
Wegen der Länge: Ein Thema ganz erschlagen kann man denke ich garnicht. Das Problem habe ich auch jedes Mal. Da hilft nur entweder nur einen Hinweis auf mehr setzen oder weglassen und in einem späteren Beitrag vertiefen. Zu viel ist immer schlecht fürs Lernen, und darum gehts ja.
Kommentar veröffentlichen