Wer mehrere Dateien parallel bearbeitet, braucht einen schnellen Weg zwischen ihnen — und Vim bietet hier mehr Optionen als jede grafische IDE, allerdings ohne den visuellen Tab-Streifen, der dort die Navigation erleichtert. In Vim sind die zentralen Buffer-Wechsel-Befehle textbasiert: :b name mit Tab-Completion zum direkten Sprung, :bnext/:bprev zum sequentiellen Durchlaufen, Ctrl-^ als heimliches Hauptwerkzeug für den ständigen Wechsel zwischen zwei Dateien und :sb für Buffer-Öffnung in einem neuen Split. Dieser Artikel deckt die fünf wichtigsten Wege ab, zeigt typische Workflow-Muster und führt am Ende die Plugin-basierten Picker als bequeme Erweiterung ein.

Die Basis: :b mit Name oder Nummer

Der primäre Befehl zum Buffer-Wechsel ist :b (kurz für :buffer):

text Buffer-Wechsel-Befehle
:b 3                 " zu Buffer Nr. 3 wechseln
:b main              " zu Buffer wechseln, dessen Name "main" enthält
:b main.go           " genauer: Buffer mit "main.go" im Namen
:b#                  " zum Alternate-Buffer (gleich wie <C-^>)

Der Name-Match ist eine Substring-Suche:b main findet main.go, main.rs und application/main/index.js. Gibt es mehrere Treffer, fragt Vim nach: „More than one match for ...". In diesem Fall hilft entweder eine längere Eingabe oder die Tab-Completion.

Tab-Completion macht :b zum bequemsten Wechsel-Befehl überhaupt: tippe :b plus die ersten paar Buchstaben, dann Tab, und Vim zeigt alle passenden Buffer:

text Tab-Completion in Aktion
:b ma<Tab>           " zeigt alle Buffer mit "ma" im Namen
                     " → :b main.go → :b manager.py → ...
:b m<Tab>            " allgemeiner
:b src/<Tab>         " Pfad-Anteile sind auch matchbar

Mit :set wildmenu (in modernen Konfigs Default) wird die Auswahl als horizontale Leiste über der Command-Line angezeigt — dann lässt sich mit Tab/Shift-Tab durch die Treffer zykeln. Das ist im Alltag erheblich schneller als eine Maus-basierte Tab-Auswahl in einer IDE.

Sequenzielle Navigation mit :bnext und :bprev

Wenn man durch alle offenen Buffer zykeln möchte, ohne einen bestimmten anzusteuern:

BefehlAktion
:bnext (kurz :bn)nächster Buffer in der Liste
:bprev (kurz :bp)vorheriger Buffer
:bfirst (kurz :bf)erster Buffer
:blast (kurz :bl)letzter Buffer

In der Reihenfolge bewegt sich Vim entsprechend der internen Buffer-Liste — der Reihenfolge, in der die Buffer angelegt wurden, nicht alphabetisch oder zuletzt-genutzt. Mit :ls siehst du die Reihenfolge.

Die meisten Konfigs binden diese Befehle auf bequeme Tasten, etwa:

vim ~/.vimrc — Buffer-Navigation-Mappings
" Bequeme Buffer-Navigation
nnoremap <silent> <leader>n :bnext<CR>
nnoremap <silent> <leader>p :bprevious<CR>

" Mit Tab/Shift-Tab im Normal-Mode
nnoremap <silent> <Tab>   :bnext<CR>
nnoremap <silent> <S-Tab> :bprevious<CR>

Achtung beim Tab-Mapping: in manchen Setups kollidiert <Tab> im Normal-Mode mit <C-i> (Jumplist vorwärts). Beide Tasten senden im Terminal dieselbe Sequenz, sodass das eine das andere überschreibt. Wer beides nutzen will, sollte eine Alternative für die Buffer-Navigation wählen.

<C-^> — der Star im Alltag

Eine der nützlichsten unauffälligen Vim-Tasten ist Ctrl-^: sie wechselt zum Alternate-Buffer. Das ist der Buffer, der zuletzt in diesem Window aktiv war — meistens also genau der, den man als letztes verlassen hat.

Der typische Anwendungsfall: man arbeitet an einer Code-Datei, springt kurz in einen Test, dann zurück. Mit <C-^> ist das jeweils ein einziger Tastendruck — kein :b mit Namen, keine Tab-Completion, keine zwei Schritte. Drücken, fertig.

text Ctrl-^ im Alltag
:e src/main.go       " Buffer 1
:e test/main_test.go " Buffer 2 — jetzt aktiv
<C-^>                " zurück zu main.go
<C-^>                " wieder zu main_test.go
<C-^>                " wieder zu main.go

In :ls ist der Alternate-Buffer mit # markiert:

1  #h   "src/main.go"          line 42
2  %a   "test/main_test.go"    line 18

Auf einigen Tastatur-Layouts ist <C-^> schwer erreichbar (auf der deutschen Tastatur ist ^ AltGr+ß+Hand-Verrenkung). Synonyme:

  • Ctrl-6 — funktioniert auf vielen Layouts gleichwertig (das ^ liegt auf der 6-Taste in US).
  • :b# als Ex-Befehl-Variante — funktioniert immer, kostet aber drei Tasten.

Wer das viel nutzt, mappt sich gerne eine eigene Variante:

vim ~/.vimrc — bequemer Alternate
" <leader><leader> als Alternate-Buffer-Switch
nnoremap <silent> <leader><leader> :b#<CR>

" Oder mit Backspace im Normal-Mode (Default: bewegt Cursor)
nnoremap <BS> <C-^>

Buffer in einem neuen Split öffnen — :sb

Wer einen Buffer nicht im aktuellen Window anzeigen will, sondern in einem neuen Split:

BefehlAktion
:sb nameBuffer in einem horizontalen Split öffnen
:vert sb nameBuffer in einem vertikalen Split öffnen
:sb # oder :sb#Alternate-Buffer in horizontalem Split

:sb (split + buffer) ist die Lese-Variante: man hat einen Buffer als Referenz, will aber den aktuellen Buffer weiterhin sichtbar lassen. Sehr typisch im Code-Workflow: links die Implementierung, rechts die zugehörigen Tests oder Typ-Definitionen.

text :sb in Aktion
" Aktuell: main.go ist im Fenster, util.go ist als hidden buffer geladen
:vert sb util        " jetzt zwei Fenster: links main.go, rechts util.go

Eine Vim-Option steuert das Default-Verhalten von :sb: set switchbuf+=useopen lässt Vim kein neues Window öffnen, falls der Ziel-Buffer schon irgendwo sichtbar ist — stattdessen springt der Fokus dorthin. Im Alltag spart das oft eine Window-Reorganisation.

vim ~/.vimrc — useopen
" Wenn :sb auf einen Buffer wechselt, der schon in einem
" anderen Fenster offen ist — Fokus dorthin springen
" statt neues Fenster aufzumachen.
set switchbuf+=useopen

:bufdo — Befehle auf alle Buffer

Wenn man eine Operation auf jeden offenen Buffer anwenden möchte:

text :bufdo-Beispiele
:bufdo %s/old/new/ge   " in jedem Buffer eine Ersetzung,
                       " e = no error wenn pattern nicht gefunden

:bufdo update          " jeden Buffer speichern (wenn modifiziert)

:bufdo set number      " Zeilennummern in allen Buffern aktivieren

:bufdo bd              " ALLE Buffer schließen (inkl. dem aktuellen)
                       " (Vorsicht — möglicherweise ungewollt)

:bufdo führt seine Argumente als Ex-Befehl auf jedem Buffer der Buffer-Liste aus, in der Reihenfolge. Vim wechselt dabei jeweils kurz in den Buffer (das wird sichtbar, wenn der Bildschirm flackert), führt den Befehl aus und geht weiter.

Eine wichtige Konsequenz: nach :bufdo ist Vim im letzten Buffer der Liste, nicht im ursprünglich aktiven. Wer zurück will, drückt <C-^> oder navigiert manuell.

Eine ähnliche Variante für Windows: :windo (Befehl auf jedes Window des aktuellen Tabs), für Tabs: :tabdo (auf jeden Tab). Drei Befehle, drei Iteration-Ebenen — eine kleine Demonstration von Vims orthogonaler Struktur.

Workflow-Muster

Drei typische Buffer-Workflows aus der Praxis:

Workflow 1: zwei Dateien parallel

Du arbeitest an einer Funktion und ihren Tests. Beide sind als Buffer geöffnet, du wechselst ständig hin und her.

text Workflow 1
:e src/foo.go        " Buffer 1
:e src/foo_test.go   " Buffer 2 (aktiv)

" Im Alltag dann nur noch:
<C-^>                " hin
<C-^>                " und zurück

Workflow 2: drei bis fünf Dateien gleichzeitig

Für mehr als zwei Dateien lohnt sich das Wort-Stamm-Tippen: in :b so wenige Buchstaben wie nötig eingeben, um den richtigen Buffer zu treffen.

text Workflow 2
" Offen: main.go, util.go, handler.go, config.go, db.go
:b ma<CR>            " main.go (eindeutig durch "ma")
:b ut<CR>             " util.go
:b ha<CR>             " handler.go
:b co<CR>             " config.go
:b db<CR>             " db.go

Drei Tasten plus Enter — fast immer ausreichend, wenn die Dateinamen verschieden genug sind. Bei Mehrdeutigkeit hilft Tab-Completion.

Workflow 3: viele Dateien, Fuzzy-Picker

Sobald 10+ Buffer offen sind, lohnt sich ein Plugin-basierter Fuzzy-Picker. Klassiker:

  • fzf.vim mit :Buffers — interaktive Fuzzy-Suche durch die Liste, Live-Preview, Auswahl mit Enter.
  • clap.vim, vim-startify — Alternativen mit ähnlichem UX.
vim ~/.vimrc — fzf.vim für Buffer-Switch
" Voraussetzung: fzf + fzf.vim installiert
nnoremap <silent> <leader>b :Buffers<CR>

Mehr dazu im Kapitel Plugin-Management.

Statusline und Tabline für visuelle Buffer-Übersicht

Ohne Statusline-Plugin sieht man im Default-Vim den aktuellen Buffer-Namen nur unten in der Statusline und in :ls. Wer eine dauerhafte visuelle Übersicht möchte (analog zur Tab-Leiste in IDEs), aktiviert eine Tabline, die alle Buffer zeigt:

vim ~/.vimrc — eingebaute Tabline mit Buffer-Liste
" Tabline immer anzeigen, auch bei nur einem Tab
set showtabline=2

" Diese Konfiguration ohne Plugin ist umständlich — die meisten User
" setzen stattdessen vim-airline oder lightline (siehe Kap 16).

Plugins wie vim-airline haben eine eigene Buffer-Line-Erweiterung, die die offenen Buffer als horizontale Leiste oben darstellt — visuell sehr ähnlich zu IDE-Tabs:

vim ~/.vimrc — vim-airline Tabline
" vim-airline-Konfiguration (Plugin muss installiert sein)
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#buffer_nr_show = 1

Damit hat man dauerhaft eine Buffer-Übersicht auf dem Bildschirm und kann via Buffer-Nummer oder Click navigieren. Details im Artikel vim-airline.

FAQ

Warum reagiert `:bn` nicht — der Buffer ist nicht in der Liste

:bn und :bp springen nur durch listed buffers. Mit :ls! siehst du auch unlisted Buffer (Help, Quickfix, Terminal). Wer zwischen allen wechseln will, nutzt :bnext! (mit Bang) — das schließt auch unlisted Buffer ein.

`:b name` und Tab-Completion gehen über Substring, nicht nur Präfix

:b main findet auch path/to/main.go und application/main.rs. Wer nur Präfix-Matching will, muss längere Strings tippen oder einen Fuzzy-Picker nutzen. Im Alltag ist die Substring-Suche meist sinnvoller — sie findet die Datei egal wo im Pfad sie liegt.

`` und `:b#` sind identisch

Beide springen zum Alternate-Buffer. <C-^> ist im Normal-Mode direkt, :b# ist die Ex-Variante. Wer Tasten-Reflexe baut, nutzt <C-^>; wer in Skripten oder Mappings den Befehl braucht, nutzt :b#.

`:bd` ohne Ziel schließt den aktuellen Buffer

:bd allein schließt den aktuellen Buffer. :bd 3 schließt Buffer Nr. 3. :bd main (mit Substring-Match) schließt den ersten Buffer, dessen Name main enthält. Eindeutig sein wenn nötig, sonst trifft :bd ma möglicherweise nicht den richtigen.

`:bufdo` lässt Vim im letzten Buffer stehen

Nach :bufdo update ist Vim nicht im ursprünglich aktiven Buffer, sondern im letzten der Liste. Wer zurück will, nutzt <C-^> (falls der ursprüngliche der vorletzte Aktive war) oder springt manuell mit :b N.

Buffer-Liste vs. Argument-Liste

Vim hat zwei voneinander unterscheidbare Listen: die Buffer-Liste (alles, was offen ist) und die Argument-Liste (Dateien, die beim Start als Argumente übergeben wurden, oder per :args gesetzt). Die meisten Befehle (:bnext, :bd) wirken auf die Buffer-Liste. :argdo, :next wirken auf die Argument-Liste. Details im Artikel Argument-List.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Buffer, Fenster & Tabs

Zur Übersicht