Neben der Buffer-List, die jeder Vim-Nutzer kennt, gibt es eine zweite, weniger bekannte Liste: die Argument-List. Sie ist die Liste der Dateien, die beim Vim-Start als CLI-Argumente übergeben wurden — oder die später per :args explizit gesetzt wird. Im Alltag bleibt sie oft unsichtbar, weil sie nur selten direkt manipuliert wird. Aber für eine spezifische Klasse von Aufgaben ist sie das richtige Werkzeug: gezielte Bulk-Operationen auf einer wohldefinierten Datei-Liste. Wer 50 Dateien in einem Verzeichnis mit einer Ersetzung durchgehen will, ohne alle gleichzeitig als Buffer im Speicher zu haben, nutzt die Argument-List plus :argdo — und nicht die Buffer-List. Dieser Artikel klärt den Unterschied, zeigt alle Argument-List-Befehle und gibt typische Mass-Edit-Workflows.
Was die Argument-List ist
Die Argument-List (kurz: arglist) ist eine geordnete Liste von Dateinamen, die für eine Vim-Session als „Arbeits-Set" gilt. Sie hat drei Hauptquellen:
- CLI-Argumente beim Start:
vim foo.txt bar.txt baz.txtsetzt die arglist auf diese drei Dateien. :args-Befehl zur Laufzeit::args src/*.gosetzt die arglist neu.:argaddzum nachträglichen Erweitern.
Die arglist ist getrennt von der Buffer-List. Sie kann eine echte Teilmenge der Buffer sein, eine Obermenge oder etwas ganz anderes — abhängig davon, was zwischenzeitlich passiert ist.
" Vim mit drei Dateien starten
vim foo.txt bar.txt baz.txt
" arglist enthält: foo.txt, bar.txt, baz.txt (3 Einträge)
" buflist enthält: foo.txt (nur die erste ist tatsächlich geladen)
" :next geht durch die arglist:
:next " bar.txt — wird jetzt auch in buflist geladen
:next " baz.txt — buflist hat jetzt alle drei
" :e qux.txt fügt qux zur buflist hinzu, NICHT zur arglist:
:e qux.txt " arglist: drei Einträge (unverändert)
" buflist: vier EinträgeDieser Unterschied ist die zentrale Idee: die arglist ist eine bewusst gewählte, kuratierte Liste für eine bestimmte Operation, die buflist ist der Speicherzustand „alles, was gerade offen ist". Beide haben ihren Zweck, beide sind unabhängig manipulierbar.
:args — anzeigen und setzen
Das zentrale Kommando:
| Befehl | Aktion |
|---|---|
:args | aktuelle arglist anzeigen |
:args foo.txt bar.txt | arglist auf diese Dateien setzen (alte wird verworfen) |
:args src/*.go | arglist auf alle .go-Dateien in src/ |
:args **/*.txt | rekursiv alle .txt-Dateien (mit set wildmenu praktisch) |
| `:args ``find . -name *.go``` | arglist aus Shell-Output (Backticks!) |
Die Glob-Syntax ist Vims eigene, ähnlich zu Shell-Globbing:
*matched alles außer/**matched rekursiv inklusive Pfad-Trenner?matched genau ein Zeichen[abc]matched eines der Zeichen
:args ohne Argument zeigt die aktuelle Liste, die aktuelle Datei in eckigen Klammern markiert:
:args
" Ausgabe:
" foo.txt [bar.txt] baz.txt
" ↑ die aktuelle Datei in eckigen KlammernMit :args plus Argument wird die arglist neu gesetzt — die alte ist verloren. Wer additiv arbeiten will, nutzt :argadd (siehe nächster Abschnitt).
arglist erweitern und reduzieren
Drei zusätzliche Befehle für inkrementelle Manipulation:
| Befehl | Aktion |
|---|---|
:argadd foo.txt | Datei zur arglist hinzufügen (an aktueller Position) |
:argadd src/*.rs | mehrere Dateien per Glob hinzufügen |
:argdelete bar.txt | Datei aus der arglist entfernen |
:argdelete *.tmp | mehrere per Glob entfernen |
:%argdelete | komplette arglist leeren |
:argadd ist im Alltag wichtiger als :args: er erweitert die existierende Liste, statt sie zu ersetzen. Damit kann man ein Arbeits-Set schrittweise aufbauen:
:args src/auth/*.go " Auth-Modul-Dateien als Start
:argadd src/db/*.go " DB-Dateien dazu
:argadd tests/auth_test.go " spezifische Test-Datei dazu
:args " jetzt die kombinierte Liste prüfenDurch die arglist navigieren
Vim hat eine eigene Befehlsfamilie für arglist-Navigation, parallel zu den Buffer-Befehlen:
| arglist | buflist (Vergleich) | Aktion |
|---|---|---|
:next / :n | :bnext | nächste Datei in der arglist |
:previous / :prev | :bprev | vorherige Datei |
:first / :rewind | :bfirst | erste Datei |
:last | :blast | letzte Datei |
:argument N / :N | :b N | zur N-ten Datei in der arglist |
:next und :prev öffnen die nächste/vorherige Datei aus der arglist im aktuellen Fenster. Sie verhalten sich strukturell wie :bnext/:bprev, beziehen sich aber auf die arglist, nicht auf die buflist.
Mit :argument 3 springst du direkt zur dritten Datei in der arglist — eine spezifische Navigation, die mit :b über Namen oft umständlicher wäre.
:argdo — der eigentliche Hebel
Das wichtigste Argument-List-Werkzeug ist :argdo — es führt einen Ex-Befehl auf jeder Datei in der arglist aus, in der Reihenfolge der Liste.
:args src/*.go
:argdo %s/old_var/new_var/ge | update
" Erklärung:
" - %s/old_var/new_var/ge: in jeder Datei alle Vorkommen ersetzen
" e = no error wenn pattern nicht gefunden
" - update: speichern, falls modifiziert (statt :w, das immer schreibt)
:args **/*.md
:argdo set fileformat=unix | update
" Zeilenende auf unix-Format setzen für alle Markdown-FilesDas | update am Ende des Befehls speichert nach jeder Operation. Ohne diese Kette würde Vim nach :argdo %s/.../.../ge alle Dateien modifiziert im Speicher haben — und sich beim Beenden über ungespeicherte Änderungen beschweren.
Eine Variante mit Bestätigung pro Stelle: das c-Flag bei :substitute:
:args src/*.go
:argdo %s/old_var/new_var/gec | update
" e = no error, c = confirm vor jeder ErsetzungMit c fragt Vim bei jeder Stelle einzeln nach (y/n/a/q/l) — präzise Kontrolle über sehr große Refactoring-Operationen.
Voraussetzung für :argdo — set hidden
:argdo kann nur funktionieren, wenn Vim zwischen den Dateien wechseln darf, ohne dass die Modifikationen explizit gespeichert werden müssen. Ohne set hidden (siehe Buffer-Konzept) würde Vim beim ersten Wechsel mit modifizierter Datei stehen bleiben:
E37: No write since last change
Mit set hidden werden modifizierte Buffer hidden, Vim wechselt durch, am Ende ist die Datei-Liste komplett modifiziert. Das | update im obigen Beispiel sichert jeden Schritt ab.
In Vim-Konfigs ist die typische Kombination deshalb:
set hidden " erlaubt Buffer-Wechsel mit modifizierten Dateien
set autowrite " optional: speichert automatisch beim Wechselautowrite ist eine Alternative zu | update — Vim speichert vor jedem Wechsel automatisch. Im Alltag mit :argdo reicht die manuelle Variante mit | update, weil sie explizit kontrolliert, was gespeichert wird.
arglist vs. buflist — wann was
Beide Listen haben überlappende Funktionen. Eine Faustregel zur Wahl:
| Situation | Liste |
|---|---|
| Im Alltag offene Dateien wechseln | buflist (mit <C-^> und :b name) |
| Bulk-Edit auf wohldefinierten Datei-Satz | arglist (mit :argdo) |
| „Mach das auf alle Dateien, die ich gerade offen habe" | buflist (mit :bufdo) |
| „Mach das auf alle Dateien des Projekts" | arglist (:args **/*.go + :argdo) |
| Vim-Start mit Datei-Auswahl | arglist (CLI-Argumente) |
| Plugin-Buffers, Help, Quickfix einschließen | buflist |
Externe Datei-Liste aus find, grep, rg | arglist (per Backtick-Substitution) |
Im Klartext: die buflist ist die flüssige, sich ständig ändernde Liste; die arglist ist die bewusst gewählte, stabile Liste für eine spezifische Aufgabe. Wer nicht aktiv arglist-Befehle nutzt, kommt mit der buflist auch klar — aber wer Mass-Edits über vorausgewählte Datei-Sätze macht, hat in der arglist das passendere Werkzeug.
Workflow-Muster
Drei typische arglist-Anwendungen:
Refactoring über ein Modul
" 1. arglist auf das betroffene Modul setzen
:args src/auth/*.go
" 2. Alle Stellen in einem Buffer prüfen
:first " zur ersten Datei
/OldName " erste Stelle finden — Cursor draufsetzen
cwNewName<Esc> " ändern
" 3. Bulk-Operation auf den Rest:
:argdo %s/OldName/NewName/ge | update
" 4. Mit :next und :prev kontrollieren, ob alles korrekt ist
:first
:next | :next | ...arglist aus externer Tool-Ausgabe
" arglist auf alle Dateien setzen, die ripgrep findet
:args `rg --files-with-matches 'TODO' src/`
" Jetzt :argdo auf der gefilterten Liste
:argdo /TODO<CR> | updateDas ist die Kombination, die :argdo zum mächtigsten Bulk-Edit-Werkzeug macht: man baut die Liste mit einem externen Tool (find, rg, fd, git ls-files) und wirkt anschließend per Vim-Befehl.
Vim-Start als gezielte Arbeits-Session
# Vim mit allen Test-Dateien starten
vim $(find tests -name '*_test.go')
# Oder mit fd:
vim $(fd -e go --type f .)
# Innerhalb von Vim ist arglist dann schon gesetzt:
# :args zeigt sie, :argdo wirkt auf sieDas ist eine elegante Variante: die Arbeits-Datei-Liste wird in der Shell ausgewählt, Vim startet mit ihr als arglist, alle weiteren Operationen sind direkt verfügbar.
Interessantes
`:next` und `:prev` ohne Argument sind arglist-Befehle
Die Klassiker — und sie verwirren manchmal, weil sie sich ähnlich anfühlen wie :bnext/:bprev. Der Unterschied: :next iteriert die arglist, :bnext die buflist. Wer :next aufruft und keine arglist existiert, bekommt einen Fehler.
`:argdo` braucht `set hidden`
Ohne diese Option weigert sich Vim, mit modifizierten Buffern zur nächsten Datei zu springen. Bei :argdo ist das ein zwingender Show-Stopper. Mit set hidden ist alles in Ordnung.
arglist überdauert Buffer-Operationen
:bd foo.txt entfernt foo aus der buflist — aber arglist behält den Eintrag. Wer in der arglist mit :next weitergeht, lädt foo automatisch wieder neu. Die arglist ist persistenter als die buflist.
`:argdo` läuft pro Argument, nicht pro Buffer
Wenn dieselbe Datei zweimal in der arglist steht (durch versehentliches :argadd), wird :argdo sie zweimal verarbeiten. Bei idempotenten Operationen (z. B. einer Substitution) ist das harmlos, bei nicht-idempotenten (z. B. :put als Append) kann es Daten doppeln.
Die arglist ist tab-lokal
Jeder Tab hat seine eigene arglist. Wer in Tab 1 :args *.go setzt und in Tab 2 wechselt, hat dort eine andere (oder leere) arglist. Das ist konsistent mit Vims Tab-als-Workspace-Modell und erlaubt parallele arglist-Operationen.
`:argglobal` für globale arglist
Wenn man explizit eine globale arglist statt einer tab-lokalen will, nutzt man :argglobal. Im Alltag selten gebraucht — meist ist die tab-lokale Variante das, was man möchte.
Weiterführende Ressourcen
Externe Quellen
- Vim Help: argument-list — vollständige arglist-Referenz.
- Vim Help: :args — Setz- und Anzeige-Befehl.
- Vim Help: :argdo — Bulk-Operationen.
- Vim Help: :next — Navigation in der arglist.
- Drew Neil — Practical Vim, Tip 38 — „Run Ex Commands Across Multiple Buffers".