Vim - go to definition

Javascript, Typescript/Python

a marqué ce sujet comme résolu.

Hello tout le monde,

J’utilise Vim depuis quelques années maintenant. Mon vim est customisé. En faisant des recherches pour la fonctionnalité "go to définition", je n’y arrive pas.

  • J’ai installé ctags;
  • Je lance la commande ctags -R .;
  • Ça me crée un fichier
  • Si je fais les combinaisons qu’il y a dans la doc officielle, je n’arrive à rien.

J’ai l’impression que cette fonctionnalité est faite lorsque l’on développe en C/C++

Mes questions sont :

  • Est-ce que cette fonctionnalité fonctionne avec le Javascript/Typscript (Svelte/React) - Python ?
  • Sinon, y’a t-il une extension pour palier à ce manque ?

Merci beaucoup pour le coup de pouce et vos lumières.

Bien à vous toutes et tous

Niuxe

ps : Un amoureux de Vim

+0 -0

Je n’ai pas souvenir que gd s’appuie sur les tags. Les tags, on va dire que c’est une solution du passé. Même avec universal ctags (à la place du non maintenu exhuberant ctags), c’est relativement limité. Et ce n’est pas pratique du tout pour résoudre les surcharges non plus (pas si adapté au C++ que ça), au point que j’avais écris un plugin qui aide à cela.

Si tu veut avoir un go to definition qui marche bien quelque soit le langage, je t’invite plutôt à t’installer un client LSP et les serveurs qui vont bien pour les langages que tu manipules. Je sais qu’il y a un client fourni avec les dernières versions de Vim9, cependant j’utilise coc.nvim.

Salut,

Je suis un utilisateur occasionnel de Neovim, et l’un des gros point fort de Neovim sur vim c’est l’implémentation builtin du lsp, qui permet justement facilement ce genre de fonctionnalité.
Je vais faire un peu de prosélytisme mais passer de vim à Neovim est vraiment très simple puisque le projet a mis un point d’honneur à être parfaitement compatible avec le vimscript et s’utilise de façon très similaire, je t’encourage à l’essayer, et à installer un serveur de langage pour les langages qui t’intéressent (JS/TS et Python).

J’ai vite fait essayé ctags, comme toi, mais moi c’était bien pour du C, et même pour ça c’était plutôt une galère. ça m’a demandé pas mal de configuration (en même temps avec vim, faut s’y attendre) et pour un résultat avec moins de fonctionnalité que le lsp.
De mémoire il me semble bien que ctags c’est bien conçu pour du C/C++ à la base, après ça s’est peut-être étendu.

Sinon faut peut être chercher du côté des plugins qui intègrerait le lsp à vim.

EDIT: grilled - et j’ignorais que Vim9 avait le client lsp builtin aussi, my bad

+1 -0

Disons que ce n’est pas avec exhuberant ctags que tu vas parser des langages récents (ou qui évoluent -> C++20…) vu qu’il n’a pas évolué en 15 ans? 20ans? Faut prendre le fork: universal ctags. Que je me recompile perso — ce qui ce fait très simplement. Mais bon. La compréhension des langages est très limitée. On est sur de la regex ou assimilé.

Pour le LSP avec vim9, ce n’est pas exactement builtin (comme les tags), mais shipped-with. Sorte de plugin officiel écrit en vimscript 2.

Hello,

Sur mon Vim, j’ai COC et lorsque je fais "gd" ou "gD", ça ne passe pas. En outre, j’ai refait la manip de ctags dans une application virtuelle (venv) bidon en python. J’obtiens le comportement espéré si j’ai ce type de ligne :

from requests import post
from function import quelque_chose

Par contre, si l’instruction est seulement import, ça ne passe pas.

Je n’ai pas essayé avec le JS. Je sais qu’avec une app Svelte, je n’obtiens rien de bien concret.

Si vous connaissez la manip avec Coc, je suis preneur.

bien à vous :)

+0 -0

Parce qu’il ne suffit pas d’installer coc, il s’agit du client lsp, il faut ensuite soit installer les modules (qui comprennent généralement le serveur lsp) correspondant à tes langages, soit installer le serveur lsp sur ta machine et configurer coc pour qu’il l’appelle.

Je ne suis pas utilisateur de coc, mais du coup si tu fais :CocInstall coc-pylsp et :CocInstall coc-tsserver tu devrais avoir ce que tu veux ?

+1 -0

Je suis sur Debian, avec les paquets vim et ctags (qui est Exuberant Ctags 5.9~svn20110310).

À la racine des sources d’un projet, je fais :

ctags -R .

qui me donne un fichier tags.

Dans mon .vimrc, j’ai seulement la ligne suivante relative aux ctags (je ne sais même pas si elle est vraiment nécessaire, je me souviens y avoir touché quand j’essayais de cacher le fichier tags dans le dossier .git) :

set tags=./tags,tags,.git/ctags;

Ensuite, quand je suis dans un fichier Python (ou n’importe quel langage, chez moi c’est surtout C ou Python), je fais Ctrl+] (ce qui donne Ctrl+AltGr+), en même temps) et j’arrive bien à la définition du symbole.


Edit : voici deux liens que me suis sauvegardé :

+0 -0

Salut, pour la fonction de go to definition j’aurai pensé que cela dépend de l’extension que tu utilise avec ton langage. Par exemple si tu fais du Go et que tu utilise vim-go la commande est :GoDef. Si tu fais du TS/JS ou bien du Python je te suggère de regarder s’il existe une extension dédié au langage et d’utiliser ses commandes.

Vim commence à être de plus en plus remplacé par neovim par les utilisateurs car il possède de nombreux avantages et est plus moderne. Si aucune extension pour Vim n’existe, NeoVim peut-être une bonne alternative (si la fonctionnalité que tu cherche y est présente) car il te permet de garder ta configuration et est compatible avec les extension de Vim que tu utilise déjà.

+2 -0

Salut, pour la fonction de go to definition j’aurai pensé que cela dépend de l’extension que tu utilise avec ton langage. Par exemple si tu fais du Go et que tu utilise vim-go la commande est :GoDef. Si tu fais du TS/JS ou bien du Python je te suggère de regarder s’il existe une extension dédié au langage et d’utiliser ses commandes.

Tout l’intérêt du LSP (Language Server Protocol) mentionné plus haut est justement d’offrir un protocole agnostique du langage (du point de vue du client, i.e. l’éditeur) et de l’éditeur (du point de vue du serveur, un par langage). :-° Cela diminue l’effort de développement : les implémentations sont linéaires en le nombre d’éditeurs et de langage au lieu de se cogner le produit cartésien entre les deux ensembles. Et cela permet aussi d’éviter les soupes incohérentes de plugins au sein d’un même éditeur…

Juste comme ça, le plugin mentionné par @pyoroalb :

  • Est implémenté par dessus un LSP,
  • Fonctionne immédiatement une fois installé, out of the box plutôt qu’après des heures de config.
  • Répond très largement à la problématique donnée quand on ne pratique de toute façon qu’une poignée de technos à la fois.

Mais bien sûr c’est pas conceptuellement pur, alors mieux vaut disqualifier ce type de plugins avec mépris, et se perdre dans des solutions composées de tellement d’éléments distincts qu’elles maximisent les chances de transformer en quelques heures le vimrc d’un utilisateur en un mélange de sapin de Noël et de poupée vaudou, c’est vrai que c’est indiscutablement préférable pour tout le monde dans tous les cas.

+1 -0

Disons qu’il y a un point de la remarque d’adri1 que je comprends: avec un client LSP on a unicité d’interface pour nous utilisateurs.

Et pas à chercher dans les diverses docs: "ha! OK c’est :GoDef ici". "Diantre, :PyGotoDefinition cette fois". "Tiens?! Juste :GD en javascript"… Avec CoC, ça sera gd pour tout le monde. C’est l’intérêt.

Ca m’empêche pas des plugins construits autour qui rajoutent des choses. Mais ils introduisent alors une dépendance à un client LSP précis…

  • Répond très largement à la problématique donnée quand on ne pratique de toute façon qu’une poignée de technos à la fois.
nohar

Puisqu’il semble faire du web, ça risque d’être une grosse poignée de techno.

  • Fonctionne immédiatement une fois installé, out of the box plutôt qu’après des heures de config.

[…]

elles [les solutions impliquant plusieurs éléments distincts] maximisent les chances de transformer en quelques heures le vimrc d’un utilisateur en un mélange de sapin de Noël et de poupée vaudou

nohar

Mouais enfin, on parle juste de faire un :CocInstall coc-language en plus. Tout comme le module spécifique, si on n’a pas de besoin particulier la plupart des extensions marchent out of the box aussi. On est encore très loin du sapin de noël.
Avec (universal) Ctags, je te l’accorde, on pourrait tomber dedans, mais j’ai l’impression qu’on l’a quand même bien déconseillé, même lmghs qui a pourtant une conf qui fonctionne.

+0 -0

Comprenons nous bien, mon message n’est pas là pour dire que tel plugin ou telle façon de faire est mieux que tel autre. Je ne fais que réagir sur la façon méprisante dont cette piste se voit disqualifiée, quand 15 ans d’expérience et de recul m’ont appris que dans la pratique, le petit plugin qui juste marche tout de suite peut faire la différence en offrant une alternative parfaitement viable entre :

  • J’essaye de faire marcher mon LSP et les problèmes que je rencontre me poussent à installer des tas de trucs et copier des bouts de config au petit bonheur la chance sans succès après 4 heures, d’une part, parce que je l’ai déjà vécu et ne suis pas du tout un cas isolé,
  • Et, d’autre part, "je laisse tomber et j’installe VSC parce que j’ai vraiment pas que ça à faire", parce que ça aussi, ça m’est arrivé, et je ne suis là non plus pas un cas isolé.

Je constate que même cette intervention a été perçue comme ce que je pense être une tendance de ce forum depuis quelques années qui en fait un véritable repoussoir, qui est l’incapacité à écrire une réponse sans ressentir le besoin de disqualifier les autres approches au nom de valeurs dont rien n’indique, au regard du PO qui pose un problème pratique, qu’elles sont importantes à ses yeux. Et d’ailleurs je suis le premier à reconnaître que j’y ai moi-même participé, à cette fâcheuse tendance.

Argumenter en faveur de ce qui nous semble plus propre, oui, c’est parfait, ça met les conseils que l’on prodigue en perspective.

Flatter son ego en disqualifiant les autres avec mépris, et ainsi se présenter comme détenteur de la seule bonne et vraie solution, non. À un moment donné le seul message que je souhaite faire passer c’est qu’un comportement méprisant est systématiquement méprisable, et que ce serait pas mal :

  1. De s’en rendre compte,
  2. D’y faire quelque chose…

… Pour peu que l’on ait envie que plus de gens viennent demander, et donner, de l’aide sur ce forum. Aider les PO, c’est aussi éviter de faire fuir ceux qui essayent.

PS : Et je dis ça du point de vue tout à fait partial de quelqu’un qui s’est longuement demandé pourquoi il a lui-même déserté alors que ce n’est ni le temps, ni l’envie d’aider qui lui font défaut.

PPS : Ce constat et cette intervention ne sont, hélas, pas non plus un cas isolé sur un forum isolé. C’est également la manifestation d’un autre problème plus général dans le domaine de la tech, qui n’a rien de nouveau non plus, mais qui a le mérite d’avoir un nom facile à googler : contempt culture.

+2 -0
  • Et, d’autre part, "je laisse tomber et j’installe VSC parce que j’ai vraiment pas que ça à faire", parce que ça aussi, ça m’est arrivé, et je ne suis là non plus pas un cas isolé.
nohar

Je vais dire ça alors que je n’ai pas moi même investit mon énergie, mais si je paraphrase TJDeVries (core-maintainer de Neovim).
(Neo)Vim demande de l’investissement effectivement, et si tu n’as ni le temps ni l’envie de bricoler ton éditeur, si tu ne trouves pas ça "fun" de passer ton samedi à chercher les scripts qui vont bien, alors il n’est peut-être pas fait pour toi, tu utiliseras VSC ou un encore un autre et c’est très bien aussi.

une tendance de ce forum […] est l’incapacité à écrire une réponse sans ressentir le besoin de disqualifier les autres approches au nom de valeurs dont rien n’indique, au regard du PO qui pose un problème pratique, qu’elles sont importantes à ses yeux.

Argumenter en faveur de ce qui nous semble plus propre, oui, c’est parfait, ça met les conseils que l’on prodigue en perspective.

Flatter son ego en disqualifiant les autres avec mépris, et ainsi se présenter comme détenteur de la seule bonne et vraie solution, non.

nohar

Je n’ai pas vraiment vu le message de Adri1 comme méprisant mais bien comme argumentant les avantages de client lsp generique sur le module spécifique avec 2 arguments (dont 1 sur lequel il s’est trompé que tu as démonté).
Ton message en revanche je l’ai trouvé méprisant, attribuant des propos qui n’ont pas été tenu. Personne n’a parlé de vérité absolu, indiscutable, ou de conception pure. Il ne faisait que défendre son opinion. Et si elle soutien certaines valeurs, ça n’engage que lui.

Je pense que tu as ressenti du mépris dans le message d’Adri1 en l’associant au "-1" qu’il a attribuer au message avec lequel il était en désaccord. Peut-être est-ce cette fonctionnalité de downvote qui est perçue comme des attaques plutôt que des désaccords, et qu’elle cause plus de mal que de bien. Au lieu d’ouvrir la discussion sur le désaccord indiqué, elle braque le parti minoritaire.

  1. D’y faire quelque chose…
nohar

Je propose de commencer par revoir ce système de downvote ? (voir supprimer)

+1 -0

Je n’ai pas vraiment vu le message de Adri1 comme méprisant

Ah, alors on a un problème de perception, parce que commencer sa réponse à un message qu’on qualifie d’inutile (c’est en tout cas la sémantique originelle des +/- 1) par expliquer le fonctionnement et "l’avantage" (au singulier) d’un LSP, à quelqu’un qui le sait déjà très bien, dans un contexte différent, on appellerait ça du mansplaining 1, ce qui ne favorise pas du tout une interprétation neutre et bienveillante de la "soupe incohérente" de plugins que sont les configs des gens qui utilisent vim-go.

Mais je ne te jette pas la pierre : lorsqu’il y a un problème général de mépris qui persiste quelque part, s’il persiste, c’est précisément parce que les gens qui l’entretiennent directement ou non ne perçoivent pas le mépris dans ces comportements. S’ils le percevaient, alors le problème aurait été réglé avant d’en devenir un, et ne se poserait pas. :)

Et d’ailleurs, j’en souris parce que c’était prévisible mais je préfère ajouter qu’on n’est pas du tout sur une classe de problèmes qui se règlent à coups de rustines techniques, mais bel et bien une prise de conscience et un changement de comportement : le fait de mettre ou non des downvotes n’empêche pas d’écrire un paragraphe sarcastique ou condescendant, à l’image de ma réaction à chaud sur ce thread et du message auquel il répondait.


  1. C’est tout aussi agaçant que d’expliquer la philosophie derrière Vim et le fait que la plupart de ses utilisateurs aiment bidouiller leur config, à quelqu’un qui l’a utilisé quotidiennement pendant 15 ans de carrière dans le développement, pour suggérer que "c’est peut-être pas pour lui". Je le mentionne juste à titre d’illustration parce que dans le fond ça me laisse indifférent, vu que ce n’est même plus mon boulot aujourd’hui, mais ça explique certainement pourquoi tu ne vois pas le mépris dans un comportement similaire à celui que tu viens d’adopter.
+1 -0

Hello,

@nohar, je rejoins assez bien ton constat sur le fond. Il est vrai que l’on voit très souvent des solutions être décriées par mépris.

Mais pour le coup, la forme de ton premier message fait effectivement tenir à @adri1 une attitude qu’il n’est pas la sienne dans ce sujet et ne rend pas service au fond de ton propos. Soyons de bon compte, tout le monde n’a pas la même perception des +1/-1 (pour certains, c’est "utile/pas utile", comme l’indique la sémantique originelle, pour d’autres c’est "d’accord/pas d’accord"). Je pense que, dans le bénéfice du doute, il eut été préférable de demander à @adri1 ce qu’il contestait. Là, il se fait quelque peut prendre à partie. C’est pas top et je sais que tu as l’humilité de t’en rendre compte. ;)

Donc, voilà, je vous invite à faire en sorte que la discussion puisse reprendre sur de meilleures bases.

+1 -0

Le problème ne méritant pas plus de mon attention que ça, je me bornerai à signaler que si je suis intervenu, c’est parce que @pyoroalb était venu m’en parler en me disant qu’il ne comprenait absolument pas pourquoi, alors qu’il participait à ce thread de bonne volonté avec simplement l’envie d’aider, ainsi qu’une piste inspirée de ce qui fonctionne très bien dans son cadre professionnel à lui, il s’est retrouvé rembarré de façon aussi gratuite et vexante.

Je voudrais simplement que le fait qu’Adri1 soit Adri1 et que moi je sois nohar ne vienne pas occulter ceci : tout ce qui a été accompli ici, c’est qu’un développeur professionnel rempli de bonne volonté soit dégoûté d’avoir essayé d’aider.

Je vous laisse tranquillement multiplier ça par le nombre d’occurrences de tels messages pour vous faire mentalement une idée de l’échelle des dégâts, et m’en retourne vivre une vie paisible et heureuse, dénuée de toute obsession d’avoir raison.

Bonne journée. :)

+1 -0

Le problème ne méritant pas plus de mon attention que ça, je me bornerai à signaler que si je suis intervenu, c’est parce que @pyoroalb était venu m’en parler en me disant qu’il ne comprenait absolument pas pourquoi, alors qu’il participait à ce thread de bonne volonté avec simplement l’envie d’aider, ainsi qu’une piste inspirée de ce qui fonctionne très bien dans son cadre professionnel à lui, il s’est retrouvé rembarré de façon aussi gratuite et vexante.

Je voudrais simplement que le fait qu’Adri1 soit Adri1 et que moi je sois nohar ne vienne pas occulter ceci : tout ce qui a été accompli ici, c’est qu’un développeur professionnel rempli de bonne volonté soit dégoûté d’avoir essayé d’aider.

nohar

Oki, je comprends tout à fait son ressenti, comme le tien d’ailleurs. Il ne faut pas hésiter à en parler avec la modération. S’il y a un ressenti négatif, nous sommes là pour cela également et cela aurait peut-être évité la situation actuelle (ressenti négatif de @pyoroalb et toi d’une part, de @adri1 et @romantik de l’autre).

+1 -0

Hello !

Quelques pistes (et des liens) pour configurer ctags (exuberant pour ma part).

  • pour le C, ça marche out of the box normalement;
  • pour le python, j’ai fini par trouver ce blog post, le problème initial étant que ctags-exuberant référence beaucoup trop d’entrées (je conseille de mettre -python-kinds=-iv pour également ne pas tager les variables);
  • pour typescript, c’est un peu plus délicat : je suis en ce moment au milieu d’un court projet en typescript et j’ai trouvé cette solution en roue de secours. C’est pas forcèment idéal, mais ça fait le café vis-à-vis de l’investissement que je veux mettre dans le language sur le long terme.

Par ailleurs, j’ai remappé le Ctrl+] pour des raccourcis plus pratique en azerty / bépo :

nnoremap <Leader>g <c-]>
nnoremap <Leader>vg :vs<CR><c-]>
nnoremap <Leader>xg :split<CR><c-]>

En espérant que ça peut t’aider dans tes recherches :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte