vim-Plugins für Syntaxvervollständigung und Hervorhebung falscher Variablennamen

Hey Leute,

ich suche zwei vim-Plugins, die jeweils das Folgende können:

  • Syntaxvervollständigung auf Basis der CamelCase-Notation (dh. tippen von „mv“ schlägt mir automatisch „myVar“, „my_var“, etc. vor).
  • Hervorhebung von falsch geschriebenen bzw. nicht deklarierten Variablennamen

Beide Funktionen sind Standard für IDEs/graphische Texteditoren und ich merke, dass ich die beim Arbeiten mit vim schon sehr vermisse. Ich suchte auch schon einmal selbst nach passenden Plugins aber konnte nichts Passendes finden, meist war viel visueller Overhead dabei. Ich würde mich sehr freuen, wenn ihr mir weiterhelfen könnt! :slight_smile:

Beste Grüße
Philipp

Beides hört sich für mich nicht nach Features an, die ein Text-Editor direkt bereitstellt. Heutzutage würde man für das zweite zumindest LSP benutzen, damit die gesamte semantische Analyse zuverlässiger umgesetzt wird, als wenn man irgendwelche Heuristiken (die doch meistens sprach-spezifisch sind) umgesetzt werden.

So weit ich höre, hat Neovim support dafür eingebaut, aber es gibt sicher auch etwas für Vim.

1 „Gefällt mir“

Ich nutze dafuer coc.nvim (was auch auf der von zge verlinkten Seite aufgefuehrt wird).
Damit funktionieren an sich die zwei von dir genannten Punkte (und noch deutlich mehr); du musst aber natuerlich noch Language Server fuer die Sprachen, die du nutzen willst, installieren. Fuer die ueblichen Sprachen geht das aber sehr simpel dank CoC Extensions.

1 „Gefällt mir“

coc.nvim sieht soweit gut aus! Ich habe mir für den Anfang coc-pyright installiert. Im Zuge dessen haben sich drei Fragen ergeben:

  1. Wenn ich die Type Hints wie in grafik weglasse, werden sie automatisch eingeblendet/eingebettet. Allerdings ist das Farbschema ungünstig (wie man sehen kann). Mich interessiert deswegen, wo/wie ich das Farbschema bearbeiten kann.

    1.1 An sich benötige ich die auch nicht immer, deswegen lasse ich oft bewusst weg. Ich habe zwar bei coc-pyright mehrere Optionen entdeckt, mit denen man das vermutlich abstellen könnte, allerdings weiß ich nicht, welche Werte zur Auswahl stehen. Wisst ihr zufällig, wo die dokumentiert sind?
    Umständlich aber immerhin etwas: Der beste Weg, den ich bisher gefunden habe: Wenn man sie, wie in coc-pyright#Configurations beschrieben, in die coc-settings.json einträgt, kann man sich durch die Vorschläge diese Werte in vim anzeigen lassen
    Edit: Ich habe zumindest die richtigen Einstellungen gefunden:

    "pyright.inlayHints.functionReturnTypes": false,
    "pyright.inlayHints.variableTypes": false
    

    (Beide standardmäßig auf true.)

  2. Ich würde gerne, wenn ich im Normal Mode auf einer falsch geschriebenen Variablen stehe, per <C-Space> direkt die Syntax-Vervollständigung öffnen. Das klappt bisher nur mit <C-Space>, wenn ich im Insert Mode bin. Alle Versuche, wie bspw. nnoremap <C-Space> i<C-Space> scheiterten. Wäre super, wenn mir jemand des entsprechende Key Mapping nennen würde :slight_smile:
    Ich habe nur etwa die erste Hälfte der coc.nvim#Example vim Configuration übernommen (weil ich den Rest nicht verstehe). Wenn dieses Verhalten dort beschrieben ist, dann reicht ein kleiner Hinweis.

Ich hoffe, der lange Text schreckt nicht ab :see_no_evil:

  1. Wie man das Farbschema aendert weiss ich leider nicht, du wirst wahrscheinlich :highlight mit dem passenden Bezeichner nutzen muessen. Wie man den Bezeichner herausfindet, weiss ich leider nicht.
    1.1. Mich stoert das auch, ich nutze einfach "pyright.inlayHints.variableTypes": false. Das ist ja auch bei dem Link den du gepostet hast geschrieben; eine Dokumentation dazu habe ich jetzt nur in der package.json gefunden (unter „configuration“).
    Ich nutze hier uebrigens auch folgendes Mapping, um diese InlayHints zu togglen, was ich ganz praktisch finde: nnoremap <silent> <Leader>t :CocCommand document.toggleInlayHint<CR> :wink:
  2. Dein Mapping ist fast richtig: da <C-Space> im Insert-Mode selbst ein Mapping ist, brauchst du hier ein rekursives Mapping. Ausserdem wuerde ich a anstatt i verwenden, damit der Cursor an der richtigen Stelle ist. Also: nmap <C-Space> a<C-Space>.
  1. Ok, kann man Nichts machen. Ich schätze, dass ich dann wasl. einfach Farbschemata ausprobieren werde, bis ich eins gefunden habe, das diesen Makel nicht hat.
    1.1 Das Mapping für die InlayHints nehme ich gerne mit, weil ich mir selbst schon dachte, dass es gelegentlich, bspw. wenn man mit fremden Code hantiert, sehr praktisch sein kann, ich aber nicht weiß, wann ich vim so gut beherrsche, dass ich das selbst gebacken bekomme. Danke! :sparkler:
    …Ich habe es gerade ausprobiert: Bei mir passiert leider Nichts, auch wenn ich :CocCommand document.toggleInlayHint eingebe :frowning:

  2. Top! :sparkler: Ist <C-Space> nicht genau das Mapping im Insert Mode, das ich benötige?
    …auch gerade ausprobiert: Es passiert auch bei nmap <C-Space> a<C-Space> Nichts :sweat_smile:

1.1 Wenn du in coc-settings.json beides deaktivierst, dann ist es eben aus, und auch der toggle-Command bringt dann nichts. Ob man die einzelnen Optionen dort togglen kann, weiss ich leider nicht, da ich persoenlich einfach alles oder nichts haben will. Ich habe es also in der coc-settings.json aktiviert, und nutze dann das toggle-Mapping, wenn ich es nicht will.
2. Ja genau, aber bei einem nicht-rekursiven Mapping werden ja Mappings in der RHS (Right Hand Side) nicht aufgeloest. D.h. mit nnoremap wird einfach <C-Space> eingegeben, ohne zu pruefen, ob es da ein Mapping gibt (weswegen du effektiv einfach ein Leerzeichen einfuegst).
Dass das nicht geht ist sehr seltsam - ich habe es getestet, und bei mir funktioniert es. Meine vimrc ist an der Stelle:

inoremap <silent><expr> <C-Space> coc#refresh()
nmap <C-Space> a<C-Space>

Die erste Zeile muesstest du ja denke ich aus der Beispiel-Konfiguration uebernommen haben, da es sonst ja gar nicht geht, oder? Bei mir funktioniert es so im Insert-Mode und auch im Normal-Mode.

1 „Gefällt mir“

1.1 Alles klar! Ich dachte, dass die Werte in coc-settings.json egal für’s Togglen sind und der Befehl einfach die Werte umschaltet aber da lag ich falsch! Es funktioniert wunderbar! :fireworks:
2. Bei mir funktioniert es auch aber nicht mit dem von dir bereitgestelltem Mapping, sondern per nmap <C-@> a<C-@>. Auf diese Lösung bin ich mit deiner ersten Zeile gekommen, weil diese bei mir in einem if-Block steht, der ausgeführt wird, wenn man Neovim nutzt – im else-Fall steht die gleiche Zeile nur mit <C-@> statt <C-Space>. :fireworks:
Was mir auch geholfen hat: Ich stieß, als ich es selbst versuchte, auf folgenden StackOverflow-Thread, indem diese Thematik angesprochen wird. Verstanden habe ich es nicht wirklich aber als ich meine vimrc anschaute, fiel mir wieder ein, dass da irgendetwas war.
Edit: Ich habe mich für nmap <C-@> ea<C-@> entschieden, damit ich nach der Korrektur direkt am Ende bin.

Vielen Dank für die Hilfe! Ich freue mich!

zum Abschluss eine bewusst allgemein gehaltene Frage: „Lohnt“ sich im Vim im Vergleich zu einer IDE? Meiner anfänglichen Erfahrung nach würde ich sagen, dass man mit den Bewegungen (und :%s/…/…/) schon effektiver als in einem Standardeditor arbeiten kann. Aber es gibt für diese auch Vim-Plugins und wie man an meinem Problem merkt, können die Hürden für Vim schon hoch sein, möchte man den Editor nach seinen Vorlieben anpassen.

  1. Ah interessant, ich musste meine Mappings vor kurzem tatsaechlich umstellen (von <C-@> zu <C-Space>), da es irgendein Update gab (vim oder mein Terminal…?). Aber bei dir ist das dann wohl nicht der Fall. Das Mapping mit ea ist eine nette Idee. :slight_smile:

Bzgl. deiner allgemeinen Frage:
du kannst dir vielleicht schon denken, dass ich die Meinung vertrete, dass es sich definitiv lohnt. :smiley: Wenn man nur einen Editor will, der simpel ist und einfach nur funktioniert, ist vim wohl nichts fuer einen. Aber vim ist eben schon extrem umfangreich, und wenn man genug Zeit investiert hat, ist man damit einfach deutlich effizienter. Klar gibt es Huerden bzw. eine steile Lernkurve, aber fuer mich ist das Teil des Spasses – das Konfigurieren, dass der Texteditor genau das macht, was ich will. Damit verbringe ich auch (zu) viel Zeit, deswegen kann ich natuerlich durchaus verstehen, wenn man sich die Muehe nicht machen will.
Ein Texteditor ist aber auch quasi das universalste Werkzeug als Programmierer, weswegen das fuer mich eine Investition fuers „Leben“ ist. :slight_smile:

Ja, genau, das habe ich mir schon gedacht – Leute, die das nicht so sehen, muss ich nicht fragen, weil ich selbst genug Gründe finden würde, warum es sich nicht lohnt (bspw. steile Lernkuve, Zugriff auf extrem viele Mechaniken ausschließlich per unintuitivem Tastenkürzel (wobei ich mich an viele schneller gewöhnt habe als gedacht)). :smiley: Aber da ich es im Prinzip so sehe, wie du in deinem letzten Satz beschreibst, möchte ich mich ein bisschen mit Vim auseinandersetzen. Ursprünglich wollte ich auch wissen, warum Vim trotz IDEs „noch“ genutzt wird aber durch die Key Mappings, die Bewegungen und dass ich erst an der Spitze des Eisbergs angekommen bin, konnte ich das schon zum Großteil beantworten.

Hast du noch ein paar Empfehlungen für sinnvolle Plugins? Meine Anwendungszwecke sind für die Beantwortung bestimmt hilfreich: Ich programmiere hauptsächlich in Python, Java und Bash.

Empfehlen wuerde ich fuer dich natuerlich die CoC Extensions coc-pyright, coc-java und coc-sh (fuer bash). coc-git ist auch immer gut, fuer eine simple Git-Integration in vim.
Ansonsten nutze ich viele „kleine“ Plugins, die fuer mich ganz nuetzlich sind. Da wuerde ich jetzt aber wenn nur indentLine empfehlen, was ich fuer Python ganz nuetzlich finde. Das nutze ich dann aber auch ausschliesslich fuer Python:

let g:indentLine_enabled = 0
autocmd FileType python IndentLinesEnable

Die meisten anderen Plugins die ich nutze sind aber schon ziemlich individuell – wenn du mal ein Feature vermisst, wirst du bestimmt ein Plugin etc. finden, was dir das Feature bietet. So habe ich es immer gemacht. :slight_smile:

Ja, die CoC-Extensions habe ich auch auf dem Schirm!

So wie du es beschreibst, kann ich mir vorstellen, dass ich mit deinen anderen Plugins wasl. wenig bis Nichts anfangen könnte, da sie auf deine Arbeitsweise zugeschnitten sind und diese mit Sicherheit nicht meiner entspricht :smiley:

indentLine schaue ich mir mal an :slight_smile: