2.3 KiB
In Vim kannst du mit regulären Ausdrücken über mehrere Dateien suchen, typischerweise über das Quickfix-/Location-List-System. Die wichtigsten Befehle dafür sind :vimgrep und :grep.
1. Mehrdatei-Suche mit :vimgrep
Grundform:
:vimgrep /MUSTER/ {Dateiliste}
Beispiele:
" In allen .py-Dateien im aktuellen Verzeichnis
:vimgrep /foo/ *.py
" Rekursiv in allen .py-Dateien
:vimgrep /foo/ **/*.py
" In allen Dateien des aktuellen Git-Repos (falls du Pfade generierst)
:vimgrep /foo/ `git ls-files`
Danach:
- Quickfix-Fenster öffnen:
:copen - Zum nächsten Treffer springen:
:cn - Zum vorherigen Treffer springen:
:cp
2. Regex-Varianten: Standard vs. „very magic“
Vim-Regex kann per Präfix gesteuert werden:
- Standard (abhängig von
'magic'-Option) \v= very magic (fast alles ist Meta-Zeichen)\m= magic\M= nomagic\V= very nomagic
Du kannst das direkt im Suchmuster verwenden:
" Very magic: ( ) + ? | etc. sind sofort Metazeichen
:vimgrep /\vfoo(bar|baz)\d+/ **/*.txt
" Standard-/Default-Verhalten (meistens wie :set magic)
:vimgrep /foo\(bar\|baz\)\d\+/ **/*.txt
Kurz gesagt:
- Wenn du „normale“ moderne RegEx-Syntax willst, nimm einfach
\vam Anfang des Patterns.
3. Suche mit :grep (externes Tool)
Wenn grepprg entsprechend gesetzt ist (z.B. auf rg, ag oder grep):
:grep foo **/*.py
:copen
Auch hier gilt: das Muster ist in vielen Fällen nicht Vim-Regex, sondern die Regex-Syntax des externen Tools (z.B. ripgrep).
Wenn du explizit Vim-Regex willst, bleib bei :vimgrep.
4. Dateien vorher definieren und dann suchen
Du kannst zuerst eine Dateiliste definieren und dann in dieser Liste suchen:
" Alle C-Dateien rekursiv in die Argumentliste
:args **/*.c
" Jetzt in allen Dateien aus :args suchen
:vimgrep /\vmy_func\(/ ##
" ## bedeutet: alle Dateien in der aktuellen Argumentliste
5. Treffern zur bestehenden Liste hinzufügen
Wenn du mehrere Suchläufe kombinieren willst:
:vimgrep /foo/ **/*.py
:vimgrepadd /bar/ **/*.py " fügt Treffer für bar hinzu
:copen
Wenn du mir sagst, ob du eher mit rg/ag arbeitest oder nur mit purem Vim, kann ich dir ein paar konkrete Konfig-/Mapping-Beispiele geben.