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?
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. :)
Vous devriez pouvoir utiliser tn
et tp
pour accéder aux différentes balises correspondantes.
^]
pour vous rendre au premier match.:tn
pour passer à la suivante.:tn
trop de fois, vous pouvez taper :tp
pour revenir à la précédente.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 .
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>
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.
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.
Můžete stisknout tlačítko2pakCTRL+], pour faire savoir ce que vous devez faire, v Javě, pour obtenir des instructions détaillées.
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-]