neovim Teil 3 – Plugin Manager, umfangreiche Einstellungen und Erweiterungen
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.
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.
Ab hier möchte ich eine kleine Warnung geben. Wie bereits geschrieben, ist das eine Config, die bei mir gut funktioniert hat. Ob das bei Dir auch so funktioniert oder für Dich das richtige ist, kann ich nicht beantworten. Es ist lediglich ein Dump meiner Umgebung mit ein paar Erklärungen. Sei also gewarnt. 😉
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.