Skip to content

Instantly share code, notes, and snippets.

@mikehaertl
Created August 5, 2015 12:08
Show Gist options
  • Save mikehaertl/82b801e332221f920316 to your computer and use it in GitHub Desktop.
Save mikehaertl/82b801e332221f920316 to your computer and use it in GitHub Desktop.
Vim Tipps

Vim

Basics

Hilfe

  • :help: Hilfe aufrufen
  • :help thema: Hilfe zu Thema/Befehl aufrufen
  • <ctrl>-5: Zu verlinktem Thema springen (statt <ctrl>-])
  • <ctrl>-t: Zurückspringen
  • :h ctrl-r: Hilfe zu Shortcut <ctrl>-r anzeigen
  • :h i_ctrl-r: Hilfe zu Shortcut <ctrl>-r im Insertmodus anzeigen
  • :h c_ctrl-r: Hilfe zu Shortcut <ctrl>-r im Commandmodus (also :...) anzeigen
  • :h index: Alle Shortcuts anzeigen

Navigation

  • j: Ab
  • k: Auf
  • h: Links
  • l: Rechts
  • i: Einfügemodus
  • R: Replace-Modus (überschreibt bestehende Zeichen)
  • <Esc>: Einfügemodus beenden
  • <ctrl>-n: Autovervollständigung im Einfügemodus

Scrollen

  • <ctrl>-e: Abwärts
  • <ctrl>-y: Aufwärts

Macros / History

  • q[a-z]: Aufnahme für Macro a-z beginnen
  • q: Aufnahme beenden
  • @[a-z]: Macro a-z abspielen
  • q:: Commandline-Window mit Befehlshistorie anzeigen (<ctrl>-F falls man in der Commandline ist)

Windows

Ein window ist ein rechteckiger, abgetrennter Bereich in vim. Der Arbeitsbereich kann in mehrere Windows unterteilt sein. In der Regel wird in einem Window ein Ausschnitt eines Buffers (s.u.) angezeigt. Anders gesagt: Windows sind Viewports auf Buffer.

  • :sp datei.txt: Bildschirm teilen und datei.txt in neuem Fenster anzeigen:
  • <ctrl>-w=: Alle Fenster gleich groß machen
  • <ctrl>-w <ctrl>-_: Aktuelle Fensterhöhe maximieren
  • <ctrl>-w<n>+: Aktuelle Fenstergröße um <n> Zeilen erhöhen (Default <n>=1)
  • <ctrl>-w<n>-: Aktuelle Fenstergröße um <n> Zeilen reduzieren (Default <n>=1)
  • <ctrl>-wj: Zu nächstem Fenster darüber wechseln
  • <ctrl>-wk: Zu nächstem Fenster darunter wechseln
  • :mks!: Aktuelle Session inkl. aller Buffer und Fenster speichern
  • vi -S: Vim mit gespeicherter Session startn

Buffer

Jede Datei wird in vim in einem Buffer geöffnet. Das Bearbeitungsfenster ist lediglich eine Ansicht auf einen Buffer. Es können beliebig viele Dateien in Buffern geöffnet werden und jeder Buffer kann in keinem, einem oder sogar mehreren Fenstern sichtbar sein. Das :split Kommando öffnet z.B. eine Datei in einem neuen Buffer und unterteilt den Bildschirm in ein weiteres Fenster um diesen Buffer anzuzeigen.

Öffnet man die selbe Datei mit :split in einem weiteren Fenster, wird dort tatsächlich exakt der selbe Buffer angezeigt: Ändert man den Inhalt in einem Fenster, ändert er sich im anderen automatisch mit.

Wichtig für die folgenden Befehle ist, dass :set hidden aktiviert ist, sonst kann ein geänderter Buffer nicht verlassen werden.

  • :ls: Liste aller Buffer anzeigen
  • :e <dateiname.txt>: Datei in Buffer laden
  • :bn: Nächsten Buffer im akt. Fenster anzeigen
  • :bp: Vorigen Buffer im akt. Fenster anzeigen
  • :b[0-9]: Angegebenen Buffer im akt. Fenster anzeigen
  • :bd: Buffer des akt. Fensters löschen (Datei schließen)
  • :bd[0-9]: Angegebenen Buffer löschen
  • :bs[0-9]:Angegebenen Buffer in neuem geteilten Fenster anzeigen
  • :bufdo s/abc/xyz/g: Befehl in allen Buffern ausführen

Eine interessante Diskussion mit weiteren Tipps gibt es [[hier|mike/vim-buffer-discussion]].

Tabs

Tabs unterscheiden sich in vim von Tabs in anderen Programmen. Ein Tab ist im Grunde fast wie eine eigene Editor-Instanz mit einer beliebigen Windows-Aufteilung. Allerdings teilen sich die Tabs die geöffneten Buffer! Man kann also ein und dieselbe Datei in unterschiedlichen Tabs und dort in verschiedenen Fenstern anzeigen.

  • :tabe <datei.txt>: Neuen Tab mit Datei öffnen (bzw. Buffer, falls Datei schon in Buffer)

Folds

  • zf: Fold aus markiertem Bereich erstellen
  • zd: Aktuellen Fold löschen
  • zR: Alle Folds öffnen
  • zM: Alle Folds schliessen
  • zo: Fold unter Cursor öffnen
  • zc: Fold unter Cursor schliessen

Tabulatoren

Einstellungen

Es gibt 3 wesentliche Einstellungen zum Verhalten von Tabs in vim:

  • tabstop (ts): Gibt an, wie Tabs (also echte TAB-Zeichen im Text) dargestellt werden sollen. Standardmäßig auf 8, bei uns meistens auf 4
  • expandtab (et): Falls ein, werden Tabs beim Eingeben immer in die entsprechende Anzahl von Leerzeichen übersetzt (expandet)
  • softtabstop (sts): Gibt an, wie viele Leerzeichen eingefügt werden sollen, wenn die <Tab>-Taste im Einfügemodus gedrückt wird. Ist tabstop=8 und noexpandtab gesetzt, wirkt <Tab> wie folgt:
    • softtabstop=5 es werden 5 Leerzeichen eingefügt
    • softtabstop=8 es 8 Leerzeichen eingefügt
    • softtabstop=10 es 1 TAB und 2 Leerzeichen erzeugt.

Ist expandtab gesetzt, werden immer nur die angegebene Zahl an Leerzeichen eingefügt.

  • shiftwidth (sw): Gibt an, wie viele Spalten von den Einrück-Operationen (>) verwendet werden sollen

Verwendung

  • :set noet: Tab Expansion ausschalten
  • :set et?: Aktuelle Einstellung abfragen
  • :retab!: Datei mit aktueller Einstellung neu "Tabben"
  • :set list / :set nolist: Sonderzeichen (inkl. Tabs) anzeigen/ausblenden
  • <ctrl>+V: Echtes TAB einfügen (Falls expandtab gesetzt ist und man trotzdem ein "echtes" Tab braucht)

Settings

  • :set <name>: Setting ansehen
  • :set <name> <wert>: Setting verändern

Beispiel:

:set fileencoding 

(zeigt encoding der akt. Datei, z.B. utf-8)

Settings pro File (modeline)

Mit modelines kann man in einer Textdatei vim-Einstellungen hinterlegen, die beim Bearbeiten automatisch geladen werden (häufig z.B. für Tab oder Syntax):

; vim:ft=dosini:

Zu beachten: die modeline-Option muss aktiviert sein. Für root ist sie standardmäßig aus!

set modeline     " enable inline modeline (default off for root)

Anzeigen von Variablen, Mappings, Einstellungen, etc.

:abbreviate   - list abbreviations
:args         - argument list
:augroup      - augroups
:autocmd      - list auto-commands
:buffers      - list buffers
:breaklist    - list current breakpoints
:cabbrev      - list command mode abbreviations
:changes      - changes
:cmap         - list command mode maps
:command      - list commands
:compiler     - list compiler scripts
:digraphs     - digraphs
:file         - print filename, cursor position and status (like Ctrl-G)
:filetype     - on/off settings for filetype detect/plugins/indent
:function     - list user-defined functions (names and argument lists but not the full code)
:function Foo - user-defined function Foo() (full code list)
:highlight    - highlight groups
:history c    - command history
:history =    - expression history
:history s    - search history
:history      - your commands
:iabbrev      - list insert mode abbreviations
:imap         - list insert mode maps
:intro        - the Vim splash screen, with summary version info
:jumps        - your movements
:language     - current language settings
:let          - all variables
:let FooBar   - variable FooBar
:let g:       - global variables
:let v:       - Vim variables
:list         - buffer lines (many similar commands)
:lmap         - language mappings (set by keymap or by lmap)
:ls           - buffers
:ls!          - buffers, including "unlisted" buffers
:map!         - Insert and Command-line mode maps (imap, cmap)
:map          - Normal and Visual mode maps (nmap, vmap, xmap, smap, omap)
:map<buffer>  - buffer local Normal and Visual mode maps
:map!<buffer> - buffer local Insert and Command-line mode maps
:marks        - marks
:menu         - menu items
:messages     - message history
:nmap         - Normal-mode mappings only
:omap         - Operator-pending mode mappings only
:print        - display buffer lines (useful after :g or with a range)
:reg          - registers
:scriptnames  - all scripts sourced so far
:set all      - all options, including defaults
:setglobal    - global option values
:setlocal     - local option values
:set          - options with non-default value
:set termcap  - list terminal codes and terminal keys
:smap         - Select-mode mappings only
:spellinfo    - spellfiles used
:syntax       - syntax items
:syn sync     - current syntax sync mode
:tabs         - tab pages
:tags         - tag stack contents
:undolist     - leaves of the undo tree
:verbose      - show info about where a map or autocmd or function is defined
:version      - list version and build options
:vmap         - Visual and Select mode mappings only
:winpos       - Vim window position (gui)
:xmap         - visual mode maps only

Tips & Tricks

Leerzeilen entfernen

:%s/^[\ \t]*\n//g

Ersetzen

  • :s/abc/xyz/: abc in aktueller Zeile durch xyz ersetzen
  • :%s/abc/xyz: abc überall durch xyz ersetzen
  • :%s/<ctrl-r><ctrl-w>/xyz/g: Wort unter Cursor überall durch xyz ersetzen
  • :%s/<ctrl-r>"/xyz/g: Letzten geyankten Ausdruck überall durch xyz ersetzen
  • :s/ /\r/: Leerstellen durch Zeilenumbruch ersetzen

DOS to Unix Zeilenende

:%s/^M$//g

Achtung: Das ^M wird mit <Ctrl>-V erzeugt (oder <Ctrl>-V<Ctrl>-M)

Alternativ dazu kann man auch das probieren:

:set ff=unix
:set ff=dos

ASCII Code des aktuellen Zeichens

ga

Search & Replace mit RegEx

:s/=\(.*\)->\(.*\)$/='\2 : '.\1->\2;

Konvertiert

$x=$bla->name

zu

$x='name :'.$bla->name;

Letzte Auswahl zurückholen

gv

Vorformatiertem Text einfügen

  • <F11>: aktivieren/deaktivieren

Erfordert set pastetoggle=<F11> in .vimrc

Fileencoding auf iso-8859-1

:set fileencoding=iso-8859-1 

oder

:set fileencoding=latin1

Fileencoding auf UTF-8

:set fileencoding=utf-8

Encoding erzwungen neu laden

Datei, deren encoding vim falsch erkannt hat, mit neuem Encoding neu laden

:e ++enc=iso-8859-15

BOM aktivieren/deaktivieren

Der BOM ist der Byte-order Mark am Anfang einer Textdatei. Zum aktivieren/deaktivieren:

:se bomb :se nobomb

Custom Filetypes / Syntax Highlighting

Um den korrekten Filtetype (und damit das richtige Syntax-Highlighting) für einen Dateityp zu definieren, wird folgender Eintrag in ~/.vim/filetype.vim angelegt:

au BufNewFile,BufRead *.tpl,*.page         setf xml

AutoIndending / Einrückung

Vim versucht, bestimmte Sprachen zu erkennen, und automatisch "richtig" einzurücken. Das kann manchmal Probleme machen. Häufig hilft dann:

:set nocindent

Möchte man das für bestimmte Filetypen komplett ausschalten, reicht ein Eintrag in .vimrc:

autocmd BufNewFile,BufRead *.js,*.css         set nocindent

Tabulatoren hervorheben

" Highlight real TABs: underline
hi ExtraWhitespace cterm=underline  guibg=red
match ExtraWhitespace /\t/
autocmd ColorScheme * highlight ExtraWhitespace

Formatierung fehlerhaft

Bei Problemen mit der Darstellung (z.B. Zeilen mit Umlaut werden falsch angezeigt, falsche Reihenfolge, ...) kann es an den Einstellungen der locale liegen. Unter Ubuntu empfiehlt sich ein Blick in /etc/defaults/locale bzw. der Befehl locale.

Links

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment