update
This commit is contained in:
+146
@@ -0,0 +1,146 @@
|
||||
## Introduction[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#introduction)
|
||||
|
||||
Maintaining an organized and efficient codebase is essential for every developer. Neovim, a powerful text editor, offers a range of tools that can help you make global changes throughout your project with ease.
|
||||
|
||||
In this blog post, we’ll explore how to perform a project-wide find and replace using Neovim, Telescope, the Quickfix List, and the `:cdo` command. No complicated jargon, just straightforward guidance to enhance your coding experience.
|
||||
|
||||
## Prerequisites[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#prerequisites)
|
||||
|
||||
Before you start, ensure you have the following prerequisites in place:
|
||||
|
||||
1. Neovim installed.
|
||||
2. The Telescope plugin installed.
|
||||
3. A project directory opened in Neovim.
|
||||
|
||||
## Using Telescope for Live Grep[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#using-telescope-for-live-grep)
|
||||
|
||||
### 1. Initiate Telescope[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#1-initiate-telescope)
|
||||
|
||||
In Neovim’s Normal mode, execute the following command:
|
||||
|
||||
```shell
|
||||
:Telescope live_grep
|
||||
```
|
||||
|
||||
This opens the Telescope live grep prompt, ready for your query.
|
||||
|
||||
### 2. Enter Your Search Query[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#2-enter-your-search-query)
|
||||
|
||||
Type your search query. Telescope will display a list of search results throughout your project.
|
||||
|
||||
### 3. Open Results in Quickfix List[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#3-open-results-in-quickfix-list)
|
||||
|
||||
After searching for your query, press `Ctrl + q` to open the search results in the Quickfix List.
|
||||
|
||||
## Utilizing `:cdo` for Find and Replace[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#utilizing-cdo-for-find-and-replace)
|
||||
|
||||
### 4. Run the `:cdo` Command[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#4-run-the-cdo-command)
|
||||
|
||||
With the Quickfix List open, you can now perform the find and replace operation. Execute the following command:
|
||||
|
||||
```shell
|
||||
:cdo s/query_string/replacement_string/gc
|
||||
```
|
||||
|
||||
- `:cdo` applies a command to each entry in the Quickfix List.
|
||||
- `s/query_string/replacement_string/gc` is the find and replace command, with `g` for global replacement.
|
||||
- The `/c` flag provides confirmation before each replacement.
|
||||
|
||||
Press Enter to initiate the find and replace with confirmation.
|
||||
|
||||
### 5. Save Changes[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#5-save-changes)
|
||||
|
||||
If you’re satisfied with the changes and want to save them across all files in your project, you can use the `:wa` command:
|
||||
|
||||
```shell
|
||||
:wa
|
||||
```
|
||||
|
||||
## Conclusion[](https://blog.chaitanyashahare.com/posts/project-wide-find-and-replace-in-neovim/#conclusion)
|
||||
|
||||
Performing a project-wide find and replace in Neovim using Telescope, the Quickfix List, and the `:cdo` command is a potent approach that simplifies codebase maintenance. It allows you to make comprehensive changes while retaining full control over the replacement process, with the added `/c` flag providing a confirmation step for each replacement. By incorporating these techniques into your Neovim workflow, you’ll significantly improve your coding experience and efficiency. Use `:wa` to save your changes across all files and ensure your project is up to date.
|
||||
|
||||
# Bsp Zeilen mit Treffern löschen
|
||||
|
||||
Es gibt zwei leicht verschiedene Dinge:
|
||||
|
||||
1. Zeilen **in den Dateien** löschen
|
||||
2. Einträge **aus der Quickfix‑Liste** löschen
|
||||
|
||||
Ich nehme an, du meinst 1., also die Zeilen in den Dateien entfernen, wo `live_grep` dein Wort gefunden hat. Ich zeige aber beide Varianten.
|
||||
|
||||
---
|
||||
|
||||
## 1. Zeilen in den Dateien löschen (empfohlen)
|
||||
|
||||
Du hast `live_grep` mit z.B. `wits` gemacht und die Treffer in die Quickfix-Liste geschickt (`<C-q>`).
|
||||
|
||||
Jetzt willst du **alle Zeilen in den Dateien löschen, die `wits` enthalten**.
|
||||
Das geht am saubersten mit `:cfdo` + `:global`:
|
||||
|
||||
```vim
|
||||
:cfdo g/wits/d | update
|
||||
```
|
||||
|
||||
Erklärung:
|
||||
|
||||
- `cfdo` – führe den folgenden Befehl für jede **Datei** aus, die in der Quickfix-Liste vorkommt
|
||||
- `g/wits/d` – in dieser Datei: lösche **alle Zeilen**, die `wits` enthalten
|
||||
- `| update` – speichere die Datei, wenn sie geändert wurde
|
||||
|
||||
Damit sind nachher in allen Dateien, die in der Quickfix-Liste sind, sämtliche Zeilen mit `wits` weg.
|
||||
|
||||
### Variante ohne hartkodiertes Muster
|
||||
|
||||
Wenn du das Suchmuster noch einmal mit `/` gesetzt hast, kannst du es statt `wits` auch aus der letzten Suche nehmen:
|
||||
|
||||
```vim
|
||||
/"dein muster"
|
||||
:cfdo g//d | update
|
||||
```
|
||||
|
||||
`g//` benutzt dann das aktuelle Suchmuster aus `/`.
|
||||
|
||||
---
|
||||
|
||||
## 2. Zeilen *aus der Quickfix-Liste* löschen
|
||||
|
||||
Falls du **nur die Einträge in der Quickfix-Liste selbst** filtern oder löschen willst (nicht die Dateien):
|
||||
|
||||
Quickfix-Fenster öffnen:
|
||||
|
||||
```vim
|
||||
:copen
|
||||
```
|
||||
|
||||
### Einträge mit bestimmtem Muster entfernen
|
||||
|
||||
```vim
|
||||
:cfilter! wits
|
||||
```
|
||||
|
||||
- `:cfilter {pat}` – behält nur Einträge, die `{pat}` matchen
|
||||
- `:cfilter! {pat}` – entfernt Einträge, die `{pat}` matchen
|
||||
|
||||
Mit `:cfilter! wits` würdest du also alle Quickfix-Einträge wegwerfen, die `wits` enthalten (die Dateien bleiben unverändert).
|
||||
|
||||
---
|
||||
|
||||
## 3. Warum nicht `:cdo normal! dd`?
|
||||
|
||||
Rein technisch könntest du auch:
|
||||
|
||||
```vim
|
||||
:cdo normal! dd
|
||||
```
|
||||
|
||||
Das löscht in jeder Datei die jeweilige Trefferzeile.
|
||||
Aber: `:cdo` läuft pro **Quickfix-Eintrag**; wenn du Zeilen löschst, können die nachfolgenden Einträge (mit alten Zeilennummern) verrutschen. Deshalb ist `:cfdo g/pattern/d` robuster – da wird pro Datei einmal gearbeitet, nicht pro Eintrag.
|
||||
|
||||
---
|
||||
|
||||
Kurzfassung für dein konkretes Beispiel (`wits` aus den Dateien löschen):
|
||||
|
||||
```vim
|
||||
:cfdo g/wits/d | update
|
||||
```
|
||||
@@ -0,0 +1,476 @@
|
||||
Hier ist ein kompaktes, aber vollständiges **VIM Cheat Sheet** 📝
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Modi in VIM
|
||||
|
||||
|Modus|Bedeutung|Wechsel|
|
||||
|---|---|---|
|
||||
|**Normal Mode**|Navigation & Befehle|`Esc`|
|
||||
|**Insert Mode**|Texteingabe|`i`, `a`, `o`, etc.|
|
||||
|**Visual Mode**|Text markieren|`v`, `V`, `Ctrl+v`|
|
||||
|**Command Mode**|Speichern, Beenden, etc.|`:`|
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Insert Mode Befehle
|
||||
|
||||
|Befehl|Wirkung|
|
||||
|---|---|
|
||||
|`i`|Vor Cursor einfügen|
|
||||
|`a`|Nach Cursor einfügen|
|
||||
|`I`|Am Zeilenanfang einfügen|
|
||||
|`A`|Am Zeilenende einfügen|
|
||||
|`o`|Neue Zeile unterhalb|
|
||||
|`O`|Neue Zeile oberhalb|
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Navigation (Normal Mode)
|
||||
|
||||
### Zeichenweise
|
||||
|
||||
```
|
||||
h ← j ↓ k ↑ l →
|
||||
```
|
||||
|
||||
### Wortweise
|
||||
|
||||
```
|
||||
w nächstes Wort
|
||||
b vorheriges Wort
|
||||
e Wortende
|
||||
```
|
||||
|
||||
### Zeilenweise
|
||||
|
||||
```
|
||||
0 Zeilenanfang
|
||||
^ Erstes Nicht-Leerzeichen
|
||||
$ Zeilenende
|
||||
```
|
||||
|
||||
### Datei
|
||||
|
||||
```
|
||||
gg Anfang der Datei
|
||||
G Ende der Datei
|
||||
:n Gehe zu Zeile n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Löschen
|
||||
|
||||
|Befehl|Wirkung|
|
||||
|---|---|
|
||||
|`x`|Zeichen löschen|
|
||||
|`dd`|Zeile löschen|
|
||||
|`dw`|Wort löschen|
|
||||
|`d$`|Bis Zeilenende löschen|
|
||||
|`d0`|Bis Zeilenanfang löschen|
|
||||
|
||||
💡 Kombination: `d` + Bewegung funktioniert immer
|
||||
(z.B. `d3w` = 3 Wörter löschen)
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Kopieren & Einfügen
|
||||
|
||||
|Befehl|Wirkung|
|
||||
|---|---|
|
||||
|`yy`|Zeile kopieren|
|
||||
|`yw`|Wort kopieren|
|
||||
|`p`|Nach Cursor einfügen|
|
||||
|`P`|Vor Cursor einfügen|
|
||||
|
||||
#### Register
|
||||
Vor alle Kopieren oder Einfügen Befehle kann ein `"3` gestellt werden, um ins 3. Register zu schreiben bzw. daraus heraus zu lesen. Z.b. kopiert `"7yw` das Wort ins 7. Register und `"4p` fügt das 4. Register nach dem Curser ein.
|
||||
💡 Das spezielle Register `+`/`*` ist das System-Clipboard, sehr Praktisch zum Austausch von Text mit anderen Programmen
|
||||
Alle Register ansehen: `:reg`
|
||||
💡 Das spezielle Register `%` enthält den aktuellen Dateipfad -> aktuelle Dateipfad in System-Clipboard: `:let @+=@%`.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Undo / Redo
|
||||
|
||||
```
|
||||
u Undo
|
||||
Ctrl+r Redo
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Visual Mode
|
||||
|
||||
|Befehl|Wirkung|
|
||||
|---|---|
|
||||
|`v`|Zeichenweise markieren|
|
||||
|`V`|Ganze Zeile markieren|
|
||||
|`Ctrl+v`|Block markieren|
|
||||
|
||||
Nach Markierung:
|
||||
|
||||
```
|
||||
d löschen
|
||||
y kopieren
|
||||
> einrücken
|
||||
< ausrücken
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Suchen & Ersetzen
|
||||
|
||||
```
|
||||
/text Vorwärts suchen
|
||||
?text Rückwärts suchen
|
||||
n Nächstes Ergebnis
|
||||
N Vorheriges Ergebnis
|
||||
```
|
||||
|
||||
Ersetzen:
|
||||
|
||||
```
|
||||
:%s/alt/neu/g Ganze Datei
|
||||
:s/alt/neu/g Aktuelle Zeile
|
||||
:%s/alt/neu/gc Mit Bestätigung
|
||||
```
|
||||
|
||||
Nutze "echtes" RegEx ("very magic"):
|
||||
```
|
||||
/\v...
|
||||
```
|
||||
zB
|
||||
```
|
||||
/\vab?c
|
||||
```
|
||||
findet `abc` und `ac` . Das würde mit herkömmlicher Vim RegEx nicht funktionieren
|
||||
|
||||
Suchen und ersetzen
|
||||
```
|
||||
:%s/\vfoo (ab?c)(bar)/bas \1 \2/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Speichern & Beenden
|
||||
|
||||
```
|
||||
:w Speichern
|
||||
:q Beenden
|
||||
:wq Speichern & Beenden
|
||||
:x Speichern & Beenden
|
||||
:q! Ohne Speichern beenden
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Fenster & Tabs
|
||||
|
||||
```
|
||||
:split Horizontal teilen
|
||||
:vsplit Vertikal teilen
|
||||
Ctrl+w w Zwischen Fenstern wechseln
|
||||
:tabnew Neuer Tab
|
||||
gt Nächster Tab
|
||||
gT Vorheriger Tab
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Nützliche Shortcuts
|
||||
|
||||
```
|
||||
. Letzte Aktion wiederholen
|
||||
>> Zeile einrücken
|
||||
<< Zeile ausrücken
|
||||
ciw Wort ändern
|
||||
cc Zeile ändern
|
||||
J Zeilen zusammenführen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Makros
|
||||
|
||||
```
|
||||
qa Aufnahme in Register a starten
|
||||
q Aufnahme stoppen
|
||||
@a Makro a ausführen
|
||||
@@ Letztes Makro wiederholen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Zahlen-Präfixe (Sehr wichtig!)
|
||||
|
||||
Viele Befehle lassen sich multiplizieren:
|
||||
|
||||
```
|
||||
3dd 3 Zeilen löschen
|
||||
5w 5 Wörter vor
|
||||
2yy 2 Zeilen kopieren
|
||||
```
|
||||
|
||||
---
|
||||
# Zeilennummern aus- und anschalten
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Absolute Zeilennummern
|
||||
|
||||
### Einschalten:
|
||||
|
||||
```vim
|
||||
:set number
|
||||
```
|
||||
|
||||
### Ausschalten:
|
||||
|
||||
```vim
|
||||
:set nonumber
|
||||
```
|
||||
|
||||
### Toggle:
|
||||
|
||||
```vim
|
||||
:set number!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Relative Zeilennummern
|
||||
|
||||
### Einschalten:
|
||||
|
||||
```vim
|
||||
:set relativenumber
|
||||
```
|
||||
|
||||
### Ausschalten:
|
||||
|
||||
```vim
|
||||
:set norelativenumber
|
||||
```
|
||||
|
||||
### Toggle:
|
||||
|
||||
```vim
|
||||
:set relativenumber!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Absolute + Relative kombinieren (Sehr beliebt 🔥)
|
||||
|
||||
Viele nutzen diese Kombination:
|
||||
|
||||
```vim
|
||||
:set number relativenumber
|
||||
```
|
||||
|
||||
👉 Ergebnis:
|
||||
|
||||
* Aktuelle Zeile = **absolute Nummer**
|
||||
* Alle anderen Zeilen = **relative Nummern**
|
||||
|
||||
Beispiel:
|
||||
|
||||
```
|
||||
8
|
||||
2
|
||||
1
|
||||
10 ← aktuelle Zeile
|
||||
1
|
||||
2
|
||||
3
|
||||
```
|
||||
|
||||
Das ist perfekt für Bewegungen wie:
|
||||
|
||||
```
|
||||
5j
|
||||
3k
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Dauerhaft aktivieren (.vimrc)
|
||||
|
||||
In deiner `~/.vimrc`:
|
||||
|
||||
```vim
|
||||
set number
|
||||
set relativenumber
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Smart Toggle Mapping (Optional ⭐)
|
||||
|
||||
Viele nutzen ein Keybinding:
|
||||
|
||||
```vim
|
||||
nnoremap <leader>n :set number! relativenumber!<CR>
|
||||
```
|
||||
|
||||
Dann kannst du mit:
|
||||
|
||||
```
|
||||
\ n
|
||||
```
|
||||
|
||||
(beim Standard-`leader`) beide gleichzeitig toggeln.
|
||||
|
||||
---
|
||||
|
||||
|
||||
# Block Aus- und Einkommentieren
|
||||
|
||||
---
|
||||
|
||||
# 🔹 1️⃣ Rein mit Vim (ohne Plugin)
|
||||
|
||||
## ✅ Ganze Zeilen im Visual Mode kommentieren
|
||||
|
||||
### Schritt 1: Block markieren
|
||||
|
||||
* `V` → Zeilenweise markieren
|
||||
* `j / k` → Bereich wählen
|
||||
|
||||
### Schritt 2: Kommentarzeichen einfügen
|
||||
|
||||
Beispiel für `#`:
|
||||
|
||||
```vim
|
||||
:s/^/# /
|
||||
```
|
||||
|
||||
Im Visual Mode einfach:
|
||||
|
||||
```vim
|
||||
:'<,'>s/^/# /
|
||||
```
|
||||
|
||||
👉 Fügt `# ` am Anfang jeder markierten Zeile ein.
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Auskommentieren
|
||||
|
||||
```vim
|
||||
:'<,'>s/^# //
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Noch schneller (ohne `:` tippen)
|
||||
|
||||
Markieren mit `V`, dann:
|
||||
|
||||
```vim
|
||||
:s/^/# /
|
||||
```
|
||||
|
||||
Vim setzt `'<,'>` automatisch.
|
||||
|
||||
---
|
||||
|
||||
# 🔹 2️⃣ Noch effizienter: Visual Block Mode (Sehr elegant ⚡)
|
||||
|
||||
Perfekt für feste Kommentarzeichen wie `#`, `//`, `--`.
|
||||
|
||||
### Schritt 1
|
||||
|
||||
```
|
||||
Ctrl + v
|
||||
```
|
||||
|
||||
### Schritt 2
|
||||
|
||||
Mit `j/k` mehrere Zeilen markieren (nur Spalte 0)
|
||||
|
||||
### Schritt 3
|
||||
|
||||
```
|
||||
Shift + i
|
||||
#
|
||||
Esc
|
||||
```
|
||||
|
||||
💥 Vim fügt das in alle markierten Zeilen ein.
|
||||
|
||||
---
|
||||
|
||||
## 🔹 Entfernen mit Block Mode
|
||||
|
||||
1. `Ctrl + v`
|
||||
2. Erste 2 Zeichen (`# `) markieren
|
||||
3. `d`
|
||||
|
||||
---
|
||||
|
||||
# 🔹 3️⃣ Beste Lösung: Plugin (Empfohlen 🔥)
|
||||
|
||||
Wenn du regelmäßig kommentierst → nimm ein Plugin.
|
||||
|
||||
Sehr beliebt:
|
||||
|
||||
* vim-commentary von Tim Pope
|
||||
|
||||
### Installation (mit vim-plug):
|
||||
|
||||
```vim
|
||||
Plug 'tpope/vim-commentary'
|
||||
```
|
||||
|
||||
### Nutzung:
|
||||
|
||||
* `gcc` → aktuelle Zeile toggeln
|
||||
* `gc` (im Visual Mode) → Block toggeln
|
||||
|
||||
💎 Vorteil:
|
||||
|
||||
* erkennt automatisch Kommentarzeichen je nach Dateityp
|
||||
* funktioniert mit `//`, `#`, `--`, `/* */`, etc.
|
||||
|
||||
---
|
||||
|
||||
# 🔹 4️⃣ Absolute Power-User Lösung (Ohne Plugin, aber smart)
|
||||
|
||||
In `.vimrc`:
|
||||
|
||||
```vim
|
||||
vnoremap <leader>c :s/^/# /<CR>
|
||||
vnoremap <leader>u :s/^# //<CR>
|
||||
```
|
||||
|
||||
Dann:
|
||||
|
||||
```
|
||||
\c → kommentieren
|
||||
\u → auskommentieren
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# 🔥 Meine Empfehlung
|
||||
|
||||
| Wenn du... | Lösung |
|
||||
| ----------------------------- | ----------------- |
|
||||
| Nur selten kommentierst | Visual Block Mode |
|
||||
| Viel programmierst | vim-commentary |
|
||||
| Minimalistisch bleiben willst | eigenes Mapping |
|
||||
|
||||
---
|
||||
# Verschiedenes
|
||||
- `%`: zur nächsten Klammer
|
||||
- `TOhtml`: HTML Export
|
||||
- `:ls`: Buffer anzeigen -> `:b 3` den 3. Buffer öffnen
|
||||
- `.` : letzte Aktion wiederholen
|
||||
- `:e path/to/file` öffnet Datei, nur `:e` aktualisiert die geöffnete Datei, `:e!` verwirft dabei alle Änderungen
|
||||
- `q:` : öffne Befehlsbuffer
|
||||
- Dort kann man z.B. mit `"+yy` Befehle ins Clipboard kopieren
|
||||
-
|
||||
@@ -0,0 +1,214 @@
|
||||
## Modi
|
||||
```text
|
||||
i In den Insert-Modus (vor Cursor)
|
||||
I Insert am Zeilenanfang
|
||||
a Insert nach Cursor
|
||||
A Insert am Zeilenende
|
||||
o Neue Zeile unterhalb + Insert
|
||||
O Neue Zeile oberhalb + Insert
|
||||
|
||||
<Esc> Zurück in Normalmodus
|
||||
|
||||
v Visueller Modus (Zeichenweise)
|
||||
V Visueller Modus (Zeilenweise)
|
||||
<C-v> Visueller Blockmodus
|
||||
```
|
||||
## Navigation (Normalmodus)
|
||||
```text
|
||||
h j k l Links / runter / hoch / rechts
|
||||
|
||||
0 Zeilenanfang
|
||||
^ Erstes nicht-leer Zeichen
|
||||
$ Zeilenende
|
||||
|
||||
w Zum nächsten Wortanfang
|
||||
b Zum vorherigen Wortanfang
|
||||
e Zum Wortende
|
||||
W B E Wie oben, aber Worte durch Leerzeichen getrennt
|
||||
|
||||
gg Erste Zeile
|
||||
G Letzte Zeile
|
||||
ngg / nG Zu Zeile n
|
||||
|
||||
H Oberer Bildschirmrand
|
||||
M Mittlerer Bildschirmrand
|
||||
L Unterer Bildschirmrand
|
||||
|
||||
Ctrl-u Halbe Seite hoch
|
||||
Ctrl-d Halbe Seite runter
|
||||
Ctrl-b Seite hoch
|
||||
Ctrl-f Seite runter
|
||||
```
|
||||
## Basis-Bearbeitung
|
||||
```text
|
||||
x Zeichen unter Cursor löschen
|
||||
X Zeichen links vom Cursor löschen
|
||||
r<char> Zeichen ersetzen
|
||||
|
||||
dd Zeile löschen (cut)
|
||||
D Bis zum Zeilenende löschen
|
||||
cc Zeile ändern (delete + insert)
|
||||
C Bis zum Zeilenende ändern
|
||||
|
||||
yy Zeile kopieren
|
||||
Y Alias für yy
|
||||
p Einfügen NACH Cursor/Zeile
|
||||
P Einfügen VOR Cursor/Zeile
|
||||
|
||||
u Undo
|
||||
Ctrl-r Redo
|
||||
|
||||
J Nächste Zeile an aktuelle anhängen
|
||||
>> Zeile einrücken (indent)
|
||||
<< Zeile ausrücken (unindent)
|
||||
```
|
||||
## Mit Counts & Bewegungen
|
||||
Viele Befehle funktionieren mit einer Anzahl (count) und einer Bewegung:
|
||||
```text
|
||||
3w 3 Wörter vor
|
||||
5j 5 Zeilen runter
|
||||
|
||||
d3w 3 Wörter löschen
|
||||
c$ Bis Zeilenende ändern
|
||||
y0 Bis Zeilenanfang kopieren
|
||||
```
|
||||
## Textobjekte (im Normal- / Visuellen Modus)
|
||||
```text
|
||||
aw A word (inkl. Leerzeichen)
|
||||
iw Inner word
|
||||
as A sentence
|
||||
is Inner sentence
|
||||
ap A paragraph
|
||||
ip Inner paragraph
|
||||
|
||||
a" / i" Text in Anführungszeichen
|
||||
a' / i' Text in einfachen Quotes
|
||||
a) / i) Text in Klammern (usw. für {}, [], <>)
|
||||
|
||||
Beispiele:
|
||||
ci" Inhalt von "..." ändern
|
||||
da( Klammerausdruck inklusive Klammern löschen
|
||||
viw Wort unter Cursor markieren
|
||||
```
|
||||
## Suchen & Ersetzen
|
||||
```text
|
||||
/word Vorwärts nach „word“ suchen
|
||||
?word Rückwärts suchen
|
||||
n Nächster Treffer
|
||||
N Vorheriger Treffer
|
||||
|
||||
* Wort unter Cursor vorwärts suchen
|
||||
# Wort unter Cursor rückwärts suchen
|
||||
|
||||
:%s/alt/neu/g In gesamter Datei ersetzen
|
||||
:%s/alt/neu/gc Mit Bestätigung
|
||||
:.,$s/alt/neu/g Von aktueller Zeile bis Ende
|
||||
:10,20s/alt/neu/g In Zeilen 10–20
|
||||
```
|
||||
## Dateien, Buffers, Splits & Tabs
|
||||
```text
|
||||
:e datei Datei öffnen
|
||||
:w Speichern
|
||||
:w name Unter anderem Namen speichern
|
||||
:q Beenden
|
||||
:q! Beenden ohne Speichern
|
||||
:wq / :x Speichern und beenden
|
||||
:qa Alle Fenster schließen
|
||||
:qa! Alle schließen ohne Speichern
|
||||
|
||||
" Buffer (Dateien im Speicher)
|
||||
:ls Buffer-Liste
|
||||
:buffer n Buffer n öffnen
|
||||
:bnext / :bn Nächster Buffer
|
||||
:bprev / :bp Vorheriger Buffer
|
||||
:bdelete Buffer schließen
|
||||
|
||||
" Splits
|
||||
:split datei Horizontaler Split
|
||||
:vsplit datei Vertikaler Split
|
||||
Ctrl-w s Split horizontal
|
||||
Ctrl-w v Split vertikal
|
||||
Ctrl-w w Zum nächsten Split
|
||||
Ctrl-w h/j/k/l Split wechseln
|
||||
Ctrl-w q Split schließen
|
||||
|
||||
" Tabs
|
||||
:tabnew Neuer Tab
|
||||
:tabclose Tab schließen
|
||||
:tabnext / :tn Nächster Tab
|
||||
:tabprev / :tp Vorheriger Tab
|
||||
```
|
||||
## Visual Mode Aktionen
|
||||
```text
|
||||
v / V / Ctrl-v Auswahl starten
|
||||
y Auswahl kopieren
|
||||
d Auswahl löschen
|
||||
c Auswahl ändern
|
||||
|
||||
> Einrücken
|
||||
< Ausrücken
|
||||
= Auto-Indent (z.B. für Code)
|
||||
|
||||
: Befehl auf Auswahl anwenden
|
||||
(Bereich wird automatisch eingetragen)
|
||||
```
|
||||
## Makros & Wiederholung
|
||||
```text
|
||||
. Letzte Änderung wiederholen
|
||||
|
||||
q<a> Macro in Register a aufzeichnen
|
||||
(z.B. qa)
|
||||
... Aktionen ausführen
|
||||
q Aufzeichnung beenden
|
||||
|
||||
@a Macro a ausführen
|
||||
3@a Macro 3x ausführen
|
||||
@@ Letztes Macro wiederholen
|
||||
```
|
||||
## Register
|
||||
```text
|
||||
"0 Zuletzt kopiertes (y) ohne delete
|
||||
"1–"9 Verlaufsregister
|
||||
"" Default-Register
|
||||
|
||||
"+ System-Clipboard (kopieren/einfügen mit OS)
|
||||
"* Auswahl-Clipboard (unter Linux/X11)
|
||||
|
||||
Beispiele:
|
||||
"ayw Wort in Register a kopieren
|
||||
"ap Inhalt von Register a einfügen
|
||||
"+y In System-Clipboard kopieren
|
||||
"+p Aus System-Clipboard einfügen
|
||||
```
|
||||
## Kommandomodus (Ex-Befehle)
|
||||
```text
|
||||
:!cmd Externen Befehl ausführen
|
||||
:r !cmd Ausgabe von cmd einfügen
|
||||
:r datei Datei unter Cursor-Zeile einfügen
|
||||
|
||||
:set nu Zeilennummern an
|
||||
:set nonu Zeilennummern aus
|
||||
:set relativenumber Relative Nummern
|
||||
:set tabstop=4 shiftwidth=4 expandtab
|
||||
```
|
||||
## Einfache .vimrc-Beispiele
|
||||
```vim
|
||||
" Zeilennummern
|
||||
set number
|
||||
set relativenumber
|
||||
|
||||
" Einrückung
|
||||
set tabstop=4
|
||||
set shiftwidth=4
|
||||
set expandtab
|
||||
set smartindent
|
||||
|
||||
" Suche
|
||||
set ignorecase
|
||||
set smartcase
|
||||
set hlsearch
|
||||
set incsearch
|
||||
|
||||
" Maus
|
||||
set mouse=a
|
||||
```
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user