web-dev-qa-db-fra.com

Récupère les ctags dans vim pour aller à la définition, pas à la déclaration

J'ai le problème que ctags dans vim/gvim m'emporte souvent dans une déclaration forward au lieu de la définition même de la fonction.

Un moyen de contourner ça?

45
Robert S. Barnes

Je pense que le moyen le plus simple est d'utiliser "g ctrl-]" au lieu de "ctrl-]". S'il n'y a qu'une seule correspondance, cela vous y mènera. S'il y a plusieurs correspondances, elle les listera toutes, vous permettant de choisir celle que vous voulez, comme: tselect. Le meilleur des deux mondes. :)

68
Derek

Vous devriez pouvoir utiliser tn et tp pour accéder aux différentes balises correspondantes.

  • Appuyez sur ^] pour vous rendre au premier match.
  • Si ce n'est pas la correspondance souhaitée, tapez :tn pour passer à la suivante.
  • Si vous avez tapé :tn trop de fois, vous pouvez taper :tp pour revenir à la précédente.
9
Nathan Fellman

Je crois que Vim va par défaut à la première balise du fichier de balises. Vous pouvez en sélectionner un autre si vous préférez: utilisez :tj (semblable à: tselect, mais saut automatique s'il n'y a qu'une seule correspondance) ou Ctrl-] suivi de :tn).

Le seul moyen de changer la valeur par défaut est de changer l'ordre du fichier de balises, mais je ne crois pas que ctags offre une option de ligne de commande pour le faire.

Ce n'est pas aussi difficile que cela en a l'air, car vous avez essentiellement besoin d'un script qui ouvre le fichier de balises, le trie par type de balise et le réécrit. Le "type" dans la balise est un caractère unique décrivant s'il s'agit d'une fonction (f), d'un prototype de fonction (p), d'une macro, d'un nom énuméré, etc., etc. Si vous utilisez Linux, cela pourrait: en théorie, soyez aussi simple que:

#!/bin/sh
ctags -R -f - . | tac > tags

Puisque tac inverse l'ordre des lignes dans un fichier, la définition sera automatiquement placée en premier. Cependant, cela devient un peu plus compliqué car l’en-tête doit être conservé et Vim préfère que le fichier de balises soit trié. Il est donc préférable de parcourir le fichier et de trier la première entrée (le nom de la balise) dans l’ordre genre dans l'ordre inverse. Par conséquent, quelque chose de plus compliqué peut être mieux.

Je m'excuse pour le plug éhonté, mais j'ai écrit un plugin Vim qui (indirectement) fait ce dont vous avez besoin. Il est destiné à ajouter de nombreux groupes de surbrillance supplémentaires pour des noms tels que les noms de fonction, les macros, les énumérations, etc. Toutefois, cela permet notamment de trier à nouveau le fichier de balises de sorte que l'implémentation de la fonction passe avant la réaliser ce que vous voulez (j'ai eu le même besoin que vous). Si vous ne souhaitez pas utiliser la fonctionnalité de surbrillance, vous pouvez probablement la supprimer facilement: il s'agit d'un programme python assez simple et d'un script Vim encore plus simple. Il est disponible à partir de mon site .

8
DrAl

En retard à la fête, mais pour les googlers vim tag entrants:

J'ai trouvé que cscope, en plus de ctags, était la voie à suivre, du moins pour le C/C++. Il est plus intelligent en ce qui concerne les arbres d’appel, et vous pouvez le définir sur ctags en cas d’échec. Il suffit de lancer "cscope -b" à chaque fois que vous exécutez ctags -R. et vous serez prêt à partir. Si vous utilisez les paramètres ci-dessous, vous pourrez utiliser Ctrl -]/Ctrl-T comme toujours, mais vous pouvez également ajouter de nouveaux sauts astucieux, comme sauter à une déclaration de fonction et afficher une liste de sauts de fonctions appelants.

" setup
if has("cscope")
    set csto=0                                                                             
    set cst
    set nocsverb
    " add any database in current directory
    if filereadable("cscope.out")
    cs add cscope.out
    " else add database pointed to by environment
    elseif $CSCOPE_DB != ""
    cs add $CSCOPE_DB
    endif
    set csverb
endif

" jump to a function declaration
nmap <silent> <C-\> :cs find s <C-R>=expand("<cword>")<CR><CR>1<CR><CR>
" show a list of where function is called
nmap <silent> <C-_> :cs find c <C-R>=expand("<cword>")<CR><CR>
2
Steve Goranson

Cette option a fonctionné pour moi mieux

Mettez la ligne suivante dans votre fichier .vimrc et vous pouvez maintenant utiliser un double clic de souris (sur le variable/entry de votre fichier) pour passer à l’emplacement marqué. Si un seul match est trouvé, il sautera immédiatement. Si plusieurs entrées correspondent, il sera demandé à l'utilisateur d'entrer.

:map <2-LeftMouse> g< c-]>
:tselect my_little_function 

et vous obtiendrez une liste de correspondances ..__ou ou si vous sautez à une balise et que vous n'êtes pas satisfait, tapez

:tselect

Et vous obtenez une liste d'alternatives pour la dernière balise active.

1
Johan

Ajoutez les éléments suivants à votre fichier .vimrc:

noremap <c-]> 2<c-]>

Cette ligne force vim à passer automatiquement à la deuxième correspondance (au lieu de la première), qui est généralement la définition de la fonction.

1
Yariv

Můžete stisknout tlačítko2pakCTRL+], pour faire savoir ce que vous devez faire, v Javě, pour obtenir des instructions détaillées.

0
César Alforde

Il y a plusieurs façons de faire passer Vim directement à une balise, s'il n'y a qu'une seule balise correspondante, sinon présenter une liste de correspondances de balises.

Vous pouvez utiliser la commande 'tjump'. Par exemple, la commande ':tjump func1' passera à la définition func1, si elle n'est définie qu'une fois. Si func1 est défini plusieurs fois, une liste de balises correspondantes sera présentée.

Vous pouvez positionner le curseur sur la balise et appuyer sur g Ctrl-].

Vous pouvez sélectionner visuellement un texte et appuyer sur g Ctrl-] pour sauter ou lister les tags correspondants.

Vous pouvez utiliser la commande 'stjump'. Cela ouvrira la balise correspondante ou sélectionnée de la liste des balises dans une nouvelle fenêtre.

Vous pouvez appuyer sur Ctrl-W g Ctrl-] pour faire un: stjump.

Help: :tjump, g_Ctrl-], v_g_CTRL-], :stjump, Ctrl-W_g_Ctrl-]
0
tito11