Passer à la définition de fonction dans vim

Comment passer à une définition de fonction en utilisant vim? Par exemple avec L'aide visuelle, je peux taper Alt + g sous une fonction et il ouvre un menu contextuel énumérant les fichiers avec des définitions.

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

178
demandé sur pyrrhic 2009-03-11 21:27:27

11 réponses

utilisez des ctags. Générez un fichier tags, et dites à 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 de tags dans cette question .

149
répondu Paul Tomblin 2017-05-23 12:17:50

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

107
répondu Scottie T 2009-03-11 18:47:52

g* fait un travail décent sans ctags être mis en place.

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

passez directement à la définition, étant donné que cette commande ne cherche que le mot 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 à taper de nouveau le nom de la fonction pour rechercher sa définition.

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

(a) * va passer à la prochaine occurrence du mot sous le curseur. (Pas besoin de taper 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 commencer la recherche dans le sens inverse, par exemple, en cherchant la déclaration d'une variable sous le curseur.

86
répondu Brent Faust 2018-07-23 18:23:52

utilisez gd et gD , placez le curseur sur n'importe quelle variable de votre programme.

  1. gd vous mènera à la déclaration locale.
  2. gD vous mènera à la déclaration mondiale.

d'autres options de navigation peuvent être trouvées dans ici .

Utiliser cscope pour le renvoi projet de la taille de comme le noyau linux.

35
répondu 0x90 2014-06-28 02:09:09

comme Paul Tomblin l'a mentionné, vous devez utiliser ctags . Vous pouvez également utiliser plugins pour sélectionner un plugin approprié ou pour prévisualiser la définition de la fonction sous curseur. Sans plugins, vous aurez un mal de tête en essayant de sélectionner l'une des centaines de méthodes 'doAction' surchargées telles que construites dans le support de ctags ne prend pas en compte le contexte - juste un nom.

vous pouvez aussi utiliser cscope et de ses "trouver symbole mondial". Mais votre vim doit être compilé avec le support +cscope qui n'est pas par défaut une option de build.

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

voici le plugin le plus téléchargé pour la navigation

http://www.vim.org/scripts/script.php?script_id=273

En voici un que j'ai écrit pour sélectionner le contexte tout en sautant à l'étiquette

http://www.vim.org/scripts/script.php?script_id=2507

14
répondu Mykola Golubyev 2009-03-11 18:42:02

une Autre technique courante consiste à placer le nom de la fonction dans la première colonne. Cela permet de trouver la définition avec une recherche simple.

int
main(int argc, char *argv[])
{
    ...
}

la fonction ci-dessus peut alors être trouvée avec /^main dans le fichier ou avec :grep -r '^main' *.c dans un répertoire. Tant que le code est correctement indenté le seul moment où l'identificateur de se produire au début d'une ligne est à la définition de la fonction.

bien sûr, si vous n'utilisez pas ctags à partir de Maintenant, vous devriez avoir honte! Cependant, je trouve cette norme de codification un complément utile.

13
répondu Judge Maygarden 2010-10-12 13:55:50

1-Installer les ctags exubérants. Si vous utilisez osx, cet article montre un petit truc: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2 - Si vous ne souhaitez inclure les ctags pour les fichiers dans votre répertoire, exécutez cette commande dans votre répertoire:

ctags -R

cela créera un fichier" tags " pour vous.

3-Si vous utilisez Ruby et souhaitez inclure les ctags pour vos gemmes (cela m'a été très utile avec RubyMotion et les gemmes locales que j'ai développées), faites ce qui suit:

ctags --exclude=.git --exclude='*.log' -R * `bundle show --paths`

crédit: https://coderwall.com/p/lv1qww (Notez que j'ai omis l'option-e qui génère des tags pour emacs au lieu de vim)

4 - Ajouter la ligne suivante à votre ~/.vimrc

set autochdir 
set tags+=./tags;

(Pourquoi le point virgule: http://vim.wikia.com/wiki/Single_tags_file_for_a_source_tree )

5-allez au mot que vous voulez suivre et appuyez sur ctrl + ] ; si vous voulez revenir en arrière, utilisez ctrl+o (source: https://stackoverflow.com/a/53929/226255 )

10
répondu Abdo 2017-05-23 12:34:10

pour appuyer la réponse de Paul: Oui, ctags (en particulier exubérant-ctags ( http://ctags.sourceforge.net / )) est grande. J'ai aussi ajouté ceci à mon vimrc, donc je peux utiliser un fichier tags pour un projet entier:

set tags=tags;/
5
répondu David Wolever 2009-03-11 18:47:11

Je ne recommande vraiment pas l'utilisation d'étiquettes dans Vim. J'ai dû écrire mon propre plugin tags qui est plus avancé que tous les autres plugins tags, ainsi que laisser beaucoup de temps passer avant que je puisse enfin comprendre et accepter que les tags sont tout simplement trop limités et il ya trop de faux positifs.

au lieu de cela, je recommande d'utiliser des outils plus intelligents qui connaissent vraiment le langage avec lequel vous travaillez, la structure de votre projet, et le contexte à partir duquel vous essayez pour sauter à la définition de quelque chose. Par exemple, phpcd fonctionne très bien pour les projets PHP. Il utilise la réflexion PHP pour obtenir un aperçu de votre code. Il y a aussi d'autres options pour d'autres langues qui ne dépendent pas des tags.

4
répondu still_dreaming_1 2017-08-04 23:51:05

pour ajouter aux réponses précédentes:

la manière alternative et plus courante de faire ceci (et d'autres fonctionnalités de type VSC) serait d'exécuter un serveur de langue . Vous devez exécuter un processus séparé qui analyse votre code en temps réel et fournit des capacités à votre éditeur sélectionné (c'est une solution générale). Dans nvim (et, je pense, vim8 +) vous pouvez réaliser cette communication en installant deux plugins qui ensemble fournir une prise en charge du protocole de serveur de langue:

  1. deoplete - achèvement de balise fournisseur
  2. vim-lsp-client - LSP de soutien pour la balise d'achèvement des fournisseurs

vous pouvez trouver une liste des serveurs de langue développés activement et leurs capacités sur Lang Server site web.

et oui, le Protocole du serveur de langue était créé par Microsoft pour Visual Studio Code et publié comme un projet open source avec une licence MIT permissive (standardisée par la collaboration avec Red Hat et Codenvy).

2
répondu cprn 2018-07-06 08:59:49

Installer cscope . Il fonctionne beaucoup comme ctags mais plus puissant. Pour aller à la définition, à la place de Ctrl + ] , faire Ctrl + \ + g . Bien sûr, vous pouvez utiliser les deux simultanément. Mais avec un gros projet (disons un noyau Linux), cscope est loin devant.

1
répondu Diptendu Roy Chowdhury 2016-01-14 14:26:34