Comment passer à l'appel de fonction?

14

Après avoir généré un fichier de balises avec exuberant-ctagsI, je peux passer d'un appel de fonction à sa déclaration, <C-]>ce qui est assez pratique.

Ma question est de savoir comment le faire dans l'autre sens? Lorsque mon curseur se trouve sur la définition d'une fonction, comment puis-je accéder aux lignes où la fonction est appelée?

Lorsque je regarde le fichier généré par ctags, je ne vois que des informations liées à l'emplacement de la définition et non des appels, cela signifie-t-il que je ne peux pas le faire, que Vim est une solution de contournement intelligente ou que j'ai besoin d'utiliser quelque chose autre chose que exuberant-ctags?

statox
la source
Ack ou Ag fonctionnera également et vous pouvez facilement trouver des wrappers de plugins pour ces outils de ligne de commande. Par exemple, github.com/mileszs/ack.vim et github.com/rking/ag.vim
dash-tom-bang

Réponses:

11

Vous ne pouvez pas passer aux appels de fonction avec ctags. Pour C / C ++ et Java, il existe cscope, et il s'intègre bien avec Vim (voir :help cscope). Pour d'autres langues, vous pourrez peut-être trouver un outil qui génère / exporte des cscopebases de données compatibles (fi hscopepour Haskell et starscopepour Ruby, Go et JavaScript). Vous pouvez également utiliser cscopeavec les bases de données mondiales GNU , en pointant cscopeprgsur gtags-cscope.

Sur une note latérale: si vous n'êtes pas découragé par une utilisation parfois déroutante d' Engrish,; ) vous voulez probablement aussi utiliser universal-ctags au lieu de exuberant-ctags. Ce dernier n'a pas été mis à jour depuis des années. Le premier est une fourche activement entretenue.

Sato Katsura
la source
Cscope prend-il en charge d'autres langages que C / C ++ et Java?
edi9999
@ edi9999 cscopelui-même prend en charge C / C ++, Lex et Yacc. La prise en charge de Java est marginalement utile. Vous pouvez obtenir un support pour (à l'ancienne) PHP et JavaScript depuis GNU global, via l' gtags-cscopeutilitaire. Et, comme je l'ai dit ci-dessus, il existe d'autres indexeurs qui peuvent exporter des cscopebases de données compatibles.
Sato Katsura
8

Vous ne pouvez pas faire ça avec ctags.

Essayez une alternative plus puissante comme cscope (qui a même sa propre section d'aide :):help cscope ou globale .

romainl
la source
Cscope prend-il en charge d'autres langages que C / C ++ et Java?
edi9999
Oui, au moins PHP et JavaScript.
romainl
1
@romainl Nope, cscopelui - même ne prend en charge ni PHP, ni JavaScript. Vous pouvez cependant indexer des fichiers PHP et JavaScript avec GNU global, puis exécuter gtags-cscopepour utiliser le gtagsfichier résultant avec cscope.
Sato Katsura
@SatoKatsura, oui, cscope prend en charge JavaScript (et CSS, apparemment).
romainl
2
@romainl Vous devriez envisager de regarder cscopeles sources de au lieu de spéculer sur la base d'expériences rapides. cscopea un analyseur C plutôt détendu. C'est tout ce qu'il a et tout ce qu'il fait. Avec cet analyseur, il "supporte" beaucoup de langues, pour des valeurs appropriées de "support". Les constructions sont reconnues tant qu'elles ressemblent plus ou moins à C. C'est pourquoi les classes Java fi et les nouvelles constructions PHP ne sont pas reconnues. Comparez fi avec starscope , ce qui permet en fait d'ajouter de nouvelles langues.
Sato Katsura du
8

Vous pouvez utiliser la commande grep de Vim pour rechercher tous les fichiers de votre projet:

:grep! "\<<cword>\>" . -r
:copen

Mettons cela dans un raccourci clavier:

nnoremap <F4> :grep! "\<<cword>\>" . -r<CR>:copen<CR>

Je trouve cette recherche clé à l'échelle du projet inestimable lorsque j'explore une grande base de code inconnue.

\<et \>sont des séquences d'expression rationnelle qui indiquent le début et la fin d'un mot, de sorte que vous n'obtiendrez pas de correspondances partielles. (L' -woption de grep pourrait être un autre moyen d'y parvenir.)

Cependant, il s'agit d'une recherche peu intelligente , elle peut donc produire des faux positifs si le même mot apparaît dans des contextes non liés.


À vrai dire, j'utilise à la place ma propre version modifiée du plugin grep.vim . C'est un peu plus convivial à utiliser:

  • Il vous permet de modifier le modèle de recherche, ainsi que la ligne de commande grep (afin que vous puissiez cibler des dossiers spécifiques comme src/ lib/au lieu de .) et se souvient des modifications.
  • J'ai ajouté le support pour csearch de Google . Cela peut être beaucoup plus rapide que grep car il construit un index des mots plutôt que d'analyser chaque fichier à chaque fois. Notamment, csearch utilise un standard regexp légèrement différent, donc \bdoit être utilisé à la place de \<et \>.

Je le configure et j'exclus certains fichiers standard comme celui-ci .

Pour un accès rapide, je crée deux raccourcis clavier . F3me permet de modifier la ligne de commande, F4utilise la ligne de commande précédemment configurée sans aucune touche supplémentaire. Le mécanisme est assez moche et pourrait utiliser un peu de nettoyage, mais il m'a bien servi.

joeytwiddle
la source