Vim Vs.neovim
Geschrieben am 13-01-2025 - ⧖ 3 minIch habe im Beitrag Bin wieder da geschrieben, das ich von
Vim auf Neovim umgestiegen bin und wurde dann per Mail
gefragt, ob Neovim so viel besser als Vim ist. Well.. ob Neovim besser ist,
muss jeder selbst entscheiden. Ich habe Vim als meinen Maineditor seit ~2002
genutzt und ihn in meinem Blog auch das ein oder andere Mal erwähnt und war auch
sehr zufrieden, jedoch hat Neovim einige Features die ich bei Vim vermisse und
er macht auch einige Sachen anders. Ich benötige unbedingt einen an mich
angepassten Editor, da der Großteil der von mir genutzten Programme davon
abhängig sind. Ich schreibe Mails, poste im Usenet, editiere
Konfigurationsdateien, programmiere, verfasse Blogbeiträge und erstelle
Dokumentationen mit einem einzigem Programm; nämlich meinem Editor. Deswegen
gibt es letztendlich nur zwei Optionen. GNU Emacs oder Vim; da da GNU Emacs kein
Editor ist, bleibt nur noch Vim. Kommen wir jetzt dazu, was Neovim von Vim
unterscheidet.
Ich werde jetzt nicht auf das, was in Vim_diff steht
eingehen, sondern mich etwas allgemeiner halten. Da ist z. B.
Codebase
Sie saugt. Und zwar tierisch. Dazu kommt noch das sie komplett veraltet und einfach nur eklig
programmiert ist. Lust auf etwas brainfuck? Kein Problem. inchar()
in getchar.c ruft ui_inchar()
in ui.c auf, welches mch_inchar()
in os_unix.c aufruft. Das pointet dann auf WaitForChar()
, das
letztendlich auf RealWaitForChar()
referenziert. Noch immer nicht genug gelacht? Dann werft mal
einen Blick in ./vim/src/testdir/test_functions.vim
if has('unix') && executable('uname')
let uname = system('uname')
" GNU userland on BSD kernels (e.g., GNU/kFreeBSD) don't have BSD defined
call assert_equal(uname =~? '\%(GNU/k\w\+\)\@<!BSD\|DragonFly', has('bsd'))
call assert_equal(uname =~? 'HP-UX', has('hpux'))
call assert_equal(uname =~? 'Linux', has('linux'))
call assert_equal(uname =~? 'Darwin', has('mac'))
call assert_equal(uname =~? 'QNX', has('qnx'))
call assert_equal(uname =~? 'SunOS', has('sun'))
call assert_equal(uname =~? 'CYGWIN\|MSYS', has('win32unix'))
LSP aka Language Server Protocol
Wenn man den LSP1 unter Vim nutzen will, benötigt man dazu ein externes Plugin2 und noch ein zusätzliches Plugin wenn man auf verschiedene Server zugreifen will. Das ganze wird dann mit Vimscript konfiguriert und ist dementsprechend eklig und langsam. Neovim hat LSP bereits implementiert und ich persönlich will nicht mehr darauf verzichten. Wenn man z. B. in einem Quelltext folgende Funktion hat
int foo()
{
cout << "Hallo, Welt!"
return 0
}
und den Namen der Funktion foo
in bar
ändern will, dann kann man das entweder manuell machen
oder man verwendet :lua vim.lsp.buf.rename() und gibt dann den neuen Namen der Funktion
ein. Dieser wird dann in allen Verweisen geändert, aber in den Kommentaren bzw. anderen Funktionen
und/oder Routinen ignoriert.
Konfiguration/Start/Optionen
Neovim nutzt XDG,
während Vim seine Konfigurationsdatei unter $HOME ablegt und man dann darin die einzelnen
Verzeichnisse definieren muss. Dazu kommt noch das Neovim die Plugins parallel lädt und somit
schneller startet.
Einige Optionen von Vim sind schlicht und einfach eklig. Was bei Neovim mit einem einfachen set termguicolors
gesetzt werden kann, muss man unter Vim mit set t_Co=256
erledigen. Den ganzen
t_XX
gibt es unter Neovim nicht und es wird auch kein termcap(5) abgefragt, sondern gleich auf
terminfo(5) zugegriffen und man muss sich auch nicht mit clipboard=unnamed{,plus}
herumschlagen,
sondern kann einfach irgendein Programm3 verwenden.
Treesitter, Telescope, cmp, ..
Treesitter, Telescope, sowie nvim-cmp sind für mich unverzichtbar. Für Treesitter und Telescope gibt es keine Alternative unter Vim und wer schonmal CoC, ALE bzw. YouCompleteMe mit nvim-cmp verglichen hat (in Bezug auf Performance), weiß das das nicht wirklich Alternativen sind.
-
xsel, pbcopy, clipmenud, .. ↩