Bitte Beachten: Dieser Blog wird hier nicht weiter geführt! Kommentare und neue Blogposts gibt es unter http://feitel.indeedgeek.de. Dort bitte auch neue Kommentare zu diesen Beiträge erstellen.

Samstag, 26. September 2009

vim-Mastery: Eingerückt

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:

Aaron hat gesagt…

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.