111 lines
2.3 KiB
Markdown
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. |