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

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 \v am 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.