neovim Teil 5 – Alle weiteren Funktionen der init.vim

Es gibt noch so viel mehr in unserer init.vim

Im dritten Teil der Serie haben wir zusammen meine Beispiel-Config in die init.vim eingespielt und aktiviert. Der gesamte Beitrag bezieht sich somit auf diese Konfiguration aus dem letzten Beitrag.

Der letzten Beitrag ging vor allem auf die Plugins ein.

Heute gehen wir auf alle restlichen Konfigurationen und Funktionen ein, die wir uns durch die Plugins noch nicht genauer angesehen haben.

Darstellungsoptionen

" ### Darstellungsoptionen
syntax on           " Syntax Highlighting aktiveren
set number          " Line Numbers anzeigen
set relativenumber  " Relative Nummerierung anzeigen
set linebreak       " Ganze Wörter in neue Zeile umbrechen
set showmode        " Aktuellen Modus in Statuszeile anzeigen
set scrolloff=5     " Cursor bei Scroll weiter oben halten
set mouse=a         " Scrollen mit der Mouse in Console und tmux
set lazyredraw      " Weniger Redraws bei Macros und co.
set cursorline      " Aktive Zeile markieren
set updatetime=300  " Schellere Darstellung	/ Refresh
"set cc=80          " Markierung 80 Zeilen-Rand
set laststatus=2    " Statuszeile immer anzeigen
set cmdheight=2     " Mehr Platz für Statusmeldungen
set shortmess+=c    " Don't pass messages to |ins-completion-menu|
set nowrap          " Wrap standardmäßig abschalten. Mit Leader w an-/abschalten

Durch syntax on schaltet das Syntax Highlighting an. Eigentlich überflüssig, da in Neovim, im Gegensatz zu Vim, standardmäßig aktiv.

Mit set number wird die Nummerierung an der linken Spalte aktiviert. Durch set relativenumbersiehst Du die absolute Zeilennummer in der aktuellen Zeile und darüber bzw. darunter die relativen Zeilenabstände.

Ich mag diese Funktion, da Du bei VIM und Neovum dadurch sehr schnell springen oder einen Block komplett kopieren oder löschen kannst. So springst Du mit 5 und dann Enter fünf Zeilen nach unten und mit 5- entsprechend fünf Zeilen nach oben.

Wenn Du mehrere Zeilen löschen willst, dann z.B. 5dd eingeben. Wobei Du hierbei natürlich Deine Zeile mitrechnen musst.

Falls Du einen Umbruch aktivierst, dann werden mit set linebreak ganze Wörter umgebrochen und nicht einfach mitten in einem Wort. Als Standard ist set nowrap aktiviert. Somit wird erst mal nichts umgebrochen, sondern alles in einer Zeile angezeigt. Passt es nicht auf dem Bildschirm, musst Du entsprechend weit nach rechts in dem Text scrollen.

Damit Du nicht set wrap eigeben musst habe ich (siehe weiter unten) dann mit Space+w eine schnelle Tastenkombination um den Zeilenumbruch an- bzw. auszuschalten.

Ich glaube set showmode hat durch die erweiterte Statusleiste keinen wirklichen Einfluss auf die Optik.

Falls Die aufgefallen ist, dass schon ein paar Zeilen vor dem Seitenende nach unten gescrollt wird, dafür ist set scrolloff=5 zuständig. Ich finde es ein wenig übersichtlicher. In dem Zusammenhang ist auch set laststatus=2 und set cmdheight=2 zu beachten. Sie erweitern den Bereich unterhalb der Statusleiste, damit hier mehr Platz für Meldungen ist.

Durch set mouse=a wird die Maus aktiviert. Du kannst damit z.B. bei NERDTree in den Split klicken, etc.

Wenn Du Automatisierungen, wie z.B. Macros in VIM durchführst, dann bringt set lazyredraw Dir einen Performance-Vorteil. Es werden dann nicht brav alle Änderungen visuell durchgeführt, sondern zum Teil einfach übersprungen. In die gleiche Richtung geht set updatetime=300. Der Refresh wird schneller durchgeführt.

Durch set cursorline wird die aktuelle Zeile mit einem horizontalen Balken markiert. Damit findet man die aktuelle Zeile optisch schneller.

Das Setting "set cc=80 habe ich auskommentiert. Vergleichbar zur cursorline sieht man hier einen grauen Balken rechts bei 80 Zeichen. Mich persönlich nervt das eher und ich halte mich nicht so an die üblichen 80 Zeichen als Breite. Probiere es einfach aus.

Die Einstellung set shortmess+=c wird von vielen Plugins benötigt. So zum Beispiel auch CoC.

Optik und Farben

" ##  Optik und Farben
if has('termguicolors')
    set termguicolors     " Wenn Farben nicht passen, dann die Zeile auskommentieren (z.B. macOS Terminal)	
endif
colorscheme gruvbox       " Farbschema aktivieren

Hatte ich bereits bei den Plugins erklärt. Mit colorscheme kannst Du das Farbschema verändern. Einige sind auch bereits bei VIM und Neovim dabei. Teste mal colorscheme desert zum Test.

Beachte, dass Apple Terminal evtl. ein Problem mit set termguicolors da es nicht mehr als 256 Farben darstellen kann. Hier empfehle ich mal einen Blick auf diesen Beitrag.

Suche (und Dateien laden mit Find)

" ### Suche
set path+=**      " Damit kann mit :find alles, auch in Subfolder gefunden werden
set ignorecase    " Suche nicht Case-Sensitiv
set smartcase     " Aber wenn Großbuchstaben verwenden werden dann schon

Sehr mächtig ist set path+=**. Damit wird u.a. bei :find nicht nur im aktuellen Verzeichnis gesucht, sondern auch in allen Unterverzeichnissen. Mit dieser Funktion kannst Du Dir evtl. ein Plugin wie FZF sparen.

Hier mal ein Beispiel aus dem Projektordner von diesem Blog:

Vim und Neovim sind Unix-typisch erst mal auf Case-Sensitiv einstellst. Durch set ignorecase wird dies ignoriert. Manchmal möchte man aber etwas genauer suchen Mit set smartcase wird bei Verwendung von Groß- und Kleinschreibung diese dann beachtet.

Sprache und Rechtschreibkorrektur

" ### Sprache und Rechtschreibkorrektur
set helplang=de             " Deutsche Hilfe
set spelllang=de_de,en_us   " Deutsche und englische Rechtschreibung
"set spell                  " Rechtschreibkorrektur immer aktivieren
autocmd FileType markdown setlocal spell   " Spell bei Markdown aktivieren
autocmd FileType text setlocal spell       " Spell bei allgemeinen Textfiles aktivieren

Die Hilfe stellst Du mit set helplang=de auf deutsch ein.

Bei set spelllang=de_de,en_us wird VIM / Neovim gesagt, dass wird diese beiden Sprachen für Rechtschreibkorrektur verwenden möchten. Im Bedarf werden die Sprachen automatisch runtergeladen. Ab und zu aber auch nicht von ganz alleine. Dann gebe einfach set spell manuell ein. Du wirst gefragt, ob die Sprache geladen werden soll. Hier aufpassen. Gibst Du was falsches ein, fragt Vim dich nicht so schnell wieder.

Wie Du siehst, habe ich set spell auskommentiert. Bei Code stört es eher. Deshalb sind die letzten beiden Zeilen mit autocmd. Damit wird Spell immer bei Markdown und bei allgemeinen Text-Dateien aktiviert.

Tipp: Wenn ein Wort als falsch markiert wird, dann kannst Du Dir mit z= eine Liste mit Korrekturvorschlägen anzeigen lassen.

Verhalten für Backup, Swap und co

" ### Verhalten für Backup, Swap und co.
if !isdirectory($HOME."/.local/share/nvim/undodir")
    call mkdir($HOME."/.local/share/nvim/undodir", "p", 0700)
endif
set undodir=~/.local/share/nvim/undodir     " Alle Veränderungen werden hier aufgezeichnet
set undofile		                            " Alle Änderungen werden endlos in oberen undodir protokolliert
if !isdirectory($HOME."/.local/share/nvim/swap")
    call mkdir($HOME."/.local/share/nvim/swap", "p", 0700)
endif
set directory=~/.local/share/nvim/swap      " Zentrale Ablage der Swap-Files
"set noswapfile     " Falls kein Swap-Files erstellen werden soll
set nobackup        " Backfile wird sofort wirder gelöscht, da Restores über Undofiles möglich
set hidden          " Wechsel von Buffern auch, wenn File nicht gespeichert

Bei den Plugins haben wir uns UndoTree als Plugin bereits angesehen. In der ersten If-Abfrage und dem ersten beiden Set-Einstellungen, wird das Verzeichnis dafür eingerichtet und gesetzt und UndoTree aktiviert. Es ist nicht innerhalb von ‘~.config’, da mit der Zeit eine ganze Menge an Daten anfallen können. Ich wollte aber auch keine extra Routine machen, um hier aufzuräumen. Schaue von Zeit zu Zeit mal in ~/.local/share/nvim/undodir nach und lösche evtl. den Inhalt um aufzuräumen.

Viele nervt, dass vi, vim und co. eine Swap-Datei anlegt. Mir ist es allerdings ohne schn passiert, dass ich eine Datei doppelt geöffent hatte. Wenn Du alleine arbeitest, dann macht der zweite If-Block Sinn. Hier wird Swap zwar noch verwendet, aber zentral verwaltet. Dies macht natürlich keinen Sinn, wenn Du den Editor auf einem Fileserver mit anderen zusammen verwendest, die auch vi, vim oder nvim verwenden.

Solltest Du auf Swap komplett verzichten wollen, dann die Zeile mit "set noswapfile aktivieren.

Mit set nobackup wird kein Backup-Datei angelegt bzw. übrig gelassen. Warum auch. Mit UndoTree haben wir unendlich viele Undos.

Die Otion set hidden ist wichtig, wenn man viel mit Buffern arbeitet. Ansonsten kann man einen Buffer nur dann wechseln, wenn er gespeichert ist.

Verhalten von TABs, Einrücken bei Code und die Mac Zwischenablage

" ### Verhalten von TABs und Einrücken bei Code 
set tabstop=2 softtabstop=2	shiftwidth=2    " Nur zwei Tab-Stopp einfügen
set expandtab           " Tabs in Spaces wandeln
set formatoptions+=j    " Immer Spaces anstatt Tabs
"set clipboard=unnamed  " Standard-Register (yy, dd, etc) IMMER in Zwischenablage kopieren 

Um es kurz zu machen. Die Einstellungen bewirken 2 Zeichen als Tab für das Einrücken und es wird kein Tab, sondern echte Leerzeichen verwendet. Standard sind 8 Zeichen, meine 2 sind sehr gering und viele bevorzugen wohl 4 Zeichen. Ändere es nach Deinem Ermessen. Wenn Du “echte” Tabs willst, dann nimm die zweite und dritte Option raus.

Mit "set clipboard=unnamed würde, wenn es nicht kommentiert wäre, jede Aktion aus dem Standard-Register als Kopie in die Mac Zwischenablage gehen. Also ein dd in Vim und danach könntest Du in einer Mac-App mit CTRL+v diesen Inhalt einfügen.

Später bei den Tastenkombinationen kommt noch eine für mich bessere Alternative. Außerdem kannst Du auch bei Bedarf selbst bestimmen, ob etwas in die Zwischenablage kopiert wird. Mit "+yy kopierst Du eine Zeile auch in die Zwischenablage. Das funktioniert auch mit anderen Dingen, wie "+5dd

Falls Du NERDTree nicht verwenden willst

" ### Interner Filemanager (Explore, VExplore, SExplore) optimieren
let g:netrw_banner = 0        " Banner abschalten
let g:netrw_browse_split = 4  " im gleichen Fenster öffnen
let g:netrw_altv = 1          " Split rechts öffnen
let g:netrw_liststyle = 3     " Tree View
let g:netrw_winsize = 25      " Fenster schmälter machen
let g:netrw_list_hide = netrw_gitignore#Hide()    " Gits ausblenden	
let g:netrw_list_hide.=',\(^\|\s\s)\zs\.\S\+'     " Dotfiles ausblenden

Mit diesem Block wird der interne Dateimanager von VIM und Neovim sauber konfiguriert. Aufrufen kannst Du ihn mit z.B. ExploreVExploreSExplore.

Sessions

" ### Sessions
" Automatisch letzte Session speichern
function! MakeSession()
  let b:sessiondir = $HOME . "/.config/nvim/sessions"
  if (filewritable(b:sessiondir) != 2)
    exe 'silent !mkdir -p ' b:sessiondir
    redraw!
  endif
  let b:filename = b:sessiondir . '/autosession.vim'
  exe "mksession! " . b:filename
endfunction
au VimLeave * :call MakeSession()

" Command LoadLastSession ladet die letzte gespeicherte Session
function! LoadSession()
  let b:sessiondir = $HOME . "/.config/nvim/sessions"
  let b:sessionfile = b:sessiondir . "/autosession.vim"
  if (filereadable(b:sessionfile))
    exe 'source ' b:sessionfile
  else
    echo "No session loaded."
  endif
endfunction
command! LoadLastSession call LoadSession()

Mit diesem Block wird automatisch beim verlasen des Editors ein Sessionfile gespeichert. Wenn Du dann nvim wieder startest und LoadLastSession eingibst, wird diese Session wieder geladen. Du kannst Tabs öffnen oder in einem Split eine zweite Datei offen haben. All dies wird dadurch wiederhergestellt. Wenn Du selbst bestimmen willst, ob eine Session gespeichert wird, dann kommentiere die Zeile au VimLeave * :call MakeSession() und erweitere die Config um command! SaveSession call MakeSession().

Tastenkombinationen

Nach dem Block für das Speichern der Sessions kommt sehr viel Config, die wir im letzten Beitrag mit den Plugins schon komplett besprochen haben.

Zu Schluss und dies ist auch Absicht, kommen meine Configs für die Tastenkombinationen. Diese sind am Ende, da ich dadurch evtl. verhindern kann, dass diese durch eine andere Einstellung überschrieben werden.

Leader-Key

" ### Meine Keyboard-Settings
let mapleader = " "		" Space-Taste als Leader

Wir verwenden die Leertaste, also Space als Leader-Key. Hier kannst Du Dir auch eine andere passende (unbelegte) Taste aussuchen.

Deshalb hast Du jetzt auch schon recht oft Space+irgendwas gelesen.

Dateihistorie

" Dateihistorie verwalten
nnoremap <leader>u :UndotreeToggle<CR>      " Tracking der Veränderungen anzeigen/ausblenden

Hatten wir ja schon. Hier wird UndoTree an- und abgeschaltet.

Öffnen von Dateien und Sessions

" Öffnen von Dateien und Sessions
map <silent> <leader>o :call NERDTreeToggle()<CR>
"nnoremap <leader>o :Lexplore<CR>           " Links den Filebrowser einblenden (nochmals blendet wieder aus)
nnoremap <leader>O :MRU<CR>                 " Zeige die zuletzt verwendeten Dateien an
"nnoremap <leader>O :browse :oldfiles<CR>   " Falls Du MRU nicht verwendest, die interne Funktion
nnoremap <leader>S :LoadLastSession<CR>     " Lade letzte Session

Auch hier sind wird z.T. schon bei den Plugins gewesen. Was zu oberen Sessions noch wichtig wäre, dass ich diese auf eine Taste gelegt habt. Mit Space+S wird die letzte Sitzung geladen.

Zwischen Split / Fenster springen

" Schneller als Ctrl+W + - < >
nnoremap <silent> <Leader>+ :vertical resize +5<CR>   " VSplit größer
nnoremap <silent> <Leader>- :vertical resize -5<CR>   " kleiner machen
nnoremap <silent> <Leader>* :resize +5<CR>            " HSplit größer machen
nnoremap <silent> <Leader>_ :resize -5<CR>            " kleiner machen

An sich sind wir noch nicht auf Split eingegangen, auch wenn Du es durch verschiedene Plugins, wie NERDTree schon mitbekommen hast. Du kannst mit vsplit Dateiname oder split DateinameDeinen Editor mit mehreren Dateien gleichzeitig aufteilen.

Springen kann man zwischen den Splits mit CTRL+w und wenn Du dazu noch +-<> drückst, kannst Du die “Fenster” in der Größe verändern.

Mit oberer Config geht das evtl. schneller oder zumindest leichter. Inzwischen solltest Du die Configs ja schon verstehen und selber erkennen was passiert.

Tabs erstellen und steuern

" Durch Tabs steuern
nnoremap <silent> <leader><Left> :tabprevious<CR>
nnoremap <silent> <leader>h :tabprevious<CR>
nnoremap <silent> <leader><Right> :tabnext<CR>
nnoremap <silent> <leader>l :tabnext<CR>
nnoremap <silent> <leader><Up> :tabnew<CR>
nnoremap <silent> <leader><Down> :tabclose<CR>

Wo Splits in Vim sind, dürfen Tabs nicht fehlen. Mit diesen Tastenkürzel kannst Du nicht nur sehr schnell zwischen Tabs springen, sondern diese auch erstellen oder schließen. Durch `Space+Cursor-Nach-Oben` erstellt Du einen neuen Tab und mit `Space+Cursor-Nach-Unten` entfernst Du den aktuellen Tab. Mit `Space+Cursor-nach-Links` bzw. `Space+Cursor-nach-Rechts` wanderst Du durch die Tabs. Für Vi-Hardcore-Fans, geht das Wandeln dann auch alternativ noch mit `Space+h` und `Space+l`.

Durch Buffer wandern

" Durch Buffer steuern
nnoremap <silent> <leader>k :bp!<CR>
nnoremap <silent> <leader>j :bn!<CR>

Nun fehlen nur noch die Buffer. Auch hier kann man recht schnell durchwandern.

Hier ein Beispiel, wie man sehr schnell mit space+k und space+j durch viele Dateien wandern kann.

Durch gewarpte Zeilen steuern

" Bei Wrap-Zeilen in den Zeilen blättern und nicht in Blöcken
nnoremap <silent> <A-Down> gj
nnoremap <silent> <A-Up> gk

Eine etwas sperrige Überschrift. Wenn Du set wrap aktiv hast und somit sehr lange Zeilen umgebrochen werden, dann ist es etwas umständlich, da VIM mit den Cursor-Tasten immer eine ganze Zeile spring. Dies kann aber in Deinem Fall ein ganzer Absatz sein.

Du kannst aber mit gj und gk durch die einzelnen Zeilen wandeln. Dies habe ich auf Alt+Cursor-Nach-Unten und entsprechend auch Alt+Cursor-Nach-Oben gelegt.

Wrap an- und abschalten

" Wrap an-/ausschalten
nnoremap <silent> <leader>w :set wrap!<CR>

Wenn wir schon bei Wrap sind. Mit space+w kannst Du Wrap sehr schnell an- und abschalten. Das sieht man auch im Video im vorherigen Abschnitt. Da wird mit einem Snippet ein langes Lorem Ipsum eingefügt, ein paar mal kopiert und dann schalte ich mit space+w Wrap ein.

Mac Zwischenablage

vmap <C-c> "+y
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

Wir hatten das Thema Mac Zwischenablage ja schon. Hier sind nun ein paar Tastenkombinationen, die das ganze leichter machen. In vielen Terminals kann man eh schon etwas markieren und mit Command+Ckopieren. Falls das nicht geht, dann kannst mit CTRL+v den im virual mode markierten Text yanken und gleichzeitig in die Zwischenablage kopieren. Entsprechend mit space+x wird er entfernt und kopiert und mit CTRL+v wird er aus der Mac Zwischenablage reinkopiert. Wobei ich letzteres nie verwende oder brauche, da man hier gut mit Command+v zurecht kommt.

Sonstige

" Sonstiges
nnoremap <silent> <leader>s :nohlsearch<CR>
nnoremap <silent> <leader>v :Vista!!<CR>
nnoremap <leader>r :source ~/.config/nvim/init.vim<CR>  " Config neu laden
command! WriteUnix w ++ff=unix    " Wenn Du eine Dos-Datei in Unix speichern willst
command! WriteDos w ++ff=dos      " Und anders rum
command! W w " Weil ich Depp mich ständig vertippe
command! Q q " Weil ich Depp mich ständig vertippe

Wir sind auf der Zielgeraden. In Neovim ist set hlsearch automatisch aktiviert und deshlab nicht in der Config enthalten. Dadurch werden die Suchergebnisse farblich markiert. Um diese loszuwerden habe ich Space+s eingerichtet. Es aktiviert nur die aktuelle Markierung der Suche und nicht grundsätzlich die Funktion. Damit blendest Du also die farbige Markierung der Suche wieder aus.

Vista hatten wir ja bereits bei den Plugins.

Schande über mich. Ein Tastenkürzel, was Du evtl. die ganze Zeit hättest brauchen können, kommt ganz am Ende. Mit Space+r wird die init.vim neu geladen. Du kannst also mit einer anderen Sitzung was an der Config ändern und ohne Beenden in einer anderen die Config sofort laden. Das hat seine Grenzen, aber funktioniert in 80% bis 90% der Fälle. Gutes Beispiel: Du erweiterst die Config um ein Plugin, speichern, Config neu laden und es wird sofort automatisch installiert.

Nun kommen noch zwei Spezialbefehle. Mit :WriteUnix wird die Datei im Unix-Format gespeichert und entsprechend mit :WriteDos mit Format für Dos/Windows. Da ich in beiden Welten unterwegs bin, ist das ab und zu nützlich. Solltest Du irgendwann den Fall haben, dass in die init.vim nicht mehr sauber geladen wird und er Sonderzeichen am Ende der Zeile moniert, dann speichere diese mit :WriteUnixab. Damit ist das Problem gelöst.

Und ja, manchmal bin ich ein Depp (wie man in Bayern so schön sagt). Ich vertippe mich gerne beim speichern und beenden von VIM. Deshalb erlaube ich auf ein :W und auch ein :Q, da mein Finger noch auf der Umschalttaste liegt.

In meiner .zshrc gibt es auch ein :q, da ich das versehentlich anstatt exit eingebe.

Das war es nun…

Nun sind wir vorerst am Ende der Reihe angekommen. In fünf Teilen habe ich versucht, Dir VIM bzw. eher Neovim näher zu bringen. Es ist viel umfangreicher geworden als zuerst gedacht. Bestimmt sind auch einige Rechtschreibfehler drin. Aber bei so viel Text verliert man irgendwann den Überblick.

Mich würde es sehr freuen, wenn Du mir ein Feedback gibst oder auch eine Frage hast. Verwende einfach die Kommentarfunktion.

One more Thing…

Ich werde noch einen kurzen sechsten Beitrag schreiben und dort eine sehr geniale GUI-Variante von Neovim vorstellen, die viele noch nicht auf dem Schirm haben.

Jetzt bin ich aber :q!

Schreibe einen Kommentar

Das könnte Dich auch interessieren