Inhaltsverzeichnis

Voraussetzungen

Nachdem wir neovim installiert und Du Dir evtl. die Bedienung des Editors angeschaut hast, kommen wir nun zur Erstellung der Config.

Meine NVIM-Config ist für die Version 0.4.x.

Sie sollte auch auch für Nightly, also der Beta mit Version 0.5.x, funktionieren. Ich persönlich würde einige Plugins bei Nightly austauschen, da durch Lua nun einige Dinge einfacher sind. Vor allem das Plugin CoC würde ich hier evtl. durch etwas “leichtere Kost” austauschen.

Diese Config für VIM zu verwenden wäre grundsätzlich möglich, aber benötigt einige Anpassungen.

Voraussetzungen für CoC und was ist CoC überhaupt?

Neben der Grundinstallation aus Teil 1 der Neovim-Serie sind für CoC noch ein oder zwei Dinge zu tun.

Auf der CoC-Webseite steht: Make your Vim/Neovim as smart as VSCode.

CoC kümmert sich um Snippets, prüft den Code auf Fehler und um die Autovervollständigung von Code. Es ist eine sehr mächtige Erweiterung für VIM und Neovim. Ich persönlich habe noch keine wirkliche Alternative gefunden. Allerdings sieht dies, wie oben schon geschrieben. für die kommende Neovim anders aus. Ich persönlich hatte noch Probleme mit den Nightly-Versionen und deshalb warte ich hier noch etwas ab.

Python und Node

Zuerst müssen wir Python und Node installieren. Beide werden für CoC bzw. deren Erweiterungen benötigt:

brew install python node 

Dann müssen wir den Packetmanager von Python erst mal aktualisieren:

sudo -H python3 -m pip install --upgrade pip

Damit CoC bzw. die Integration von Python in neovim funktioniert, muss pynvim installiert sein. Es ist eine Erweiterung zu Python und wird über dessen internen Packetmanager pip installiert:

python3 -m pip install --user --upgrade pynvim

Jedi für Python

Da ich für Python auch eine Erweiterung für Python-Code installiere, müssen wir dafür noch die Voraussetzungen schaffen. Solltest Du CoC später für weitere Programmiersprachen verwenden, dann musst Du evtl. dafür Voraussetzungen schaffen.

python3 -m pip install -U jedi-language-server

Yarn

Nun noch yarn, dann haben wir alles benötigte zusammen:

npm install -g yarn

Für welche Programmiersprache du zusätzlich noch Voraussetzungen brauchst, kannst Du bei der jeweiligen CoC-Erweiterung sehen. Eine Übersicht über alle Erweiterungen für CoC findest Du hier.

Die “Mega-Config” einspielen

Nun ist es soweit. Öffne mit Neovim die leere init.vim:

nvim ~/.config/nvim/init.vim 

Kopiere die Config in die Zwischenablage, dann in neovim i für insert mode und dann CTRL+v alles reinkopieren. Danach speichern und den Editor beenden mit :wq.

" ### Plugins

" 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

call plug#begin()
  Plug 'mbbill/undotree'              " Anzeigen von alten Revisionen
  Plug 'vim-scripts/SearchComplete'   " Autocompletion auch in der Suche aktivieren
  Plug 'itchyny/lightline.vim'        " Statuszeile mit mehr Informationen
  Plug 'morhetz/gruvbox'              " Farbschema Alternative
  Plug 'junegunn/limelight.vim'       " Fokus auf aktuellen Absatz
  Plug 'junegunn/goyo.vim'            " Alles ausblenden
  Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() } } " Markdown Preview
  Plug 'yegappan/mru'                 " Most Recently Used über :MRU 
  Plug '9mm/vim-closer'               " Intelligente Klammern und co.
  Plug 'justinmk/vim-sneak'           " Sehr schnelles springen im Code
  Plug 'preservim/nerdtree'           " Erweiterter Filebrowser
  Plug 'Xuyuanp/nerdtree-git-plugin'  " Erweiterung für Git
  Plug 'airblade/vim-gitgutter'       " Änderungen (Git) anzeigen
  Plug 'neoclide/coc.nvim'            " Umfangreiches Autocompletion und mehr
  Plug 'liuchengxu/vista.vim'         " Functions, Variablen anzeigen
call plug#end() " Plugins aktivieren

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


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


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


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


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


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


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


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


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


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


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

" ### Allgemeine Settings

" Lightline Coloscheme + Vista in Statuszeile
let g:lightline = {             
      \ 'colorscheme': 'gruvbox',
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ],
      \             [ 'readonly', 'filename', 'modified', 'method' ] ]
      \ },
      \ 'component_function': {
      \   'method': 'NearestMethodOrFunction'
      \ },
      \ }
let vim_markdown_preview_github=1   " Github-Erweiterungen von Markdown auch anzeigen
let g:sneak#label = 1               " Sneak-Vimi Label zum schnellen springen aktivieren.

" ### COC

" 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'
      \]

" 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

" 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
nmap <silent> )g <Plug>(coc-diagnostic-next)

" 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

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

" 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

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


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

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

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

" 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

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

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

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

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

" copy, cut and paste direkt in Zwischenablage
vmap <C-c> "+y
vmap <C-x> "+c
vmap <C-v> c<ESC>"+p
imap <C-v> <ESC>"+pa

" 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

Die Config aktivieren

Starte Neovim mit nvim wieder.

Neovim installiert nun zuerst automatisch den Plugin-Manager und danach automatisch alle Plugins. Sobald das CoC-Plugin aktiv ist, ist in der Config auch hinterlegt, dass alle von mir vorgesehenen CoC-Erweiterungen automatisch eingespielt werden.

Lass dem System Zeit. Vor allem die CoC-Erweiterungen dauern ein wenig. Bei CoC sollten die Erweiterungen so eine kleine Animation haben. coc-prettier wird voraussichtlich am längsten brauchen.

Am Ende sind drei Spalten zu sehen. Jede kannst Du mit :q beenden, bis Du dann komplett nvim beendet hast.

Ich habe es auf einem frischen System mal komplett durchgeführt und aufgezeichnet.

Nicht wundern, dass ich zuvor mich mit SSH verbinde und es evtl. etwas langsam ist. Ich habe die Installation auf einem frischen virtuellen macOS durchgeführt.

So sieht das einspielen der Neovim-Config und Aktivierung der Config dann aus:

Weitere Einstellungen für Jedi

Wenn Du nvim startest, dann sieht de Editor etwas anders aus als zuvor. Dazu aber gleich mehr. Für die Python-Erweiterung müssen wir noch eine Config einspielen.

Dazu in Neovim das Kommando :CocConfig eingeben. Dadurch öffnet sich die Datei coc-settings.json. Dort untere Config für Jedi reinkopieren:

{
  "jedi.enable": true,
  "jedi.startupMessage": false,
  "jedi.markupKindPreferred": "plaintext",
  "jedi.trace.server": true,
  "jedi.jediSettings.autoImportModules": [],
  "jedi.executable.command": "jedi-language-server",
  "jedi.executable.args": [],
  "jedi.completion.disableSnippets": false,
  "jedi.diagnostics.enable": true,
  "jedi.diagnostics.didOpen": true,
  "jedi.diagnostics.didChange": true,
  "jedi.diagnostics.didSave": true,
  "jedi.workspace.extraPaths": []
}

Nun die die Konfiguration endlich angeschlossen.

Details und Bedienung

Beim schreiben des Beitrags habe ich dann festgestellt, dass die Erklärung der Config recht lang wird.

Deshalb geht es im nächsten Teil weiter mit der detaillierten Erklärung der Konfiguration.