Eine Sammlung von Vim Tips, die dein Leben deutlich verbessern werden.

Bildnachweis: https://stocksnap.io/photo/D9AE3D6D9A

Ich schrieb vor kurzem ein paar Zeilen über Vim, warum ich es liebe und dazu ein paar Tips zum Überleben. Daran will ich hiermit jetzt anknüpfen und ein paar Tips und Snippets zeigen, die mein Leben deutlich einfacher gemacht haben. Los gehts.

1. Zuerst: Weg mit den Pfeiltasten

Ich schliesse mal direkt an meinem Ratschlag vom letzten Artikel an und sage: Bleib auf der Homerow. Sag nein zu den Pfeiltasten. Oder besser: <nop>

map <up> <nop>
map <down> <nop>
map <left> <nop>
map <right> <nop>

2. Zeilennummer aktivieren und relativieren

Ein kleiner aber wichtiger Schritt: Unkonfiguriert zeigt Vim keine Zeilennummern an. Das lässt sich mit set number ändern. Gut, ok, linenumbers, wow, #bestEditorEver.

Ist in der Tat - nicht so spannend. Besser wird es mit set relativenumbers. Hiermit sagt man den absoluten Zahlen, also der einfachen fortlaufenden Nummerierung, Goodbye und wechselt zur Relativen. D.h. dass der derzeitige Abstand zu den umliegenden Zeilen direkt sichtbar ist und schnell mit den Vim Motions erreicht werden kann.

In meinem Fall habe ich noch ein kleines Script eingebaut, mit dem ich schnell wieder zu absoluten Zahlen wechseln konnte. Wird selten benötigt, vielleicht aber für den einen oder anderen ganz praktisch. [1. Wenn zum Beispiel der Kollege mit am Rechner sitzt und mit Vim nicht klarkommt und gerade damit anfangen will wie gut Sublime Text und IntelliJ ist.]

3. Breakindent

Ein kleiner Patch der es irgendwann in Vim 7.4 geschafft hat ist dass break-indent, also das Umbrechen von langen Zeilen oder auch soft-wrap. Mit showbreak wird der Zeilenumbruch mit einem beliebigen Zeichen dargestellt. In meinem Fall ein ....

set breakindent
set showbreak=...

Kann dann so aussehen:

4. Select your leader

Der Leader Key ist der Schlüssel zu einer besseren Vim Erfahrung. Er ermöglicht den Zugang zu einer weiteren Shortcut Abstraktionsebene. D.h. dass man die Leader Taste drückt und anschließend einen Buchstaben und somit keine nativen Belegungen überschreibt.

Die Standardbelegung des Leaders liegt auf \. Macht auf QUERTY Tastaturen durchaus Sinn - liegt es doch direkt über der ENTER Taste, führt aber dazu dass man die Homerow verlassen muss. Und auf einer deutschen Tastatur führt es innerhalb weniger Minuten zu Fingerkrämpfen.

Ein besserer Leader ist laut derzeitigen Diskurs die Space / Leertaste. Ist diese Taste ja nicht standardmässig von Vim belegt und überschreibt somit keine Funktionen. [2. Das hat ehrlich gesagt für mich nie funktioniert. Seit zwei Jahren ist , mein Leader. Also Leader auf der rechten Hand, den Shortcut mit der linken Hand. Ich tippe die Leertaste schon immer mit dem linken Daumen. Und dass steckt so tief in meinem Muscle Memory, dass ich es nicht geschafft habe mich auf Space umzutrainieren. Die längsten und nervigsten drei Tage meines Lebens. ]

set mapleader = "\<space>"

Anschließend fügt eure häufigsten Shortcuts hinzu. Zum Beispiel:

  • Speichern:
  • nnoremap <leader>w :w<CR>
  • Oder mit FZF.vim, um alle meine offenen Buffer anzeigen zu lassen:
  • nnoremap <leader>b :Buffer
  • Oder Fugitive, um Änderungen in Git zu adden:
  • nnoremap <leader>g :Gstatus
  • Oder, und den hier nutz ich sehr oft, ein schnelles Wechseln zum letzten verwendeten Buffer:
  • nnoremap <leader><leader> <c-^>

5. Quick Exit Insert Mode

Wie bereits ganz am Anfang erwähnt, die Homerow nicht zu verlassen sollte das oberste Gebot sein. Nach dem Schreiben und Editieren aber immer den Esc Key zu erreichen ist somit etwas kontraproduktiv. Mein Vorschlag: jf oder fj. Diese Tasten schnell hintereinander gedrückt reduzieren den Moduswechsel schnell auf wenige Millisekunden.

" So we don't have to reach for escape to leave insert mode.
inoremap jf <esc>
inoremap fj <esc>

6. Beeindrucke deine Kollegen - mit rot13

Bildschirm sperren zu anstrengend? Oder Konzentrationsschwierigkeiten wenn jemand dir ungefragt über die Schulter schaut?
Dann ist die Lösung: ggg?G.

Was ist gerade passiert? Jeder Buchstabe rotiert 13 Buchstaben weiter im Alphabet.
Und warum brauch ich rot13? Gute Frage.

7. Undo all the things

Was in anderen Editoren das CTRL + Zist, ist in Vim einfach das u. Dies hat aber ansonsten die gleichen Limitierungen. Wird Vim neu gestartet war es dass mit dem rückgängig machen.

Das lässt sich ändern, mit persistent undo. Hierzu wird im System ein Ordner mit angelegt, der zu jeder bearbeiteten Datei eine *.un~ Variante anlegt, mit der sich alle Änderungen einer Datei befinden.

Hierfür gehört folgendes in die .vimrc:

" Put plugins and dictionaries in this dir (also on Windows)
let vimDir = '$HOME/.vim'
let &runtimepath.=','.vimDir

" Keep undo history across sessions by storing it in a file
if has('persistent_undo')
    let myUndoDir = expand(vimDir . '/undodir')
    " Create dirs
    call system('mkdir ' . vimDir)
    call system('mkdir ' . myUndoDir)
    let &undodir = myUndoDir
    set undofile
endif

8. Move Visual Block

Sublime Text hat ein nettes Feature dass es ermöglicht mit einem Shortcut einen markierten Block zeilenweise zu verschieben. Dies fehlte mir, darum suchte ich eine Möglichkeit dasselbe in Vim zu machen. Die Suche hat nicht lange gedauert. Folgendes kommt in die .vimrc:

" Move visual block
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

Jetzt lässt sich der ganze Block im Visual Mode markieren und anschließend mit Joder K verschieben.

9. Remove Trailing White Space

Kennt man sicher, man arbeitet, macht sein Ding, speichert und dann ... schlägt der Codelinter an. Was ist passiert? Trailing whitespaces, die Akne der Software Entwicklung. Man sieht sie lange Zeit nicht, aber wenn das große Date kommt (in unserem Fall ein Commit), tauchen Sie auf.

Aber ich hab mein eigenes Clerasil. Folgendes Snippet, wie immer in die .vimrc kopiert, lässt das Problem mit einem Druck auf F5verschwinden.

" remove unwanted trailing whitespaces in the whole file
nnoremap <silent> <F5> :let _s=@/<Bar>:%s/\s\+$//e<Bar>:let @/=_s<Bar>:nohl<CR>

Es muss nicht unbedingt F5 sein. Ich nutz die Funktion aber so selten - aber immer noch oft genug - dass sie für mich in der Funktionsreihe gut aufgehoben ist.

10. Arrow Keys Resizing

Erinnert ihr euch als ich gleich zu Beginn sagte, dass ihr die Pfeiltasten vergessen solltet? Nun, inzwischen habt ihr bestimmt meinem Ratschlag befolgt und die Tasten aus euren Gedächtnis gelöscht. Die Homerow ist King. Ihr rockt.

Und jetzt fangt an sie für etwas nützlicheres zu nutzen. Zum Beispiel mit dem schnellen resizen von Splits.

" Use Arrow Keys to resize window
noremap <up>    <C-W>+
noremap <down>  <C-W>-
noremap <left>  3<C-W><
noremap <right> 3<C-W>>

11. Sternchen und Punkt

So, dass hier ist vielleicht das Highlight meiner Tips, ein Tip den ich mir aus dem Buch "Practical Vim" geholt habe und mir seit dem soviel Arbeit erspart hat. Es handelt sich auch nicht um ein schnelles Snippet sondern eher um einen Workflow.

Und zwar geht es um Suchen und Ersetzen. Zum einen hat Vim die Substitute Funktion, was nichts anderes ist als "Search and Replace". Nehmen wir an wir haben folgenden Text und wollen das Wort Apparat durch Dingsbums ersetzen:

»Es ist ein eigentümlicher Apparat«, sagte der Offizier zu dem Forschungsreisenden und überblickte mit einem gewissermaßen bewundernden Blick den ihm doch wohlbekannten Apparat.

Mit Substitute kann man dieses global ändern. Hierfür würde man nur :%s/Apparat/Dingsbums/gaufrufen und die Sache wäre klar. Aber was ist, wenn garnicht jedes vorkommene Wort ersetzt werden soll, sondern von Fall zu Fall unterschieden werden soll? [3. Schliesslich kennt der Forschungsreisende offensichtlich den Apparat und würde ihn wohl nie als "Dingsbums" verunglimpfen.] [4. Und ausserdem empfehle ich jeden Franz Kafka's Geschichte "In der Strafkolonie" zu lesen. Und ja - richtig - ich habe es geschafft Kafka und Vim in einem Artikel unterzubringen. ]

Vergessen wir also Substitute und gehen zu einfacheren Bordmitteln zurück. Nehmen wir an der Cursor ist auf dem zu ändernden Wort, in diesem Fall "Apparat". Drückt man jetzt * werden alle gleichen Wörter im Dokument markiert. Jetzt kann man eine Wortoperation durchführen, bspw. cw (change word) . Anschliessend dann das n und wir springen zum nächsten gesuchten Vorkommen. Soll dieses Wort auch geändert werden dann sollte, anstatt jetzt cw erneut einzugeben, ein einfacher Repeat, also einfach . drücken, genügen. Wenn nicht, wieder n drücken.

Zu schnell? Hier eine Composition, indem vier Wörter vorkommen und das dritte Wort nicht ersetzt werden soll: *cwn.nn..

  1. * - Alle Wörter "Apparat" finden
  2. cw - Erstes Vorkommen von "Apparat" ändern
  3. n - Zum nächsten "Apparat" springen
  4. . - Das cw aus Schritt 2 wiederholen
  5. n n - Zwei "Apparat" weiterspringen
  6. . - Wieder ändern

Wechsel zwischen Vim und der Kommandozeile

Dass ist nicht wirklich ein Vim Tip, sondern eher etwas für die zsh Nutzer unter euch. Nativ kann man auf der Kommandozeile mit CTRL + Z Tasks (u.a. auch Vim) pausieren und auf die Kommandozeile zurückkehren. Mit fg kommt man wieder zurück zum Task. Ich fand es einfacher einfach zweimal CTRL + Z zu drücken. Hierfür hab ich folgende Funktion (aus diesem Artikel) zu meinen zsh Aliases hinzugefügt:

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    BUFFER="fg"
    zle accept-line
  else
    zle push-input
    zle clear-screen
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

War es das?

Nein, ich werde diese Liste im Laufe der Zeit sicherlich erweitern. Vim bietet soviele Möglichkeiten, aber ich glaube diese Sammlung sind Tips die Vim für Einsteiger vielleicht einfacher machen.

Achja, verzeiht die Clickbait Überschrift. Ich konnte nicht anders.

Und was ist mit Plugins?

Alle bisherigen Tipps sind alle nur mithilfe von Vim möglich. Es werden keine Drittplugins benötigt und sollten überall funktionieren. Natürlich helfen Plugins - aber damit wäre dieser Beitrag wahrscheinlich auch viermal so lang. Vermutlich werde ich Vim Plugins auch noch einen eigenen Beitrag widmen.