web-dev-qa-db-fra.com

Aller à la définition de fonction dans vim

Comment puis-je accéder à une définition de fonction à l'aide de vim? Par exemple, avec Visual Assist, je peux taper Alt+g sous une fonction et ouvre un menu contextuel listant les fichiers avec les définitions.

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

209
Jon Clegg

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

Il y a plus de balises astuces et astuces dans cette question .

183
Paul Tomblin

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

116
Scottie T

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

C'est à dire, tapez g,* (ou juste * - voir ci-dessous) pour rechercher le mot sous le curseur (dans ce cas, le nom de la fonction). Puis appuyez n aller au prochain (ou Shift-n pour la précédente) occurrence.

Il ne saute pas directement à la définition, étant donné que cette commande cherche simplement 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 de devoir -type 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!

(une) * passera à la prochaine occurrence du mot sous le curseur. (Pas besoin de taper le g, la commande 'goto' dans vi).

(b) # va à l'occurrence précédente, de la même manière.

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

95
Brent Faust

Utilisez Gd ou Gd en plaçant le curseur sur une variable de votre programme.

  1. Gd vous mènera à la déclaration locale.
  2. Gd vous mènera à la déclaration globale.

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

Utilisez cscope pour les références croisées de projets volumineux tels que le noyau Linux.

41
0x90

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

Vous pouvez aussi utiliser cscope et sa fonction de recherche de symbole global. Mais votre vim doit être compilé avec le support + cscope qui n'est pas une option de construction par défaut.

Si vous savez que la fonction est définie dans le fichier en cours, vous pouvez utiliser les touches "Gd" en mode normal pour accéder à la définition du symbole sous le curseur.

Voici le plugin de navigation le plus téléchargé
http://www.vim.org/scripts/script.php?script_id=27

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

14
Mykola Golubyev

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 simple recherche.

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

La fonction ci-dessus pourrait 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 mis en retrait, la définition de la fonction est la seule fois où l'identifiant apparaît au début d'une ligne.

Bien sûr, si vous n'utilisez pas ctags à partir de maintenant, vous devriez avoir honte de vous! Cependant, je trouve cette norme de codage un ajout utile également.

12
Judge Maygarden

1- installez des balises ctags exubérantes. Si vous utilisez osx, cet article présente un petit truc: http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html

2- Si vous souhaitez uniquement inclure les ctags pour les fichiers dans votre répertoire uniquement, 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 balises ctags pour vos gemmes (cela m'a été vraiment utile avec RubyMotion et les gemmes locales que j'ai développées), procédez comme suit:

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

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

4- Ajoutez 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 à la Parole que vous aimeriez suivre et tapez ctrl + ]; si vous souhaitez revenir en arrière, utilisez ctrl+o (source: https://stackoverflow.com/a/53929/226255 )

11
Abdo

La méthode moderne consiste à exécuter un serveur de langue - une application autonome distincte (une pour chaque langage de programmation) qui analyse votre projet dans son intégralité en temps réel et fournit des fonctionnalités à votre éditeur (solution générale). ). Vous obtenez des choses comme:

  • achèvement de balises sensibles aux espaces de noms
  • aller à la définition
  • trouver toutes les références à un objet
  • trouver tous les types implémentant une interface
  • renommer tout un projet
  • documentation en vol stationnaire
  • mise en forme, peluches et plus ...

Dans nvim et vim8 (ou supérieur), vous communiquez avec les serveurs lang en installant un plug-in Language Server Protocol:

  1. vim-lsp-client - gère la communication avec le serveur de langues
  2. deoplete - facultatif, déclenche l'achèvement de la balise à mesure que vous tapez

Vous trouverez une liste des serveurs de langues activement développés et de leurs fonctionnalités sur le site Web Lang Server .

Language Server Protocol a été créé par Microsoft pour Visual Studio Code et publié sous la forme d'un projet open source avec une licence permissive MIT (normalisée par la collaboration avec Red Hat et Codenvy).

Je recommande d'utiliser LSP avec DAP (protocole d'adaptateur de débogage) pour une expérience complète IDE dans l'éditeur de votre choix (plug-in DAP pour VIM: vimspector ).

6
cprn

Deuxième réponse de Paul: oui, les balises ctags (en particulier exuberant-ctags ( http://ctags.sourceforge.net/ )) sont excellentes. J'ai également ajouté cela à mon vimrc, afin de pouvoir utiliser un seul fichier de balises pour un projet entier:

set tags=tags;/
6
David Wolever

Je ne recommande vraiment pas d'utiliser des tags dans Vim. J'ai dû écrire mon propre plugin de balises, qui est plus avancé que tous les autres, ainsi que beaucoup de temps avant de pouvoir enfin comprendre et accepter que les balises sont trop limitées et qu'il y a trop de faux positifs.

Au lieu de cela, je recommande d'utiliser des outils plus intelligents qui connaissent vraiment la langue avec laquelle vous travaillez, la structure de votre projet et le contexte dans lequel vous essayez de passer rapidement à la définition de quelque chose. Par exemple, phpcd fonctionne très bien pour les projets PHP. Il utilise PHP réflexion pour mieux comprendre votre code. Il existe également d'autres options pour d'autres langues qui ne reposent pas sur des balises.

5
still_dreaming_1

Installez cscope. Cela fonctionne très bien comme ctags mais plus puissant. Pour aller à la définition, au lieu de Ctrl + ], faire Ctrl + \ + g. Bien sûr, vous pouvez utiliser les deux simultanément. Mais avec un gros projet (disons le noyau Linux), cscope a des kilomètres d'avance.

1

Après avoir généré les ctags, vous pouvez également utiliser les éléments suivants dans vim:

:tag <f_name>

Ci-dessus vous amène à la définition de la fonction.

0
Karun