This commit is contained in:
Mathias Schneider
2026-04-02 17:39:43 +02:00
parent 88853f3a25
commit 5811cbd9e9
6 changed files with 314 additions and 0 deletions
+161
View File
@@ -0,0 +1,161 @@
## 1. Die Basis: Modi & Navigation
Vim basiert auf dem Konzept von Modi. Um Befehle auszuführen, musst du fast immer im **Normal Mode** sein.
### Modi-Wechsel
* `i` / `a`: Insert-Modus (vor/nach Cursor).
* `I` / `A`: Insert am Zeilenanfang / Zeilenende.
* `o` / `O`: Neue Zeile unterhalb / oberhalb einfügen.
* `Esc`: Zurück in den Normal-Modus.
* `v` / `V` / `Ctrl+v`: Visueller Modus (Zeichen / Zeile / Block).
### Navigation (Normal Mode)
* **Grundbewegung:** `h` (links), `j` (runter), `k` (hoch), `l` (rechts).
* **Wortweise:** `w` (nächstes Wort), `b` (vorheriges), `e` (Wortende).
* **Zeilenweise:** `0` (Anfang), `^` (erstes Zeichen), `$` (Ende).
* **Datei-Sprünge:** `gg` (Anfang), `G` (Ende), `:n` (Zeile n).
* **Scrollen:** `Ctrl+u` / `Ctrl+d` (Halbe Seite hoch/runter).
* **Klammern:** `%` springt zur korrespondierenden Klammer `()`, `[]`, `{}`.
---
## 2. Bearbeitung & Text-Objekte
Die wahre Stärke von Vim liegt in der Kombination von **Operatoren** und **Bewegungen/Objekten**.
### Basis-Operationen
* `x`: Zeichen löschen.
* `dd`: Ganze Zeile löschen (Ausschneiden).
* `yy`: Zeile kopieren (Yank).
* `p` / `P`: Einfügen nach / vor dem Cursor.
* `u` / `Ctrl+r`: Undo / Redo.
* `.`: Die letzte Aktion wiederholen.
### Das "Verb + Adjektiv + Nomen" Prinzip
Viele Befehle folgen dem Muster: `[Zahl] + [Operator] + [Textobjekt/Bewegung]`.
* `3dw`: Lösche 3 Wörter.
* `ci"`: **C**hange **I**nside **"**: Löscht den Inhalt zwischen Anführungszeichen und geht in den Insert-Modus.
* `da(`: **D**elete **A**round **(**: Löscht die Klammern inklusive Inhalt.
* `yiw`: Kopiere das aktuelle Wort (**Y**ank **I**nside **W**ord).
---
## 3. Suche & Ersetzen (Regex & "Magic")
### Suchen in der aktuellen Datei
* `/muster`: Vorwärts suchen.
* `?muster`: Rückwärts suchen.
* `n` / `N`: Nächster / Vorheriger Treffer.
* `*` / `#`: Sucht das Wort unter dem Cursor vorwärts / rückwärts.
### Ersetzen (Substituieren)
* `:%s/alt/neu/g`: Ersetzt alle Vorkommen in der Datei.
* `:%s/alt/neu/gc`: Ersetzt mit Bestätigung für jeden Treffer.
### RegEx & Very Magic
Vim nutzt standardmäßig eine eigene RegEx-Syntax. Mit `\v` (very magic) nutzt du eine Syntax, die moderneren Sprachen (wie Python/JS) ähnelt.
```vim
" Findet abc oder ac (das ? ist in very magic ein Metazeichen)
/\vab?c
```
---
## 4. Projektweites Find & Replace (Neovim & Telescope)
Dies ist ein Workflow für umfassendes Refactoring über viele Dateien hinweg.
### Schritt 1: Suchen & Filtern
1. Starte Telescope: `:Telescope live_grep`.
2. Suche nach dem Begriff.
3. Sende Ergebnisse an die Quickfix-Liste: `Ctrl + q`.
### Schritt 2: Massen-Ersetzung mit `:cdo`
Der Befehl `:cdo` führt ein Kommando für jeden Eintrag in der Quickfix-Liste aus.
```vim
:cdo s/alter_begriff/neuer_begriff/gc | update
```
* `gc`: Global in der Zeile ersetzen, mit Bestätigung.
* `| update`: Speichert die Datei sofort, wenn eine Änderung vorgenommen wurde.
### Schritt 3: Zeilen löschen (Spezialfall)
Wenn du Zeilen, die ein Muster enthalten, komplett löschen willst, ist `:cfdo` (pro Datei) robuster als `:cdo` (pro Treffer).
```vim
:cfdo g/muster/d | update
```
---
## 5. Multi-File Suche mit `:vimgrep`
Wenn du kein Telescope nutzt, ist `:vimgrep` der integrierte Weg.
* `:vimgrep /muster/ **/*.py`: Sucht rekursiv in allen Python-Dateien.
* `:copen`: Öffnet das Quickfix-Fenster, um die Ergebnisse zu sehen.
* `:cn` / `:cp`: Springe zum nächsten/vorherigen Treffer.
---
## 6. Register & Clipboard
Vim hat mehrere "Ablagen" (Register).
* `"ayw`: Kopiere Wort in Register `a`.
* `"ap`: Füge Inhalt aus Register `a` ein.
* `"+y`: Kopiere in das **System-Clipboard** (Wichtig für Austausch mit anderen Apps!).
* `:reg`: Zeige alle aktuellen Registerinhalte an.
* `"%`: Enthält den Pfad der aktuellen Datei.
---
## 7. Effizienz-Booster: Makros & Markierungen
### Makros (Automatisierung)
* `qa`: Aufnahme in Register `a` starten.
* `q`: Aufnahme stoppen.
* `@a`: Makro `a` abspielen.
* `@@`: Das letzte Makro wiederholen.
### Markierungen (Ergänzung)
Mit Markierungen kannst du schnell zu bestimmten Stellen springen.
* `ma`: Setzt eine Markierung `a` an der aktuellen Position.
* `'a`: Springt direkt zur Markierung `a`.
---
## 8. Fenster, Tabs & Buffer
Vim verwaltet Dateien in **Buffern**. **Windows** (Splits) und **Tabs** sind nur Ansichten darauf.
* `:ls`: Alle offenen Buffer anzeigen.
* `:b 3`: Zum 3. Buffer wechseln.
* `:split` / `:vsplit`: Horizontaler / Vertikaler Split.
* `Ctrl+w w`: Zwischen Fenstern wechseln.
* `:tabnew`: Neuer Tab.
* `gt` / `gT`: Nächster / Vorheriger Tab.
---
## 9. Visual Block Mode & Kommentieren
Der Block-Modus (`Ctrl+v`) ist ideal, um Textspalten zu bearbeiten.
### Block-Kommentieren (Manuell)
1. `Ctrl+v` drücken und Zeilen nach unten markieren.
2. `Shift+i` (Insert am Anfang des Blocks).
3. Kommentarzeichen eingeben (z. B. `# `).
4. `Esc` drücken die Änderung wird auf alle Zeilen angewendet.
### Plugin-Empfehlung: `vim-commentary`
Mit diesem Plugin reicht ein Befehl:
* `gcc`: Kommentiert die aktuelle Zeile um/aus.
* `gc` (im Visual Mode): Kommentiert den markierten Block.
---
## 10. Konfiguration (.vimrc / init.lua)
Einige Standard-Einstellungen, die jeder Power-User haben sollte:
```vim
set number " Absolute Zeilennummer der aktuellen Zeile
set relativenumber " Relative Nummern für alle anderen Zeilen (ideal für 5j, 3k)
set expandtab " Leerzeichen statt Tabs
set tabstop=4 " Tab-Breite
set ignorecase " Suche ignoriert Groß/Kleinschreibung...
set smartcase " ...außer du tippst einen Großbuchstaben
```
---
### Profi-Tipp: Befehlsbuffer
Wenn du einen komplexen Ex-Befehl (mit `:`) getippt hast und ihn bearbeiten willst, drücke im Normal-Modus `q:`. Es öffnet sich ein Fenster mit der Historie deiner Befehle, die du wie normalen Text bearbeiten und mit `Enter` neu ausführen kannst.
@@ -0,0 +1,111 @@
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.