Wer aus einer IDE wie VS Code, Sublime oder JetBrains zu Vim kommt, hat ein klares Bild im Kopf, was ein Tab ist: eine geöffnete Datei, die als Reiter über dem Editor sichtbar bleibt. Vim-Tabs sind etwas völlig anderes — und genau aus diesem Missverständnis entsteht die häufigste Anfänger-Frustration mit dem Vim-Layout-Modell. Ein Vim-Tab ist kein Datei-Reiter, sondern ein Workspace-Container: er enthält ein oder mehrere Fenster, die wiederum Buffer anzeigen. Ein Tab pro Datei zu öffnen wäre, als würde man in einer IDE pro Datei einen neuen Workspace erzeugen — funktioniert, ist aber das falsche Werkzeug. Dieser Artikel klärt das Modell, zeigt die Tab-Befehle und beschreibt, wann Tabs tatsächlich der richtige Hebel sind.
Das Missverständnis
In den meisten grafischen Editoren ist die Beziehung „eine Datei = ein Tab". Beim Öffnen einer neuen Datei kommt ein neuer Reiter hinzu, der die Datei repräsentiert; beim Schließen verschwindet er. Aus dieser Erfahrung heraus erwartet man von Vim dasselbe — und ist dann verwirrt, dass :e neue-datei.txt keinen neuen Tab erzeugt, sondern den aktuellen Buffer durch die neue Datei ersetzt.
Vim macht die Trennung anders:
| Vim-Konzept | Entspricht in einer IDE |
|---|---|
| Buffer | „geöffnete Datei" (ohne sichtbares UI-Element) |
| Window | „Editor-Pane" (eine sichtbare Anzeigefläche) |
| Tab | „Workspace" oder „Projekt-View" |
Ein einzelner Vim-Tab kann fünf Buffer in drei Fenstern enthalten — ein typisches Refactoring-Layout. Ein anderer Tab kann zwei Buffer in einem Split-Layout zeigen, der für eine separate Aufgabe gedacht ist. Beide Tabs sind voneinander unabhängige Layouts, aber sie teilen sich die Buffer-Liste — ein Buffer, der in Tab 1 angezeigt wird, kann gleichzeitig in Tab 2 sichtbar sein.
Tab 1: "Feature-Implementation"
- Fenster 1: src/feature.go
- Fenster 2 (vertikaler Split): tests/feature_test.go
- Fenster 3 (horizontaler Split unten): docs/feature.md
Tab 2: "Database-Migration"
- Fenster 1: migrations/001_initial.sql
- Fenster 2: schema.sql
Tab 3: "Debugging"
- Fenster 1: logs/error.log
- Fenster 2: src/handler.goDrei separate Workspaces, jeder mit eigenem Layout, jeder unabhängig wechselbar — aber alle in derselben Vim-Instanz, alle teilen Buffer-Liste, Marks, Registers, Undo-Historie.
Tabs erzeugen
Drei Wege, einen neuen Tab anzulegen:
| Befehl | Aktion |
|---|---|
:tabnew | leerer neuer Tab ([No Name]-Buffer) |
:tabnew foo.txt | neuer Tab mit foo.txt geöffnet |
:tabedit foo.txt | Synonym für :tabnew foo.txt |
<C-w>T | aktuelles Fenster aus dem aktuellen Tab in einen neuen Tab verschieben |
<C-w>T (großes T) ist die häufig vergessene Variante: wenn ein Split im aktuellen Tab zu eigenständig wird, schiebt er ihn in einen neuen Tab — das vorherige Layout bleibt erhalten, das verschobene Fenster bekommt seinen eigenen Workspace.
" Annahme: dreigeteiltes Layout im aktuellen Tab
" Cursor im Split mit der Log-Datei, der jetzt eigenen Tab braucht.
<C-w>T " Log-Split wird neuer TabZwischen Tabs navigieren
Die zentralen Tab-Navigations-Befehle:
| Taste / Befehl | Aktion |
|---|---|
gt | nächster Tab (cycle vorwärts) |
gT | vorheriger Tab (cycle rückwärts) |
Ngt | zum N-ten Tab (z. B. 2gt = zweiter Tab) |
:tabnext / :tabn | nächster Tab (Ex-Variante) |
:tabprev / :tabp | vorheriger Tab |
:tabfirst | erster Tab |
:tablast | letzter Tab |
:tabnext 3 | zum Tab Nr. 3 |
gt und gT sind die Default-Tastenkombinationen — g als Präfix, t/T für tab/Tab-zurück. Sie sind im Alltag schnell zu drücken und brauchen kein Mapping.
Mit Count: 2gt springt zum zweiten Tab (1-basiert). Das ist eine der wenigen Vim-Befehle, bei denen ein Count nicht „Aktion N-mal" bedeutet, sondern „springe zu Position N" — ähnlich wie 5G für Zeile 5.
gt " nächster Tab
gT " vorheriger Tab
2gt " direkt zum zweiten Tab
:tabnext " nächster (gleich wie gt)
:tabfirst " erster Tab
:tablast " letzter TabTabs verschieben
Die Reihenfolge der Tabs lässt sich nachträglich ändern:
| Befehl | Aktion |
|---|---|
:tabmove | aktuellen Tab ans Ende verschieben |
:tabmove 0 | aktuellen Tab an den Anfang |
:tabmove 3 | aktuellen Tab nach Position 3 (0-basiert) |
:tabmove +1 | um eine Position nach rechts verschieben |
:tabmove -1 | um eine Position nach links |
:tabmove +1 und :tabmove -1 sind im Alltag die häufigsten — sie funktionieren wie „Tab nach links/rechts schieben" in einer IDE. Da es kein eingebautes Tasten-Mapping dafür gibt, lohnt sich eine Konfiguration:
" Tab nach links/rechts verschieben
nnoremap <silent> <leader>th :tabmove -1<CR>
nnoremap <silent> <leader>tl :tabmove +1<CR>Tabs schließen
Drei Befehle zum Schließen — analog zu den Fenster-Befehlen, nur eine Ebene höher:
| Befehl | Aktion |
|---|---|
:tabclose / :tabc | aktuellen Tab schließen |
:tabclose N | Tab Nr. N schließen |
:tabonly / :tabo | alle anderen Tabs schließen, nur aktueller bleibt |
:tabclose schließt den aktuellen Tab, aber lässt die Buffer im Speicher. Wer in Tab 2 fünf Buffer offen hatte und den Tab schließt, hat die fünf Buffer weiterhin in der Buffer-Liste — sie sind nur nicht mehr in einem Fenster sichtbar. Mit :b N lassen sie sich zurückholen.
Das ist konsistent mit Vims Trennung Buffer/Window/Tab: Tabs sind Layout-Container, nicht Buffer-Container. Ihre Auflösung beendet die Anzeige, nicht den Inhalt.
Tab-Inspektion und Befehle über Tabs
Vier nützliche Werkzeuge:
:tabs " Liste aller Tabs mit ihren Fenstern und Buffern
:tabnew | call :tabmove(2) " in Vimscript: Tab erzeugen und positionieren
:tabdo set number " "set number" in jedem Tab ausführen
:tabdo bd " Buffer in jedem Tab schließen (Vorsicht):tabs zeigt eine kompakte Übersicht:
Tab page 1
# src/main.go (im linken Fenster)
src/util.go (im rechten Split)
> + src/handler.go (aktuelles Fenster, modifiziert)
Tab page 2
# migrations/001.sql
Tab page 3
# logs/error.log
src/handler.go (in mehreren Tabs sichtbar)
Das > markiert den aktuellen Tab, + zeigt modifizierte Buffer, # den Alternate-Buffer-Status. Praktisch zur schnellen Orientierung in einem Setup mit vielen Tabs.
:tabdo ist die Iteration-Variante über alle Tabs — analog zu :bufdo und :windo. Es führt einen Ex-Befehl im aktuellen Fenster jedes Tabs aus.
Tab-Labels anpassen
Default zeigt Vim den aktuellen Dateinamen des aktiven Fensters als Tab-Label — oft nicht aussagekräftig genug, wenn ein Tab fünf Buffer enthält und der Datei-Name nicht das Workspace-Thema beschreibt.
Vim erlaubt eigene Tab-Labels über die Option tabline und einen optionalen Bezeichner pro Tab:
:let t:tab_name = "Refactoring"
" jetzt kann eine custom tabline diese Variable in der Beschriftung
" verwenden.Vim hat per Tab eigene tab-lokale Variablen (t:variable), die für genau diesen Zweck gedacht sind. In Verbindung mit einer eigenen tabline-Funktion (oder einem Plugin wie vim-airline, das das automatisch macht) kann jeder Tab einen sprechenden Namen tragen.
Plugins, die Tab-Labels visuell verbessern:
- vim-airline mit
let g:airline#extensions#tabline#enabled = 1— IDE-ähnliche Tab-Leiste. - lightline mit eigenem Tab-Component.
- taboo.vim — fokussiert auf benannte Tabs.
Für den Anfang reicht der Default; sobald man regelmäßig mit drei oder mehr Tabs arbeitet, lohnt sich eines dieser Plugins. Mehr im Artikel Tabline anpassen.
Wann Tabs tatsächlich sinnvoll sind
Da Tabs in Vim kein Datei-Reiter-Ersatz sind, lohnen sie sich nur in bestimmten Situationen. Die wichtigsten:
Parallele, unabhängige Aufgaben in einer Vim-Session
Wer an einem Feature arbeitet, parallel aber einen Bug fixen muss, hat zwei voneinander unabhängige Workspaces. Ein Tab für jede Aufgabe — beide bleiben verfügbar, ohne sich gegenseitig im Layout zu stören.
Verschiedene Projekt-Bereiche mit eigenem Layout
Frontend, Backend und Doku eines Projekts erfordern oft sehr unterschiedliche Layouts. Frontend: zwei vertikale Splits (TSX und CSS). Backend: drei horizontale Splits (Code, Test, Log). Doku: ein einzelnes breites Fenster für Markdown. Pro Bereich ein Tab — und kein ständiges Umarbeiten des Layouts beim Kontextwechsel.
Diff-Ansichten ohne Layout-Verlust
:vert diffsplit other-file.txt zeigt zwei Dateien im Vergleich. In einem neuen Tab gestartet bleibt das eigentliche Arbeits-Layout unangetastet, der Diff ist eigenständig: :tabnew | vert diffsplit other.txt.
Long-running Outputs
Eine Log-Datei oder ein langes :terminal-Fenster (Vim 8+) eignet sich gut als eigener Tab: man wechselt ab und zu rein zum Schauen, der eigentliche Edit-Workspace bleibt unverändert.
Wann Tabs nicht sinnvoll sind
- Eine Datei pro Tab: Nutze Buffer und
<C-^>(siehe Buffer wechseln). - Mehrere Dateien parallel sichtbar: Nutze Splits (siehe Fenster und Splits).
- Maximale visuelle Übersicht aller Dateien: Nutze eine vim-airline-Bufferline statt Tabs.
Häufige Stolperfallen
`:e neue-datei.txt` öffnet KEINEN neuen Tab
Wer aus IDE-Welt kommt, erwartet bei :e neue-datei.txt einen neuen Reiter. Tatsächlich ersetzt Vim den aktuellen Buffer im aktuellen Fenster. Der alte Buffer bleibt im Speicher (siehe Buffer-Konzept), aber Tab-Anzahl ändert sich nicht. Für einen Tab: :tabnew neue-datei.txt.
Tabs sind Workspace-Container, keine File-Reiter
Das ist die zentrale Verschiebung im Mental Model. Ein Vim-Tab kann beliebig viele Fenster und Buffer enthalten. Wer pro Datei einen Tab anlegt, nutzt Tabs falsch und wird sich später mit unübersichtlich vielen Workspaces wiederfinden.
Buffer leben über Tab-Grenzen hinweg
Wer in Tab 1 main.go öffnet und in Tab 2 erneut :b main.go aufruft, zeigt denselben Buffer in beiden Tabs. Änderungen synchronisieren sich automatisch — es ist eine Anzeige in zwei Layouts, kein Duplikat.
`gt` ist nicht `Ngt` mit Count 1
gt zykelt zum nächsten Tab. 1gt springt zum ersten Tab. Subtiler, aber wichtiger Unterschied — Counts vor gt ändern die Semantik von „nächster" zu „zum N-ten".
`:tabclose` schließt den Tab, NICHT die Buffer
Die Buffer aus einem geschlossenen Tab bleiben in der Buffer-Liste. Mit :b N oder :ls sind sie weiterhin erreichbar. Wer wirklich Buffer aufräumen will, nutzt :bd N oder das :%bd | e#-Idiom.
`tabline` braucht keine Plugin — aber Plugins helfen
Die Default-Tabline zeigt nur Datei-Namen — knapp, oft genug. Wer mehr will (Modus-Anzeige, Buffer-Liste, Git-Status), nutzt eine Statusline-Plugin-Erweiterung. vim-airline's tabline-Extension ist die häufigste Wahl.
Weiterführende Ressourcen
Externe Quellen
- Vim Help: tab-page — vollständige Tab-Referenz.
- Vim Help: tab-page-commands — alle Tab-Befehle.
- Vim Help: setting-tabline — eigene Tab-Labels.
- Drew Neil — Practical Vim, Tip 39 — „Group Windows into a Tab Page", die klassische Erklärung des Workspace-Konzepts.