Vim Vs.neovim

Ich 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.

For comments, please send me an email

  1. https://de.wikipedia.org/wiki/Language_Server_Protocol

  2. https://github.com/prabirshrestha/vim-lsp

  3. xsel, pbcopy, clipmenud, ..