Files
it-know-how/(Neo) Vim/_alt/Vimgrep - Suchen über mehrere Dateien.md
T
2026-04-02 17:39:43 +02:00

111 lines
2.3 KiB
Markdown

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:
```vim
:vimgrep /MUSTER/ {Dateiliste}
```
Beispiele:
```vim
" 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:
```vim
:copen
```
- Zum nächsten Treffer springen:
```vim
:cn
```
- Zum vorherigen Treffer springen:
```vim
: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:
```vim
" 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 `\v` am Anfang des Patterns.
---
## 3. Suche mit `:grep` (externes Tool)
Wenn `grepprg` entsprechend gesetzt ist (z.B. auf `rg`, `ag` oder `grep`):
```vim
: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:
```vim
" 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:
```vim
: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.