Zum Inhalt

Auto-Paarung & intelligente Einrückung

Während Sie tippen, schließt der Editor Klammern und Anführungszeichen für Sie, behält Ihre Einrückung auf neuen Zeilen bei, öffnet Blöcke zwischen geschweiften Klammern und wendet eine konsistente Einrückungseinheit (Tabs oder Leerzeichen) gleichermaßen auf die Tab-Taste, das Ausrücken mit Backspace und die automatische Einrückung an. Alles hier ist eine eingebaute Funktion des Editors; die zugehörigen Menübefehle und die Einstellung des Einrückungsstils stammen aus dem mitgelieferten Einrückungs-Plugin.

Sie soll unsichtbar sein — sie reagiert nur auf das gerade getippte Zeichen und hält sich überall zurück, wo sie stören würde (in Kommentaren und Zeichenketten, vor vorhandenen Wörtern, beim falschen Partnerzeichen).

Auto-Paarung von Klammern und Anführungszeichen

Das Tippen einer öffnenden Klammer oder eines Anführungszeichens fügt den Partner ein und lässt den Cursor zwischen beiden stehen:

Sie tippen Sie erhalten Cursor
( () dazwischen
[ [] dazwischen
{ {} dazwischen
" "" dazwischen
' '' dazwischen

Ein paar Regeln verhindern, dass das lästig wird:

  • Überschreiben (type-over). Das Tippen eines schließenden Zeichens, wenn dasselbe Zeichen bereits rechts vom Cursor steht, springt darüber hinweg, statt ein zweites einzufügen — wer also durch () oder "" hindurchtippt, erhält ein einziges, ausgeglichenes Paar.
  • Keine Paarung vor einem Wort. Ein Öffner wird nur vervollständigt, wenn das nächste Zeichen ein Leerraum, ein Schließer oder das Zeilenende ist — ein ( direkt vor vorhandenem Text schleust also kein verirrtes ) mitten hinein.
  • Apostroph-bewusste Anführungszeichen. Ein ' direkt nach einem Buchstaben (wie in don't) wird als Apostroph behandelt und nicht gepaart. Anführungszeichen paaren sich nur in neutralem Kontext (Token-Anfang, nach Leerraum oder einem Operator).
  • Spitze Klammern nur in Markup. < … > paaren sich nur in HTML-/XML-Dokumenten, wo < ein Tag öffnet. Überall sonst ist < ein Vergleichs- oder Shift-Operator und bleibt unangetastet.

Eine Auswahl umschließen (type-to-wrap)

Ist Text ausgewählt, ersetzt ein getippter Öffner die Auswahl nicht — er umschließt sie:

select value  then type (        →   (value)
  • Funktioniert mit ( [ { " ' (nicht mit < — außerhalb von Markup ist es ein Operator).
  • Der innere Text bleibt danach ausgewählt, sodass sich Umschließungen verketten lassen: Tippen Sie ( und dann " und Sie erhalten ("value").
  • Mit mehreren Cursorn wird jede Auswahl unabhängig umschlossen — und die gesamte Operation ist ein Rückgängig-Schritt.

Ein Paar löschen

Ein Backspace mit dem Cursor zwischen einem leeren automatisch eingefügten Paar ((|), [|], {|}, "|", '|' oder <|> in Markup) löscht beide Zeichen in einem Schritt — eine Auto-Paarung lässt sich also mit einem einzigen Tastendruck zurücknehmen. Sobald zwischen dem Paar Inhalt steht, verhält sich Backspace normal.

Intelligente Einrückung bei Enter

Ein Druck auf Enter übernimmt den führenden Leerraum der aktuellen Zeile auf die neue Zeile — Sie bleiben auf derselben Tiefe, ohne Tabs oder Leerzeichen erneut zu tippen:

  • Einrückung beibehalten. Die neue Zeile beginnt mit derselben Einrückung wie die verlassene Zeile.
  • Eine Ebene öffnen. Endet die verlassene Zeile mit einem Öffner ({, [, (), wird die neue Zeile eine zusätzliche Ebene eingerückt.
  • Einen Block öffnen. Steht der Cursor zwischen einem Öffner und seinem passenden Schließer, klappt der Block auf: Die neue Zeile wird eine Ebene tiefer eingerückt, und der Schließer rutscht auf eine eigene Zeile in der Tiefe des Öffners.
if (cond) {|}        Enter        if (cond) {
                     ───────►          |
                                   }

Einrückungsstil — Tabs, Leerzeichen oder Auto

Eine einzige Einrückungseinheit steuert die Tab-Taste, das Ausrücken mit Backspace und die automatische Einrückung oben, sodass sie immer übereinstimmen. Wählen Sie sie unter Einstellungen ▸ Erweiterungen ▸ Einrückung:

Stil Verhalten
Tabulatoren (Standard für neue Dateien) Eine Ebene ist ein echtes Tabulatorzeichen; Leerzeichen pro Einrückung legt seine sichtbare Breite fest.
Leerzeichen Eine Ebene besteht aus Leerzeichen pro Einrückung Leerzeichen.
Automatisch (aus Dokument erkennen) Der Editor untersucht die vorhandene Einrückung des Dokuments und folgt ihr — eine mit Tabs eingerückte Datei bleibt bei Tabs, eine 2-Leerzeichen-Datei bei zwei Leerzeichen. Eine Datei ohne Einrückung fällt auf den Standard (Tabs) zurück.

Neue, unbenannte Dateien verwenden standardmäßig Tabulatoren mit Breite 4.

Einrückung von Hand anpassen

Das Einrückungs-Plugin fügt zwei Befehle hinzu (auch unter Bearbeiten ▸ Einzug), die jede von der Auswahl berührte Zeile ein- oder ausrücken — bzw. die Zeile des Cursors, wenn nichts ausgewählt ist:

Befehl Tastenkürzel
Einzug vergrößern Ctrl+]
Einzug verkleinern Ctrl+[

Einen Codeblock einfügen

Kopieren Sie ein paar Zeilen, die ihre eigene Einrückung tragen — etwa drei Zeilen, die jeweils mit zwölf Leerzeichen beginnen — und fügen Sie sie an einem eingerückten Cursor ein. Wörtlich eingefügt landete die erste Zeile bei Ihrer Einrückung plus den zwölf Leerzeichen des Blocks (weit rechts) und jede folgende Zeile in Spalte 0 plus zwölf — das Ganze müssten Sie von Hand nachziehen.

OctoEdit rückt den Block stattdessen für Sie ein: die Einrückung, die sich die Zeilen des Blocks teilen, wird entfernt, die erste Zeile landet dort, wo der Cursor ohnehin steht, und jede folgende Zeile bekommt die Einrückung der Cursorzeile plus die Einrückung, die sie innerhalb des Blocks hatte. Die innere Struktur des Blocks bleibt exakt erhalten; Tabs bleiben Tabs und Leerzeichen bleiben Leerzeichen.

Ersetzt wird nur die führende Einrückung: der Block behält seine eigenen Einrückungszeichen, ein mit Leerzeichen eingerückter Block bleibt in einem mit Tabs eingerückten Dokument innen also leerzeichen-eingerückt. Die innere Einrückung des Blocks in den Stil des Dokuments umzuwandeln ist eine mögliche künftige Option — der Editor tut das heute nicht.

Das gilt nur für ein Einfügen, das eindeutig ein Block ist:

  • die Zwischenablage enthält mehr als eine Zeile;
  • es gibt einen Cursor und keine rechteckige (Spalten-)Auswahl;
  • zwischen Zeilenanfang und Cursor steht nichts als Leerraum — ein Einfügen mitten in eine Zeile ist eine Einschiebung und bleibt wörtlich.

Alles andere wird eingefügt wie bisher. Das gesamte Einfügen ist ein einziger Rückgängig-Schritt, und eine Auswahl wird wie gewohnt ersetzt.

Abschalten lässt es sich mit Eingefügte Zeilen an die Einrückung des Cursors anpassen unter Einstellungen ▸ Erweiterungen ▸ Einrückung (standardmäßig an).

Als Markdown einfügen (Ctrl+Shift+V) durchläuft dieselbe Regel. Der umgewandelte Text ist ein Block, der in Spalte 0 beginnt und dessen verschachtelte Listeneinträge relativ dazu eingerückt sind; an einem eingerückten Cursor erhält daher jede Zeile die Einrückung des Cursors, und die Verschachtelung bleibt exakt erhalten. Was der Befehl tut, beschreibt Bearbeiten.

Sprachspezifische Standards

Manche Sprachen haben eine nahezu universelle Einrückungskonvention, und der Editor liefert sie als Standard dieser Sprache mit — eine frisch geöffnete Datei dieses Typs rückt ohne jede Konfiguration korrekt ein:

Sprache Standard
Python 4 Leerzeichen (PEP 8)
Rust 4 Leerzeichen (rustfmt)
Markdown 4 Leerzeichen (verschachtelte Listen)
YAML 2 Leerzeichen (Tabs sind nicht erlaubt)
JSON 2 Leerzeichen
Go Tabs (gofmt)
C / C++ Tabs

Alle anderen Sprachen tragen bewusst keinen Standard und folgen Ihrer globalen Einrückungseinstellung. Wird die Sprache eines Dokuments von Hand gewechselt (Menü Sprache), wird der passende Standard sofort erneut angewendet.

Der Standard steht in der Definitionsdatei der Sprache (colorizers/<id>.json, Schlüssel "indent": { "style": "tabs|spaces", "width": N }). Power-User können einen mitgelieferten Standard ändern, indem sie eine bearbeitete Kopie dieser Datei in das Benutzer-Override-Verzeichnis legen — der Katalog ersetzt Definitionen anhand ihrer id.

Geplant: sprachspezifische Overrides in den Einstellungen

Eine Einstellungstabelle zum Übersteuern dieser Standards pro Sprache (ohne JSON anzufassen) ist entworfen und als nächster Schritt dieser Funktion geplant; bis dahin sind der JSON-Override oben und die nachfolgenden Ebenen die Wege, die Einrückung zu steuern.

Woher die Einrückungseinheit kommt (Vorrang)

Wenn mehrere Quellen eine Meinung zur Einrückung haben, löst der Editor sie an einer Stelle auf und wendet den Gewinner an — höchster Vorrang zuerst:

  1. Die .editorconfig des Projekts — falls vorhanden und „.editorconfig-Einstellungen anwenden“ aktiv ist, gewinnen indent_style / indent_size / tab_width des Projekts für passende Dateien.
  2. Der mitgelieferte Standard der Sprache — die Tabelle oben, wenn die Sprache des Dokuments einen deklariert.
  3. Ihre globale Einrückungseinstellung — die Wahl Tabs / Leerzeichen / Auto oben.

Ein Projekt mit .editorconfig übersteuert also alles für die Dateien dieses Projekts; eine Python-Datei außerhalb eines solchen Projekts rückt mit PEP-8-Leerzeichen ein, selbst wenn Ihre globale Einstellung Tabs ist; und alles andere folgt Ihrer globalen Einstellung. Die Einrückung eines Dokuments können Sie danach jederzeit von Hand ändern.

Der Vorrang gilt in dem Moment, in dem sich etwas ändert: Wird in den Einstellungen eine andere Wahl Tabs / Leerzeichen / Auto angewendet, wird das geöffnete Dokument sofort neu aufgelöst — eine von einer .editorconfig oder einem Sprachstandard bestimmte Datei behält ihre Einrückung, ohne dass Sie den Tab wechseln müssen.

Mehrere Cursor

Alles Obige gilt an jedem Cursor, wenn Sie mit mehreren Cursorn arbeiten: Ein getipptes ( fügt an jedem () ein, Enter behält die Einrückung jeder Zeile bei, und Backspace zwischen leeren Paaren löscht an jedem Cursor beide Zeichen. Ein einziges Rückgängig nimmt die gesamte Mehrcursor-Bearbeitung in einem Schritt zurück.

Backspace bei gemischten Cursorn

Backspace löscht Paare nur, wenn jeder Cursor zwischen einem leeren Paar steht. Stehen einige Cursor woanders, fällt Backspace an allen auf sein normales Verhalten zurück — es löscht also nie an einem Cursor einen verirrten Schließer, während an einem anderen ein Wort bearbeitet wird.

In Kommentaren und Zeichenketten

Ist ein Syntax-Colorizer aktiv, halten sich Auto-Paarung und das klammergesteuerte Blocköffnen in Kommentaren und Zeichenketten-/Zeichenliteralen zurück — dort ist ein { oder " gewöhnlicher Text, kein Code, also lässt der Editor ihn exakt so stehen, wie er getippt wurde. Die einfache Einrückung (Übernahme des Leerraums der Vorzeile) funktioniert weiterhin. In einem reinen Textdokument ohne Colorizer gibt es nichts zu unterdrücken, daher verhält sich die Paarung überall gleich.

Verwandte Themen