~/dev $

vim cheatsheet

— modal text editor reference
Normal Insert Visual Command Motions Sonstiges

Modi wechseln

Normal Mode (zurück)
Esc
Insert vor Cursor
i
Insert nach Cursor
a
Insert Zeilenanfang
I
Insert Zeilenende
A
Neue Zeile darunter
o
Neue Zeile darüber
O
Visual Mode (zeichen)
v
Visual Mode (zeilen)
V
Visual Block Mode
Ctrl+v
Command Mode
:
Suche (vorwärts)
/
Suche (rückwärts)
?

Bewegungen (Motions)

Links / Unten / Oben / Rechts
hjkl
Nächstes Wort (Anfang)
w
Vorheriges Wort (Anfang)
b
Nächstes Wort (Ende)
e
Zeilenanfang (nicht-leer)
^
Zeilenanfang (absolut)
0
Zeilenende
$
Erste Zeile
gg
Letzte Zeile
G
Zeile N
:N NG
Seite hoch / runter
Ctrl+u Ctrl+d
Zum passenden Klammer
%
Zeile zentrieren
zz

Bearbeiten (Normal Mode)

Zeichen löschen
x
Zeile löschen
dd
N Zeilen löschen
Ndd
Bis Zeilenende löschen
D
Wort löschen
dw
Zeile kopieren (yank)
yy
Wort kopieren
yw
Einfügen nach Cursor
p
Einfügen vor Cursor
P
Zeile wechseln (change)
cc
Bis Zeilenende ändern
C
Zeichen ersetzen
r
Groß/Klein umschalten
~
Zeilen verbinden
J
Einrücken (in/out)
>> <<
Rückgängig / Wiederholen
u Ctrl+r
Letzten Befehl wiederholen
.

Text Objects & Operatoren

Kombination: Operator + [i/a] + Objekt
Operatoren
dcyv
Inhalt in " " löschen
di"
Inhalt + " " löschen
da"
Inhalt in ( ) ändern
ci(
Inhalt in { } kopieren
yi{
Inhalt in [ ] löschen
di[
Ganzen Paragraphen
dap
Ganzes Wort ändern
ciw
Tag-Inhalt ändern
cit

Visual Mode

Zeichen markieren
v + Bewegung
Zeilen markieren
V + Bewegung
Block markieren
Ctrl+v
Auswahl löschen
d
Auswahl kopieren
y
Auswahl ersetzen
c
Einrücken
> <
Groß-/Kleinschreibung
U u
Kommentar (Plugin)
gc
Suchen in Auswahl
:s/alt/neu/g
Alles auswählen
ggVG

Suchen & Ersetzen

Vorwärts suchen
/muster
Rückwärts suchen
?muster
Nächsten Treffer
n
Vorherigen Treffer
N
Wort unter Cursor suchen
*
Highlight löschen
:noh
Ersetzen (aktuelle Zeile)
:s/alt/neu/g
Ersetzen (ganze Datei)
:%s/alt/neu/g
Ersetzen mit Bestätigung
:%s/alt/neu/gc
Case-insensitiv
:%s/alt/neu/gi

Dateien & Buffers

Speichern
:w
Speichern als
:w datei.txt
Beenden
:q
Speichern & Beenden
:wq ZZ
Beenden ohne speichern
:q!
Datei öffnen
:e datei.txt
Datei-Browser
:Ex
Buffers anzeigen
:ls
Buffer wechseln
:b N
Nächster Buffer
:bn
Buffer schließen
:bd

Splits & Tabs

Horizontal splitten
:sp Ctrl+w s
Vertikal splitten
:vsp Ctrl+w v
Zwischen Splits wechseln
Ctrl+w+hjkl
Split schließen
Ctrl+w q
Split maximieren
Ctrl+w _ Ctrl+w |
Splits gleichmäßig
Ctrl+w =
Neuer Tab
:tabnew
Nächster Tab
gt
Vorheriger Tab
gT
Tab schließen
:tabc

Marks & Sprünge

Mark setzen
ma–z
Zu Mark springen
`a
Zu Zeile der Mark
'a
Alle Marks anzeigen
:marks
Zurück in Sprungliste
Ctrl+o
Vor in Sprungliste
Ctrl+i
Sprünge anzeigen
:jumps
Letzter Änderungsort
g;
Zuletzt bearbeitet
gi

Makros & Sonstiges

Makro aufnehmen
qa–z
Aufnahme stoppen
q
Makro ausführen
@a
Letztes Makro wiederholen
@@
Makro N-mal ausführen
5@a
Autocompletion (Insert)
Ctrl+n Ctrl+p
Zeile kopieren (System)
"+yy
Aus System einfügen
"+p
Shell-Befehl ausführen
:!cmd
Dateityp setzen
:set ft=python
Zeilennummern toggle
:set nu!
Hilfe
:help thema

Vim — allgemeine Grundlagen

Philosophie & Konzept

Vim ist ein modaler Editor — das bedeutet, Tasten haben je nach aktivem Modus unterschiedliche Bedeutungen. Während andere Editoren immer im "Schreib-Modus" sind, trennt Vim strikt zwischen Navigieren, Bearbeiten und Befehlen.

Der Kerngedanke: Bearbeitungen werden wie eine Sprache komponiert — Verb + Bewegung. Zum Beispiel: d (delete) + w (word) = Wort löschen. Das macht Vim nach der Lernkurve extrem effizient.

Die wichtigsten Modi

Normal Navigation, Befehle, Operatoren — Standard-Modus
Insert Text eingeben wie in einem normalen Editor
Visual Text markieren (zeichen-, zeilen- oder blockweise)
Command Datei-Operationen, Suchen/Ersetzen, Einstellungen

Konfiguration & Dateien

Vim config
~/.vimrc
Plugins, Farben, etc.
~/.vim/
Vim-Tutor (interaktiv lernen)
$ vimtutor

Nützliche Einstiegs-Settings (.vimrc)

set number " Zeilennummern
set relativenumber " Relative Nummern
set tabstop=4 " Tab-Breite
set expandtab " Tabs → Spaces
set hlsearch " Suche highlighten
set incsearch " Live-Suche
set clipboard=unnamed " System-Clipboard

Makros — wie sie funktionieren

Ein Makro ist eine aufgezeichnete Folge von Tastenanschlägen, die beliebig oft wiedergegeben werden kann. Vim speichert Makros in Registern (a–z). Damit lassen sich repetitive Bearbeitungsschritte auf viele Zeilen in Sekunden anwenden — ohne Scripting.

Ablauf

1. qa — Aufnahme starten, Register a wählen
2. Beliebige Vim-Befehle ausführen (Normal, Insert, Command …)
3. q — Aufnahme stoppen
4. @a — Makro einmal ausführen  /  100@a — 100× ausführen

Tipp: Makro mit j am Ende der Aufnahme beenden — so kann 100@a die nächsten 100 Zeilen automatisch verarbeiten.

Beispiel — Zeilennummern voranstellen

Ausgangslage: Liste ohne Nummern

foo.txt
apple
banana
cherry

Makro aufnehmen (Cursor auf Zeile 1):

qa — Start Register a  |  I — Insert am Anfang  |  1. — Text tippen  |  Esc — Normal Mode  |  j — nächste Zeile  |  q — Stop

Dann 2@a — Ergebnis:

1. apple
2. banana
3. cherry

Neovim vs. Vim — die wichtigsten Unterschiede

Konfiguration

Vim config
~/.vimrc
VimScript (.vim)
Neovim config
~/.config/nvim/init.lua
Lua (empfohlen) oder VimScript

Neovim unterstützt beide Sprachen. Neue Setups nutzen fast ausschließlich Lua — schneller, mächtiger, besser lesbar.

Features die Neovim hinzufügt

· LSP built-in — Language Server Protocol nativ, kein Plugin nötig
· Treesitter — modernes, schnelles Syntax-Highlighting
· Lua API — vollständige Skript-API in Lua
· Async — asynchrone Jobs & Callbacks
· Floating Windows — UI-Popups für Plugins
· Plugin-Ökosystem — lazy.nvim, telescope, nvim-cmp …
· Terminal integriert:term mit besserer Kontrolle

Kompatibilität

Fast alle Vim-Shortcuts und Befehle funktionieren in Neovim identisch. Dieses gesamte Cheatsheet gilt für beide — mit Ausnahme von Lua-spezifischen Configs.

Neovim starten
$ nvim datei.txt
Health-Check
:checkhealth
Version prüfen
:version

Lua & VimScript — Konfiguration & Scripting

VimScript (.vimrc / *.vim)

Die klassische Skriptsprache von Vim. Wird in ~/.vimrc geschrieben und läuft in beiden Editoren.

" Kommentar
set number
let g:mapleader = " "
nnoremap <leader>w :w<CR>
vnoremap <leader>y "+y
" Funktion definieren
function! MeineFunktion()
  echo "Hallo Vim!"
endfunction
call MeineFunktion()
Key-Mapping Präfixe:
nnoremap Normal (nicht-rekursiv)
inoremap Insert
vnoremap Visual
noremap Alle Modi

Lua (Neovim) — init.lua

Lua ist schneller, moderner und besser lesbar als VimScript. Neovim bietet eine vollständige Lua-API über das vim-Objekt.

-- Kommentar
vim.opt.number = true
vim.opt.tabstop = 4
vim.g.mapleader = " "
-- Key-Mapping
vim.keymap.set("n", "<leader>w", "<cmd>w<CR>")
-- Funktion
local function hallo()
  vim.notify("Hallo Neovim!")
end
-- Plugin laden (lazy.nvim)
require("lazy").setup({ ... })
Wichtige vim.* Objekte
vim.optOptionen setzen vim.gGlobale Variablen vim.fnVim-Funktionen vim.apiNeovim API vim.cmdEx-Befehl ausführen vim.keymapMappings