289 votes

Sauter à la définition de la fonction

Comment puis-je passer à la définition d'une fonction en utilisant Vim ? Par exemple, avec Visual Assist, je peux taper Alt + g sous une fonction et cela ouvre un menu contextuel listant les fichiers avec les définitions.

Comment puis-je faire quelque chose comme ça dans vim ?

2 votes

Gnu global est meilleur que ctags.

8 votes

@Jichao, pouvez-vous nous donner un peu plus d'informations sur votre expérience ? Avec quelles langues gnu global a-t-il mieux fonctionné pour vous ? Y a-t-il quelque chose d'important dans le contexte dans lequel vous l'avez utilisé ? Ou peut-être l'avez-vous utilisé dans de nombreux scénarios différents et semblez-vous le préférer la plupart du temps ou toujours ? Qu'est-ce qui vous plaît le plus ? Merci.

0 votes

@Jichao J'ai transformé votre commentaire en une réponse du wiki communautaire. Je serais heureux de recevoir vos modifications et votre contribution à cette réponse.

246voto

Paul Tomblin Points 83687

Utilisez les ctags. Générez un fichier de balises, et indiquez à vim où il se trouve en utilisant la commande :tags. Ensuite, vous pouvez simplement passer à la définition de la fonction en utilisant Ctrl - ]

Il y a plus de trucs et astuces pour les tags dans cette question .

0 votes

Cela fonctionnera-t-il pour PHP ? J'ai oublié de mentionner que j'ai besoin qu'il fonctionne avec C, C++, php et python.

2 votes

Php est suffisamment proche de C pour que "Exuberant ctags" fonctionne avec lui. Je ne sais pas s'il a un mode python.

6 votes

Aucune expérience avec Cscope. Qu'est-ce que c'est ?

177voto

Scottie T Points 4655

Si tout est contenu dans un seul fichier, il y a la commande gd (comme dans 'goto definition'), qui vous amènera à la première occurrence dans le fichier du mot sous le curseur, qui est souvent la définition.

1 votes

Que faire si je n'ai pas le mot sous le curseur (je préfère le taper) ?

0 votes

@FuadSaud il suffit de le rechercher en utilisant /

7 votes

/ est presque toujours imprécis, car il va correspondre à toutes les occurrences. J'ai découvert que vous pouvez en fait faire :tag <function_name> pour passer à la définition via les ctags.

119voto

Brent Foust Points 1786

g* fait un travail décent sans que des ctags soient mis en place.

C'est-à-dire que le type g , (ou simplement - voir ci-dessous) pour rechercher le mot situé sous le curseur (dans ce cas, le nom de la fonction). Appuyez ensuite sur n pour passer à l'étape suivante (ou Shift - n pour l'occurrence précédente).

Elle ne permet pas d'accéder directement à la définition, étant donné que cette commande ne fait que rechercher le mot qui se trouve sous le curseur, mais si vous ne voulez pas vous occuper de la configuration des ctags pour le moment, vous pouvez au moins vous éviter d'avoir à retaper le nom de la fonction pour en rechercher la définition.

--Edit-- Bien que j'utilise g* depuis longtemps, j'ai récemment découvert deux raccourcis pour ces raccourcis !

(a) * passe à l'occurrence suivante du mot situé sous le curseur. (Il n'est pas nécessaire de taper le g (la commande "goto" dans vi).

(b) # va à l'occurrence précédente, de manière similaire.

N et n fonctionnent toujours, mais '#' est souvent très utile pour lancer la recherche dans le sens inverse, par exemple pour rechercher la déclaration d'une variable sous le curseur.

14 votes

La différence entre * y g* est la limite des mots sur la recherche. * fait un \<keyword\> recherche (identique à \bkeyword\b en regex régulier), tandis que g* recherche keyword sans limites de mots.

1 votes

Si vous avez une centaine d'occurrences d'une fonction dans un fichier, * il vous faudra en moyenne 50 visites avant de trouver la définition.

2 votes

@naught101, mais si vous avez deux occurrences de la fonction, * ne prendra en moyenne qu'un seul coup pour trouver la définition. A moins que vous ne fassiez * sur la définition, à quel point vous devriez probablement faire une courte pause...

59voto

0x90 Points 8193

Utilisez gd o gD en plaçant le curseur sur n'importe quelle variable de votre programme.

  1. gd  vous amènera à la déclaration locale.
  2. gD  vous amènera à la déclaration globale.

Vous trouverez d'autres options de navigation dans ici .

Utilisez cscope pour le référencement croisé de grands projets tels que le noyau linux.

1 votes

La question porte sur le passage à la "définition" et non à la "déclaration". Si une fonction est déclarée dans un fichier d'en-tête, par exemple test.h <key>g</key>+<key>d</key> vous amènera à la "déclaration". Une fois là, il n'y a aucun moyen de passer à la "définition" qui se trouve dans "test.c"... Existe-t-il un moyen de faire ce saut en utilisant COC ? @cpm a répondu à certaines questions, mais n'a pas expliqué ce saut.

1 votes

Je ne connais pas d'autre moyen que d'utiliser ctags -R * dans le terminal (dans le dossier du projet) et ensuite, dans vim, tapez la commande :tag <searched tag> . Après tant d'années, ce n'est toujours pas mis en œuvre... Je suis tellement déçu...

2 votes

@71GA Vous n'avez pas demandé sous ma réponse :) nmap <silent> gD <Plug>(coc-implementation) doit lier ce que vous voulez gD .

15voto

Mykola Golubyev Points 21210

Comme Paul Tomblin l'a mentionné, vous devez utiliser ctags . Vous pouvez également envisager d'utiliser plugins pour sélectionner la fonction appropriée ou pour prévisualiser la définition de la fonction sous le curseur. Sans plugins, vous aurez un mal de tête à essayer de sélectionner l'une des centaines de méthodes 'doAction' surchargées, car le support intégré des ctags ne prend pas en compte le contexte - juste un nom.

Vous pouvez également utiliser cscope et sa fonction "trouver un symbole global". Mais votre vim doit être compilé avec le support +cscope qui n'est pas une option par défaut de la compilation.

Si vous savez que la fonction est définie dans le fichier courant, vous pouvez utiliser la touche 'gD' en mode normal pour passer à la définition du symbole sous le curseur.

Voici le plugin le plus téléchargé pour la navigation
http://www.vim.org/scripts/scripts.php?script_id=273

En voici un que j'ai écrit pour sélectionner le contexte tout en sautant à la balise
http://www.vim.org/scripts/scripts.php?script_id=2507

0 votes

Salut @mykola-golubyev , le lien que vous avez fourni dans Detailed description section de #2507 script est cassé. Pouvez-vous en fournir un autre, s'il vous plaît ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X