neovim Teil 4 – Alle Plugins meiner Beispiel-Config erklärt

This post is technically outdated. You can surely find some ideas from it useful for VIM. For neovim users, I would do it differently now. A new post on this will follow soon.

Plugin-Manager und alle Plugins

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.

Heute gehen wir auf den Plugin-Manager und alle von mir in der Beispiel-Config verwendeten Plugins ein.

Ich habe versucht alles innerhalb der Config verständlich zu erklären. Wir gehen aber jetzt auf alles ein, damit Du die Einstellungen verstehst und für Dich anpassen kannst.

Plugin-Manager vim-plug

Dieser Part spielt den Plugin-Manager ein, falls er noch nicht vorhanden ist:

" Installation Pluginmanager
if empty(glob('~/.local/share/nvim/site/autoload/plug.vim'))
  silent !curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs
    \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
endif

Zwischen call plug#begin() und call plug#end() kommen dann die Plugins die aktiviert installiert werden sollen. Was die einzelnen Plugins machen, erfährst später.

Mit diesem Block werden automatisch beim Start vom Neovim neue Plugins installiert.

" Automatisch fehlende Plugins installieren
autocmd VimEnter * if len(filter(values(g:plugs), '!isdirectory(v:val.dir)'))
  \| PlugInstall --sync | source $MYVIMRC
\| endif

Wenn Du ein Plugin entfernst (ich kommentiere diese oft schnell mit " aus) ist es zuerst deaktiviert. Möchtest Du es deinstallieren, kannst Du diest mit :PlugClean machen. Wie gerade gesehen, werden Plugins beim Start automatisch installiert. Möchtest Du dies nicht haben, dann oberen Block entfernen und die Plugins manuell mit :PlugInstall installieren.

Mit :PlugDiff kannst Du schauen, ob es neue Versionen gibt und was sich geändert hat. Durch :PlugUpdate spielst Du neue Updates ein. Vim-Plug selbst kannst Du mit :PlugUpgrade erneuern.

Die Plugins

Ich werde nun ein wenig in der Config rumspingen müssen, damit die Funktion des Plugins etwas verständlicher wird.

mbbill/undotree

Mit UndoTree hast Du ein endloses Undo für alle Änderungen an Deinen Dateien. Wenn Du mit u einen Undo machst, bezieht sich dieser dann nicht nur auf die aktuelle Sitzung, sondern auf alle Änderungen, die jemals an der Datei durchgeführt worden sind. Mit Ctrl+r kommst Du auch wieder komplett zurück aus dem Undo.

Etwas komvortabler ist dies Space+u. Also der Leertaste und dan u. Du bekommst auf der linken Seite einen Split angezeigt. Dort siehst Du alle Änderungen. Mit Ctrl+w kann man einfach zwischen den Splits springen.

vim-scripts/SearchComplete

Durch SearchComplete hast Du ein Autocompletion für die Suche. Einfach den Anfang eines Begriffs bei der Suche eingeben und dann Tab drücken.

itchyny/lightline.vim

Die ist vielleicht die etwas andere Statusbar aufgefallen. Das ist Lightline.

Weiter unten stelle ich die Statusleiste ein. Sie verwendet wir der Rest auf das Farbschema gruvbox und ich lasse für das Plugin Vista noch ein paar Zusatzinfos anzeigen.

" Lightline Coloscheme + Vista in Statuszeile
let g:lightline = {             
      \ 'colorscheme': 'gruvbox',
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ],
      \             [ 'readonly', 'filename', 'modified', 'method' ] ]
      \ },
      \ 'component_function': {
      \   'method': 'NearestMethodOrFunction'
      \ },
      \ }

morhetz/gruvbox

Das Farbschema gruvbox ist so weit verbreitet, dass es eigentlich schon wieder langweilig ist. Ich habe einige getestet und lande am Ende immer wieder bei gruvbox. Wenn Du meinen Beitrag über Terminal, iTerm und Alacritty gelesen hast, dort verwende ich auch gruvbox.

So sollte auch bei Dir Neovim mit gruvbox aussehen.
So sollte auch bei Dir Neovim mit gruvbox aussehen.

Das Farbschema muss auch noch installiert werden. Zusätzlich macht es Sinn, nvim auf mehr als 256 Farben vorzubereiten. Es kann sein, das in pple Terminal die Option set termguicolors nicht richtig umgesetzt werden kann. Wenn die Farben in Neovim komisch aussehen, dann kommentiere diese Zeile mal zum Test raus.

" ##  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

junegunn/limelight.vim und junegunn/goyo.vim

An sich sind das zwei getrennte Plugin. Mit Limelight wird der farbliche Fokus auf den aktuellen Absatz gelegt und alles andere ist eher im Hintergrund. Durch Goyo werden alle störenden Elemente des Editors ausgeblendet und der Fokus in die Mitte des Bildschirms gesetzt.

Du kannst Goyo mit :Goyo starten und Limelight entsprechend mit :Limelight. Da die Kombination am meisten Sinn macht habe ich dafür erstellt.

Gibt einfach :Fokus zum starten bzw. auch zum beenden für “mehr Fokus” ein.

Das ist der Block, der sich darum kümmert:

" ### Fokusiertes Arbeiten (Befehl :Fokus)
let g:limelight_conceal_ctermfg = 240
function FokusStart()
  Limelight
	Goyo
endfunction
command! Fokus call FokusStart()
function FokusEnde()
  Limelight!  " Beim Beenden von Goyo Limelight auch beenden
endfunction
autocmd! User GoyoLeave call FokusEnde() " Wenn Goyo beendet wird, dann Fokus auch beenden

iamcco/markdown-preview.nvim

Das Plugin Markdown-Preview macht das was der Name verspricht. Es öffnet einen Browser und zeigt einen Preview Deines Markdown-Dokuments an.

Diese Zeile in der Config ermöglicht die Verwendung der erweiterten Github-Variante von Markdown beim Preview.

let vim_markdown_preview_github=1   " Github-Erweiterungen von Markdown auch anzeigen

Gestartet wird die Preview mit :MarkdownPreview.

yegappan/mru

Mit dem Most Recently Used (MRU) Vim Plugin hast Du eine Historie der zuletzt geöffneten Dateien.

Du kannst MRU einfach mit :MRU oder einfach mit Space+O anzeigen lassen. Es ist ein großes O!

Falls Du dafür kein extra Plugin verwenden möchtest, siehst Du auch gleich die interne Variante von Neovim in dem Config-Block:

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

Allerdings ist die Bedienung von MRU sehr viel einfacher.

9mm/vim-closer

Das Plugin vim-closer schließt automatisch Klammern und co. Er ist nicht ganz so “aggressiv” wie andere Plugin. Am besten ist die Funktion in dem kurzen Video zu sehen.

Solltest Dir die Art von Vim Closer nicht gefallen, dann nimm das Plugin raus.

Wir gehen später noch auf CoC genauer ein. Dort gibt es auch eine Auto-Pair-Erweiterung.

Diese kannst Du mit :CocInstall coc-pair installieren oder in die Config der Erweiterungen von CoC aufnehmen, damit diese automatisch installiert wird. So würde dann der Block aussehen, wenn coc-pair enthalten ist:

" Automatisch COC Extensions installieren
let g:coc_global_extensions = [
      \'coc-snippets',
      \'coc-prettier',
      \'coc-jedi',
      \'coc-html',
      \'coc-highlight',
      \'coc-eslint',
      \'coc-tsserver', 
      \'coc-json', 
      \'coc-css', 
      \'coc-git'
      \'coc-pair'
      \]

justinmk/vim-sneak

Vim-Sneak ist eines meiner liebsten Plugins. Ohne könnte ich nicht mehr arbeiten.

Mit s wird im normal mode die Vorwärtssuche und mit S die Rückwärtssuche aktiviert. Erwartet werden zwei case-sensitive Buchstaben. Springen kannst Du dann zwischen den Suchergebnissen mit ; bzw. ,

Mit dieser Zeile in der Config wird zusätzlich ein Index-Zeichen für alle Suchergebnisse am Bildschirm angezeigt:

let g:sneak#label = 1               " Sneak-Vim Label zum schnellen springen aktivieren.

Ein Beispiel direkt aus diesem Markdown-Dokument. Du siehst im letzten Abschnitt die ganzen CoC-Erweiterungen, die alle mit coc- anfangen. Ich habe davor s co eingegeben. Drücke ich nun eines der gelb markierten Zeichen bzw Buchstaben, springt der Cursor direkt an diese Stelle.

Schnelles Bewegen im Dokument mit VIM-Sneak.
Schnelles Bewegen im Dokument mit VIM-Sneak.

Damit kann man sich unglaublich schnell in einem Dokument bewegen.

preservim/nerdtree und Xuyuanp/nerdtree-git-plugin

Falls Du Dich schon mal mit VIM beschäftigt hast, dann hast Du evtl. schon von NERDTree gehört.

Es ist ein erweiterter Dateibrowser für VIM. Da er recht mächtig ist und es genügend Infos im Netz darüber gibt, werde ich nicht zu tief darauf eingehen. Zusätzlich habe ich auch eine Git-Integration für NERDTree installiert.

Recht einfach aufrufen kannst Du in mit der Tastenkombination Space+o.

map <silent> <leader>o :call NERDTreeToggle()<CR>
"nnoremap <leader>o :Lexplore<CR>           " Links den Filebrowser einblenden (nochmals blendet wieder aus)

Solltest Du NERDTree nicht wollen, ist in der Config auch der interne Dateibrowser schon voreingestellt. Das wäre dann die auskommentierte zweite Zeile.

Diese ruft eine kleine Function auf, damit man mit Space+o NERDTree an- und ausblenden kann.

" ### NERDTree 
let NERDTreeIgnore = ['\.pyc$', '__pycache__']
let NERDTreeMinimalUI = 1
let g:nerdtree_open = 0

function NERDTreeToggle()   " Toggle-Funktion
    if g:nerdtree_open == 1
        let g:nerdtree_open = 0
        NERDTreeClose
    else
        let g:nerdtree_open = 1
        NERDTree
    endif
endfunction

function! StartUp() 
    if 0 == argc()
        NERDTree
        let g:nerdtree_open = 1
    end
endfunction
"autocmd VimEnter * call StartUp()    " Nerdtree anzeigen beim Start, wenn man keine Datei öffnet

Die Funktion StartUp() ist zwar vorhanden, aber das autocmd dafür von mir auskommentiert. Wenn Du es wieder einbaust, wird der Dateibrowser immer beim Start von Neovim angezeigt, wenn keine Datei beim Start mit geladen wird.

airblade/vim-gitgutter

Wie im letzten Abschnitt geschrieben, habe ich für NERDTree eine Erweiterung für Git installiert. Damit sieht man u.a. sofort, den Status von Dateien, wenn man sich in einem Git-Verzeichnis befindet.

Vim-GitGutter macht das gleiche direkt im Dokument.

Mit Gitgutter siehst man sofort die Veränderungen.
Mit Gitgutter siehst man sofort die Veränderungen.

neoclide/coc.nvim

Du hast bei den Voraussetzungen für meine Beispiel-Konfiguration schon mitbekommen, dass CoC etwas umfangreicher ist. Ich werde nicht auf alles eingehen können. Vor allem kratze ich hier selbst auch nur an der Oberfläche der Möglichkeiten.

Es nimmt auch in der init.vim mit den meisten Platz in Anspruch.

CoC selbst arbeitet mit Erweiterungen. Normalerweise werden diese über :CocInstall Pluginnameinstalliert. Entsprechend auch mit `:CocUninstall´ wieder entfernt. Einige, die ich für sinnvoll halte habe ich bereits installiert. Und zwar direkt in der Neovim-Config:

" Automatisch COC Extensions installieren
let g:coc_global_extensions = [
      \'coc-snippets',
      \'coc-prettier',
      \'coc-jedi',
      \'coc-html',
      \'coc-highlight',
      \'coc-eslint',
      \'coc-tsserver', 
      \'coc-json', 
      \'coc-css', 
      \'coc-git'
      \]

Tipp: Wenn Du mit nun ein Plugin mit oberen Befehl deinstalliert, wird es beim nächsten Start von Neovim wieder geladen. Also in der init.vim ändern.

coc-snippets

Die Snippet-Erweiterung kann mit Vim Ultisnip Snippets umgehen. Mit :CocList snippets bekommst Du eine Liste der angelegten Snippets angezeigt. Aktuell dürften natürlich noch keine vorhanden sein. Gesucht werden die Snippets unter ~/.config/nvim/UltiSnips/ und unter ~/.config/coc/UltiSnips/. Snippets die immer gültig sind unter dem Dateinamen all.snippets und wenn es für eine bestimmte Dokument-Art ist, dann z.B. als markdown.snippets.

So sieht ein Beispiel-Snippet aus:

snippet image
![${0:Alt}](${2:image} "${3:Caption}")
endsnippet

Aufgerufen werden die Snippets mit ihrer Kurzform. Du musst dazu nur ein paar Buchstaben eingeben und ein kleines Popup neben dem Cursor zeigt den Begriff an. In das Popup kommst Du mit Cursor-Downoder auch Tab. Übernehmen dann mit der Enter-Taste.

Möchtest Du ein Snippet zur aktuellen Dokument-Art erstellen, dann kannst Du dies mit :CocCommand snippets.editSnippets machen.

In der Config ist dieser Block für die Steuerung des Popups zuständig:

" Use tab for trigger completion with characters ahead and navigate.
" NOTE: Use command ':verbose imap <tab>' to make sure tab is not mapped by
" other plugin before putting this into your config.
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

coc-prettier

Die Erweiterung formatiert JavaScript, TypeScript, CSS, JSON.

Wenn Du einen unformatierten Code hast, dann gib :Format ein. Das Dokument wird dann sauber formartiert.

" Mit :Format wird der Code automatisch formatiert
command! -nargs=0 Format :call CocAction('format')

Das Plugin kann noch etwas mehr und man könnte auch die Config noch erweitern. Infos dazu findest Du bei coc-prettier.

coc-jedi

Jedi ist eine Erweiterung für Python. Damit wird Autocompletion dafür aktiviert und auch der Code auf Fehler überwacht.

Da ich gerade wieder anfange mit Python zu arbeiten, habe ich es installiert. Allerdings kann ich dazu ehrlicherweise selbst noch nicht viel sagen, da mir die Erfahrung damit noch fehlt.

Es soll aber stellvertretend sein für alle anderen Integratonen für Programmiersprachen die CoC bietet.

Somit sind die Hinweise nun auch nur stellvertretend zu sehen und universal einsetzbar.

Bei einem Fehler kannst Du mit (g und )g durch die Fehler wandern und Dir anzeigen lassen.

" Use `[g` and `]g` to navigate diagnostics
" Use `:CocDiagnostics` to get all diagnostics of current buffer in location list.
nmap <silent> (g <Plug>(coc-diagnostic-prev)   " Anpassung für deutsche Tastatur
nm`p <silent> )g <Plug>(coc-diagnostic-next)

Möchtest Du Dir die Syntax eines Befehls ansehen, dann drücken im normal mode K

![Mit “K” kannst Du kannst Du die Dokumentation einblenden lassen.](coc-show-documentation.png “Mit “K” kannst Du kannst Du die Dokumentation einblenden lassen.”)

Das ist die Config dazu:

" Use K to show documentation in preview window.
nnoremap <silent> K :call <SID>show_documentation()<CR>

function! s:show_documentation()
  if (index(['vim','help'], &filetype) >= 0)
    execute 'h '.expand('<cword>')
  elseif (coc#rpc#ready())
    call CocActionAsync('doHover')
  else
    execute '!' . &keywordprg . " " . expand('<cword>')
  endif
endfunction

Damit an der linken Bildschirmseite die Fehler angezeigt werden:

" Zeigt Fehler mit Markierung der Zeile an und Fehlercode, wenn man auf der Zeile steht
augroup mygroup
  autocmd!
  " Setup formatexpr specified filetype(s).
  autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
  " Update signature help on jump placeholder.
  autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end

In der Praxis siehst dies dann so aus:

Fehler werden links entsprechend rot markiert.
Fehler werden links entsprechend rot markiert.

Und natürlich gilt alles, was ich zuvor schon über das Popup geschrieben habe.

coc-hightlight

Der Grund warum ich das Plugin installiert habe ich die farbliche Markierung gleicher Wörter. Wenn Du in einem HTML-Dokument bist und der Cursor steht auf img werden alle anderen auf dem aktuellen Bildschirm sichtbaren img farblich leicht hinterlegt dargestellt.

Das ist die Config:

" coc-highlight - Gleiche Wörter im Code markieren
autocmd CursorHold * silent call CocActionAsync('highlight')

Und sieht das dann aus. Schön an dem none am Ende der vier Zeilen zu erkennen:

coc-hightlight
coc-hightlight

Wie Du sehen kannst, kann es auch die Farbcodes farblich korrekt darstellen. Dies macht es immer dann, wenn von einer anderen Erweiterung diese Funktion nicht schon vorhanden ist.

coc-eslint, coc-tsserver, coc-json, coc-css

An sich wiederholt sich nun alles. Die in der Überschrift genanten Erweiterungen machen genau das, was ihr Name sagt. Wenn coc-json nicht installiert ist, kann man auch :CocConfig nicht verwenden.

coc-git

Die CoC-Erweiterung ist zwar in der Config schon drin, aber wird aktuell noch nicht wirklich von mir verwendet. Wie oben geschrieben, verwende ich aktuell noch GitGutter. Eine Vim-Config ist nie wirklich fertig, da sich immer neue Plugins, Möglichkeiten aber auch Anforderungen auftun. Auf der Webseite von coc-git findest Du ein paar weiter Infos zu der Erweiterung.

Weitere CoC-Erweiterungen

Die Liste an Erweiterung ist wirklich sehr groß. Eine Übersicht, die aber nicht mal vollständig ist, findest Du hier.

Somit ist nun klar, wie mächtig CoC ist und ich kann hier tatsächlich nicht weiter darauf eingehen.

liuchengxu/vista.vim

Last but not least kommt Vista. Vista ist deshalb das letzte Plugin in der Liste, da ich es auch als letztes installiert habe. Du kannst Dir damit LSP Symbole, Tags und co. anzeigen lassen.

Ich rufe es mit Space+v auf. Auch hier mit Toggle-Funktion

nnoremap <silent> <leader>v :Vista!!<CR>

Die Integration in die Statuszeile hatten wir schon, aber möchte ich in dem Zusammenhang nochmals zeigen:


" Lightline Coloscheme + Vista in Statuszeile let g:lightline = { \ 'colorscheme': 'gruvbox', \ 'active': { \ 'left': [ [ 'mode', 'paste' ], \ [ 'readonly', 'filename', 'modified', 'method' ] ] \ }, \ 'component_function': { \ 'method': 'NearestMethodOrFunction' \ }, \ }

Im Screenshot siehst Du auf der rechten Seite Vista und die Übersicht der Funktionen und in der Statuszeile weiter Informationen dazu.

So sieht Vista bei einem Javascript-Programm aus.
So sieht Vista bei einem Javascript-Programm aus.

Was ist mit dem Rest der init.vim?

Nun sind wir gerade mal mit den Plugins durch. Viele Stellen der Config sind dadurch schon erklärt, aber es gibt nun noch die weiteren Einstellungen in der init.vim. Diese schauen wir uns im fünften Teil an.

Wie immer würde ich mich über ein Feedback in den Kommentaren freuen.

Similar Posts

6 Comments

  1. Hallo, erstmal vielen Dank für diesen sehr guten Beitrag!
    Ich habe Deine Config auf WSL2 von Windows laufen,
    leider kann ich die geöffneten ultisnips im popup mit
    Enter nicht übernehmen!
    Tab geht, nochmal mit Pfeiltasten scrollen geht auch,
    aber dann tut es sich nichts. Kein Enter Taste keine S-Tab
    sowei C-p. Ich habe alles überprüft, aber ich weiss nicht
    weiter!

    Ich hoffe du kannst mir helfen!

    Und.. ich freue mich schon auf den Fünften Teil von Dir!

Leave a Reply

Your email address will not be published. Required fields are marked *