Back openDesk Edu for a sovereign, open-source education — every vote counts.
Vote nowSave products you love by clicking the heart icon.
Essential reference for GNU Nano — keybindings, configuration, search/replace, and common usage for quick text editing.
Vim (Vi IMproved) ist ein modaler Texteditor. Jede Aktion erfolgt über einen Tastendruck – keine Menüs, keine Maus. Beherrschen Sie die Modi und Sie editieren in Gedankengeschwindigkeit.
# Start Vim
vim file.txt # open or create file
vim # empty buffer
vim -R file.txt # read-only mode
view file.txt # alias for vim -R
| Modus | Eintritt | Beenden / Wechsel | Zweck |
|---|---|---|---|
| Normal | Esc (kehrt immer hierher zurück) | — | Navigation, Befehle, Operatoren |
| Insert | i, a, o, I, A, O | Esc | Texteingabe |
| Visual | v, V, Ctrl+v | Esc | Textauswahl |
| Command-line | : | Enter oder Esc | Ex-Befehle (Speichern, Beenden, Suchen) |
| Replace | R | Esc | Zeichen überschreiben |
| Select | gh (nach g) | Esc | Wie Visual, aber Tippen ersetzt die Auswahl |
h j k l # left, down, up, right
0 # beginning of line
^ # first non-blank character
$ # end of line
gg # first line of file
G # last line of file
5gg or 5G # go to line 5
w # next word start
b # previous word start
e # next word end
ge # previous word end
W # next WORD (whitespace-delimited)
B # previous WORD
E # end of WORD
) # next sentence
( # previous sentence
} # next paragraph (blank-line separated)
{ # previous paragraph
% # matching bracket/paren/brace
Ctrl+f # page down
Ctrl+b # page up
Ctrl+d # half page down
Ctrl+u # half page up
Ctrl+e # scroll down one line
Ctrl+y # scroll up one line
H # top of screen
M # middle of screen
L # bottom of screen
zt # scroll current line to top
zz # scroll current line to center
zb # scroll current line to bottom
/pattern # search forward
?pattern # search backward
n # repeat search forward
N # repeat search backward
* # search forward for word under cursor
# # search backward for word under cursor
:noh # clear search highlight
i # insert before cursor
a # insert after cursor
I # insert at beginning of line (before first non-blank)
A # insert at end of line
o # open line below
O # open line above
s # delete character and enter insert
S # delete entire line and enter insert
x # delete character under cursor
X # delete character before cursor
dd # delete entire line
dw # delete to next word start
d$ or D # delete to end of line
d0 # delete to beginning of line
dgg # delete to start of file
dG # delete to end of file
cc or S # change (delete + insert) entire line
cw # change to next word start
c$ or C # change to end of line
yy or Y # yank (copy) entire line
yw # yank word
y$ # yank to end of line
ygg # yank to start of file
yG # yank to end of file
p # paste after cursor
P # paste before cursor
. # repeat last edit command
u # undo
Ctrl+r # redo
>> # indent current line
<< # unindent current line
5>> # indent 5 lines
== # auto-indent current line
gg=G # auto-indent entire file
# Basic substitute
:s/old/new/ # replace first occurrence on current line
:s/old/new/g # replace all on current line
:s/old/new/gc # replace all with confirmation
# Range substitute
:%s/old/new/g # replace all in entire file
:5,20s/old/new/g # replace in lines 5–20
:'<,'>s/old/new/g # replace in visual selection
# Advanced patterns
:%s/\t/ /g # replace tabs with 2 spaces
:%s/^\s\+// # remove leading whitespace
:%s/\s\+$// # remove trailing whitespace
:%s/foo\|bar/baz/g # replace foo or bar with baz
m{a-z} # set local mark (a-z)
m{A-Z} # set global mark (file-wide, uppercase)
'{a-z} # jump to local mark (line start)
'{A-Z} # jump to global mark
'' # jump back to last jump position
`{a-z} # jump to exact mark position (column)
:marks # list all marks
:delmarks a b # delete marks a and b
"a # use register 'a' for next delete/yank
"ayy # yank line into register a
"ap # paste from register a
"0p # paste from last yank register
"+p # paste from system clipboard
"+y # yank into system clipboard
"*p # paste from primary selection (X11)
:registers # show all registers
q{a-z} # start recording macro into register a
q # stop recording
@a # replay macro a
@@ # replay last used macro
5@a # replay macro a five times
:reg a # view contents of macro register a
# Record a macro to wrap a word in quotes
qa # start recording into register a
i"<Esc> # insert opening quote, return to normal
ea # move to end of word
a"<Esc> # insert closing quote
q # stop recording
# Apply to every word on a line
# Position cursor on first word, then:
qa i"<Esc> ea a"<Esc> q # (this is the macro above)
100@a # replay 100 times (stops at end of line)
v # character-wise visual mode
V # line-wise visual mode
Ctrl+v # block visual mode
o # go to other end of selection
gv # re-select last visual selection
# After selecting text in visual mode:
d # delete selection
c # change selection
y # yank (copy) selection
> # indent selection
< # unindent selection
~ # toggle case of selection
u # lowercase selection
U # uppercase selection
:sort # sort selected lines
:!fmt # reformat paragraph via fmt
Ctrl+v # Block-Visual-Modus aktivieren
I # Am linken Rand des Blocks einfügen (gilt für alle Zeilen)
A # Am rechten Rand des Blocks anhängen
$ # Block bis zum Ende jeder Zeile erweitern
# Mehrere Zeilen mit // auskommentieren
1. Zur ersten Zeile bewegen
2. Ctrl+v, um den Block-Modus zu aktivieren
3. jj, um 3 Zeilen nach unten auszuwählen
4. I, um am linken Rand des Blocks einzufügen
5. // tippen und dann Esc drücken
6. Das // wird in allen ausgewählten Zeilen eingefügt
:ls oder :buffers # Alle Buffer auflisten
:bnext oder :bn # Nächster Buffer
:bprev oder :bp # Vorheriger Buffer
:bfirst # Erster Buffer
:blast # Letzter Buffer
:b 3 # Zu Buffer 3 springen
:b file.txt # Zu Buffer per Name springen (Teilübereinstimmung)
:bd # Aktuellen Buffer schließen
:bd 3 # Buffer 3 schließen
:bw # Buffer löschen (schließen + entfernen)
:e file2.txt # Datei in neuem Buffer öffnen
:split file2.txt # Datei in horizontalem Split öffnen
:vsp file2.txt # Datei in vertikalem Split öffnen
:split oder :sp # Horizontaler Split
:vsplit oder :vsp # Vertikaler Split
Ctrl+w s # Horizontaler Split
Ctrl+w v # Vertikaler Split
Ctrl+w h # Zum linken Fenster bewegen
Ctrl+w j # Zum unteren Fenster bewegen
Ctrl+w k # Zum oberen Fenster bewegen
Ctrl+w l # Zum rechten Fenster bewegen
Ctrl+w w # Durch Fenster zyklisch wechseln
Ctrl+w W # Rückwärts zyklisch wechseln
Ctrl+w = # Fenstergrößen angleichen
Ctrl+w _ # Aktuelles Fenster maximieren (horizontal)
Ctrl+w | # Aktuelles Fenster maximieren (vertikal)
Ctrl+w q # Aktuelles Fenster schließen
Ctrl+w o # Alle anderen Fenster schließen
:tabnew # Neuer Tab
:tabedit file.txt # Datei in neuem Tab öffnen
:tabclose oder :tc # Aktuellen Tab schließen
:tabnext oder :tn # Nächster Tab
:tabprev oder :tp # Vorheriger Tab
:tabfirst oder :tf # Erster Tab
:tablast oder :tl # Letzter Tab
:tabs # Alle Tabs auflisten
gt # Nächster Tab
gT # Vorheriger Tab
5gt # Zu Tab 5 springen
:w # Speichern
:w! # Erzwingen des Speicherns (Berechtigungen überschreiben)
:w file.txt # Als neue Datei speichern
:q # Beenden
:q! # Beenden ohne zu speichern
:wq oder ZZ # Speichern und Beenden
:x # Speichern und Beenden (nur wenn geändert)
:e! # Datei von der Festplatte neu laden
:e file.txt # Eine andere Datei öffnen
:r file.txt # Dateiinhalt unter dem Cursor einfügen
:r !command # Befehlsausgabe unter dem Cursor einfügen
:saveas file.txt # Unter neuem Namen speichern
# ~/.vimrc — essenzielle Einstellungen
" Allgemein
set nocompatible # Erforderlich für Vim-Funktionen
set encoding=utf-8
set fileencoding=utf-8
set number # Zeilennummern anzeigen
set relativenumber # Relative Zeilennummern für einfachere Sprünge
set scrolloff=8 # 8 Zeilen Kontext beim Scrollen beibehalten
set sidescrolloff=8
set signcolumn=yes # Sign-Spalte immer anzeigen
set cursorline # Aktuelle Zeile hervorheben
set colorcolumn=80 # Spalte 80 hervorheben
set wrap # Lange Zeilen umbrechen
set linebreak # Umbruch an Wortgrenzen
set showbreak=↪ # Umbruch-Indikator anzeigen
set breakindent # Umgebrochene Zeilen einrücken
" Einrückung
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab # Leerzeichen statt Tabs verwenden
set smartindent
set autoindent
filetype indent on # Einrückungsregeln pro Dateityp laden
" Suche
set hlsearch # Suchergebnisse hervorheben
set incsearch # inkrementelle Suche
set ignorecase
set smartcase # case-sensitive, wenn Großbuchstaben vorhanden sind
" Performance
set lazyredraw " kein Redraw während Makros
set updatetime=300 " schnellere Update-Zeit
" Persistent Undo
set undofile
set undodir=~/.vim/undodir
" Key Mappings
let mapleader=" "
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
Text objects are one of Vim's most powerful features. They allow operators (d, c, y, v) to act on grammatical units like words, sentences, and blocks.
# Inner vs Around
# i = inner (nur der Inhalt, ohne Trennzeichen)
# a = around (Inhalt + Trennzeichen)
# Wort
diw # inneres Wort löschen (ohne umliegende Leerzeichen)
daw # Wort inklusive Umgebung löschen (inklusive nachfolgender Leerzeichen)
ciw # inneres Wort ändern (löschen + Wechsel in Insert-Modus)
yiw # inneres Wort yanken (kopieren)
# Anführungszeichen
di" # Text innerhalb doppelter Anführungszeichen löschen (nicht die Anführungszeichen selbst)
da" # Text innerhalb der Anführungszeichen + die Anführungszeichen selbst löschen
ci' # Text innerhalb einfacher Anführungszeichen ändern
ya` # Text innerhalb von Backticks yanken
# Klammern, Brackets, Braces
di( or dib # innerhalb von runden Klammern löschen
da( or dab # innerhalb von runden Klammern + Klammern selbst löschen
di{ or diB # innerhalb von geschweiften Klammern löschen (B = Block)
ci[ # innerhalb von eckigen Klammern ändern
da> # innerhalb von spitzen Klammern + Klammern selbst löschen
# Tags (HTML/XML)
dit # innerhalb von HTML/XML-Tags löschen
dat # Tags inklusive Umgebung löschen (Inhalt + öffnende/schließende Tags)
cit # innerhalb von Tags ändern
# Indent-Objekte (Python, YAML, etc.)
dii # inneren Einzug löschen (aktueller Einzug-Block)
dai # Einzug inklusive Umgebung löschen (inklusive Leerzeile darüber)
cii # inneren Einzug-Block ändern
# Absatz-Objekte
dip # inneren Absatz löschen (Text zwischen Leerzeilen)
dap # Absatz inklusive Umgebung löschen (inklusive nachfolgender Leerzeile)
# Externe Befehle ausführen
:!ls -la # ls ausführen und Ausgabe anzeigen
:!make # make im aktuellen Verzeichnis ausführen
!! # aktuelle Zeile durch die Ausgabe eines Befehls ersetzen
!!ls # aktuelle Zeile durch ls-Ausgabe ersetzen
# Befehlsausgabe in den Buffer lesen
:r !date # aktuelles Datum unter dem Cursor einfügen
:r !curl -s https://api.ipify.org # externe Daten einfügen
# Sortieren und Filtern
:%sort # gesamte Datei sortieren
:sort u # sortieren und Duplikate entfernen
:5,20sort # Zeilen 5-20 sortieren
:'<,'>sort # visuelle Auswahl sortieren
:%!sort -rn # gesamte Datei durch sort leiten (numerisch, umgekehrt)
:'<,'>!jq . # visuelle Auswahl durch jq leiten
# Globaler Befehl (Ausführung auf passenden Zeilen)
:g/foo/d # alle Zeilen löschen, die "foo" enthalten
:g/^$/d # alle Leerzeilen löschen
:g/foo/s/bar/baz/g # bar durch baz ersetzen, aber nur in Zeilen, die foo enthalten
:v/foo/d # Zeilen löschen, die "foo" NICHT enthalten (vglobal)
# Substitutions-Flags
:%s/foo/bar/g # alle Vorkommen ersetzen
:%s/foo/bar/gc # alle mit Bestätigung ersetzen
:%s/foo/bar/gI # case-sensitive (überschreibt ignorecase)
:%s/foo/bar/gn # Anzahl der Ersetzungen melden, ohne zu ändern
:%s/foo/\=submatch(0) . " suffix"/g # Ersetzung mittels Ausdruck
# Letzte Substitution wiederholen
& # letzte :s in der aktuellen Zeile wiederholen
:g/pattern/s//new/g # letztes Suchmuster verwenden
# Weitere nützliche Befehle
:normal! gg=G # gesamte Datei via Normal-Mode-Befehl auto-indentieren
:put =getline(1,5) # Zeilen 1-5 unter dem Cursor einfügen
:delete # aktuelle Zeile löschen
:move 0 # aktuelle Zeile an den Anfang der Datei verschieben
:copy $ # aktuelle Zeile an das Ende der Datei kopieren
# Fold-Methoden
:set foldmethod=indent # Falten basierend auf Einzug (Standard, funktioniert gut für die meisten Sprachen)
:set foldmethod=syntax # Falten basierend auf Syntax-Regeln (sprachabhängig)
:set foldmethod=manual # nur dort falten, wo Faltungen manuell erstellt werden
:set foldmethod=marker # an Markern wie {{{ und }}} falten
# Manuelle Erstellung von Faltungen
zf3j # Faltung erstellen: Cursor + 3 Zeilen abwärts
zfa} # bis zur entsprechenden Klammer falten
v...zf # visuelle Auswahl falten
# Navigation in Faltungen
za # Faltung unter Cursor umschalten (toggle)
zc # Faltung schließen
zo # Faltung öffnen
zM # alle Faltungen schließen
zR # alle Faltungen öffnen
zj # zum Anfang der nächsten Faltung springen
zk # zum Ende der vorherigen Faltung springen
[z # zum Anfang der aktuellen Faltung springen
]z # zum Ende der aktuellen Faltung springen
# Persistente Faltungen (über Sitzungen hinweg speichern)
:set foldmethod=manual
:mkview # Faltungen speichern
:loadview # Faltungen wiederherstellen
# In .vimrc hinzufügen:
" au BufWinLeave ?* mkview
" au BufWinEnter ?* silent loadview
:set hlsearch # alle Suchtreffer hervorheben
:set nohlsearch # Hervorhebung deaktivieren
:noh # Hervorhebung für die aktuelle Suche temporär löschen
:set incsearch # Treffer während des Tippens anzeigen (inkrementelle Suche)
:set noincsearch # inkrementelle Suche deaktivieren
:set ignorecase # Groß-/Kleinschreibung ignorieren
:set smartcase # Override: Case-sensitive, wenn die Suche Großbuchstaben enthält
:set gdefault # das g-Flag in :s standardmäßig setzen (betrifft alle Treffer in der Zeile)
:set wrapscan # Suche springt am Dateiende wieder zum Anfang (Standard)
:set magic # Standard: die meisten Metazeichen haben eine spezielle Bedeutung
:set nomagic # nur ^ und $ sind speziell
# Very magic mode (\v) — die meisten Regex-Zeichen müssen nicht escaped werden
/\vfoo(bar|baz) # match foo(bar oder foo(baz) ohne Escaping der Klammern
/\v\d{3}-\d{4} # match Telefonnummer-Muster
/\v^\s*\w+ # match Zeilen, die mit Whitespace + Wort beginnen
# Praktische Suchmuster
/\v<(foo|bar)> # Ganzwort-Suche nach foo oder bar
/\v^[A-Z] # Zeilen, die mit einem Großbuchstaben beginnen
/\v\s+$ # trailing whitespace (Leerzeichen am Zeilenende)
/\v^$\n^$ # aufeinanderfolgende Leerzeilen
# Sonderzeichen ersetzen
:%s/\n/ /g # Zeilenumbrüche durch Leerzeichen ersetzen (Zeilen zusammenfügen)
:%s/\r//g # Carriage Returns entfernen (Windows-Zeilenenden)
# Ausdrucksersetzung (\=)
# Zeilen nummerieren
:%s/^/\=line('.') . '. ' # Zeilennummern voranstellen
# Zahlen inkrementieren
:let i=1 | g/\d\+/s//\=i/ | let i+=1
# Submatch-Gruppen
:%s/\(\w\+\) (\(\w\+\))/\2: \1/g # tausche "Vorname (Nachname)" zu "Nachname: Vorname"
:%s/\v(\w+) (\w+)/\2 \1/g # dasselbe mit very magic
# Range-Tricks
:.s/foo/bar/g # nur aktuelle Zeile
:$s/foo/bar/g # nur letzte Zeile
:%s/foo/bar/g # gesamte Datei
:'<,'>s/foo/bar/g # visuelle Auswahl
:g/pattern/s/foo/bar/g # nur in Zeilen, die dem Muster entsprechen
:.,+5s/foo/bar/g # aktuelle Zeile + 5 Zeilen darunter
# Das e-Flag (unterdrückt "pattern not found"-Fehler)
:%s/old_pattern/new/gc e
# Ersetzen durch Inhalt eines Registers
:%s/pattern/\=@a/g # ersetzen durch Inhalt von Register a
# Abkürzungen im Insert-Mode (expandieren beim Tippen)
:iabbrev @@ tobias@example.com
:iabbrev sig -- Tobias\n
:iabbrev dtdate \=strftime('%Y-%m-%d')
# Abkürzungen in der Befehlszeile
:cabbrev W w
:cabbrev Q q
:cabbrev Wq wq
:cabbrev Qa qa
# Abkürzungen anzeigen
:abbrev
# Abkürzungen löschen
:iunabbrev @@
:cunabbrev W
# In .vimrc für häufige Korrekturen verwenden
:iabbrev teh the
:iabbrev seperate separate
:iabbrev lenght length
# Run command and insert output
:r !date
:r !ls -la
:r !curl -s https://httpbin.org/ip
:r !grep -n "pattern" %
# Pipe buffer through external command
:%!python3 -m json.tool # format JSON in entire file
:'<,'>!sort -u # sort and dedupe selection
:'<,'>!column -t -s ',' # format CSV as table
:%!tr 'a-z' 'A-Z' # uppercase entire file
# Visual selection + command
" Select text in visual mode, then:
:!fmt -w 80 # reformat to 80 columns
:!python3 -c "import sys; print(sys.stdin.read().title())"
# Async commands
:!make & # run make in background
:terminal # open terminal in Vim buffer
# Save and restore sessions
:mksession # save session to Session.vim
:mksession! # overwrite existing Session.vim
:mksession myproject.vim # save to named file
# Restore sessions
:source Session.vim # restore session
vim -S # restore default session
vim -S myproject.vim # restore named session
# Session options (control what is saved)
:set sessionoptions=buffers,winsize,resize,winpos,curdir,folds
# Practical workflow
" In .vimrc:
" autocmd VimLeave * mksession! ~/.vim/last_session.vim
" Then restore with: vim -S ~/.vim/last_session.vim
# Start diff mode
vimdiff file1.txt file2.txt # open two files in diff mode
vim -d file1.txt file2.txt # same as above
# Inside Vim
:diffthis # add current window to diff
:diffsplit otherfile.txt # split and diff with another file
:diffpatch changes.patch # diff current file against a patch
# Navigation in diff mode
]c # jump to next diff hunk
[c # jump to previous diff hunk
do # obtain (pull change from other file)
dp # put (push change to other file)
:diffupdate # re-scan for diffs after edits
:diffget # synonym for do
:diffput # synonym for dp
# Turn off diff for current window
:diffoff
# Open a terminal
:terminal # open terminal in horizontal split
:terminal bash # open specific shell
:10terminal # open with 10-line window
# Navigation in terminal mode
Ctrl-\ Ctrl-N # exit terminal mode (go to normal mode)
Ctrl-w N # same as above (exit terminal mode)
# Interact with terminal from normal mode
i # enter terminal insert mode
Ctrl-w "w # move to next window while in terminal mode
# Send commands to terminal
:term send ls -la\|head # send command to terminal
# Useful patterns
:terminal make # run build in terminal
:terminal cargo test # run tests in terminal
:terminal git log --oneline # run git in terminal
# Enable spell checking
:set spell # enable for current buffer
:set nospell # disable spell checking
:set spelllang=en_us # set language (American English)
:set spelllang=de # German
:set spelllang=en_us,de # multiple languages
# Navigate spelling errors
]s # next spelling error
[s # previous spelling error
z= # show suggestions for word under cursor
1z= # use first suggestion
zg # add word under cursor to good word list
zw # add word under cursor to bad word list
zug # undo last zg/zw
# View spelling suggestions
:spellgood word # add word to dictionary
:spellbad word # mark word as incorrect
:spellsuggest # show suggestions for current word
# --- vim-plug (minimal, fast plugin manager) ---
# Installation:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# In .vimrc:
call plug#begin('~/.vim/plugged')
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } } " fuzzy finder
Plug 'junegunn/fzf.vim' " fzf integration
Plug 'preservim/nerdtree' " file explorer
Plug 'neoclide/coc.nvim', {'branch': 'release'} " LSP autocomplete
Plug 'tpope/vim-fugitive' " git integration
Plug 'tpope/vim-commentary' " toggle comments
Plug 'vim-airline/vim-airline' " status bar
call plug#end()
# Commands:
:PlugInstall # install all plugins
:PlugUpdate # update plugins
:PlugClean # remove unused plugins
# --- lazy.nvim (modern Lua-based plugin manager) ---
# Requires Neovim 0.8+
# In init.lua:
-- local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
-- vim.opt.rtp:prepend(lazypath)
# Essential plugin commands (vim-plug)
# FZF (fuzzy finder)
:Files " fuzzy find files
:Rg pattern " ripgrep search
:Buffers " fuzzy find open buffers
:Lines " fuzzy find lines in buffer
:Commits " fuzzy find git commits
# NERDTree
:NERDTree " toggle file explorer
:NERDTreeToggle " open/close NERDTree
:NERDTreeFind " find current file in tree
# Fugitive (git)
:Git " open git status
:Gdiffsplit " git diff split
:Gread " checkout file from git
:Gwrite " stage file
:Gblame " git blame
# Commentary
gcc " toggle comment on current line
gc " toggle comment in visual mode
# Define autocommands (use augroup to avoid duplication)
augroup my_autocommands
autocmd!
" Auto-remove trailing whitespace on save
autocmd BufWritePre * %s/\s\+$//e
" Return to last cursor position when opening a file
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal! g`\"" |
\ endif
" Set filetype-specific settings
autocmd FileType python setlocal expandtab shiftwidth=4 tabstop=4
autocmd FileType yaml setlocal expandtab shiftwidth=2 tabstop=2
autocmd FileType go setlocal noexpandtab tabstop=4 shiftwidth=4
" Auto-format on save (where applicable)
autocmd BufWritePre *.go FormatWrite
" Highlight column 80 for certain file types
autocmd FileType python,rust setlocal colorcolumn=80
" Set makeprg for different languages
autocmd FileType python setlocal makeprg=python3\ -m\ py_compile\ %
autocmd FileType go setlocal makeprg=go\ build\ .
augroup END
# Letzten Befehlszeilen-Befehl wiederholen
@: # letzten :command wiederholen
@@ # letztes Macro wiederholen
# Macro-Register
"ap # Macro aus Register a ausführen
"b@ # Macro aus Register b ausführen
# Rekursive Macros (ein Macro, das sich selbst aufruft)
# Beispiel: Alle Vorkommen von "foo" durch "bar" ersetzen
qa # Aufnahme in Register a starten
/foo<CR> # nach foo suchen
cwbar<Esc> # Wort zu bar ändern
@a # Macro a wiederholen (rekursiv!)
q # Aufnahme beenden
100@a # 100-mal wiederholen (stoppt, wenn die Suche fehlschlägt)
# An ein bestehendes Macro anhängen
qa # Aufnahme in Register a starten (überschreibt)
q # Aufnahme beenden (leer)
qaA # an Register a ANHÄNGEN
<edits>
q # Aufnahme beenden
# Ein Macro als Text bearbeiten
"ap # Makro-Inhalte in den Buffer einfügen " den eingefügten Text bearbeiten dd # Zeile in das Standard-Register löschen "a # in Register a yanken (überschreibt mit Änderungen)
### Quickfix List
```bash
# Build-System Integration
:make " make ausführen (oder konfiguriertes makeprg)
:make clean " make clean ausführen
:cn " nächster Fehler
:cp " vorheriger Fehler
:cfirst " erster Fehler
:clast " letzter Fehler
:cc 3 " zu Fehler Nummer 3 springen
:copen " Quickfix-Fenster öffnen
:cclose " Quickfix-Fenster schließen
:cw " Quickfix öffnen, falls Fehler vorhanden sind
# Grep Integration
:grep "pattern" *.py " grep in Python-Dateien
:grep -R "pattern" src/ " rekursives grep
:Rg "pattern" " ripgrep (falls installiert, via fzf)
# Vimgrep (Vims integriertes grep)
:vimgrep /pattern/ *.py " nach Pattern in Python-Dateien suchen
:vimgrep /pattern/j **/*.py " Unterverzeichnisse durchsuchen (j = nicht zum ersten Treffer springen)
:cn " nächster Treffer
:copen " alle Treffer anzeigen
# Location list (fensterlokales Quickfix)
:lopen " Location List öffnen
:lclose " Location List schließen
:lnext " nächste Position
:lprev " vorherige Position
:ll " zur aktuellen Position springen
# Praktischer Quickfix-Workflow
" Kompilieren → Fehler beheben → :cn → beheben → :cn → beheben → :ccl
# Wenn Sie in Vim feststecken, drücken Sie zuerst Esc, dann:
:q! # beenden ohne zu speichern
vim -r file.txt # aus Swap-Datei wiederherstellen
# Nach der Wiederherstellung:
# :write zum Speichern, dann die Swap-Datei löschen