Trucs et astuces Vim et Ctags [fermé]


485

Je viens d'installer Ctags (pour aider au développement C ++) avec mon Vim (ou plutôt gVim), et j'aimerais connaître vos commandes préférées, macros, raccourcis, astuces qui vont avec ...

Partagez votre meilleur arsenal. Quels autres modules complémentaires Vim recommanderiez-vous pour le développement C ++ sur Vim?

EDIT Quel autre module complémentaire utiliseriez-vous avec Ctags?

EDIT2 Quelle version de gVim utilisez-vous avec les balises? Est-ce que cela fait une différence?

EDIT3 Comment améliorez-vous votre expérience de programmation pour les grands et les petits projets?


15
Assurez-vous que vous utilisez des ctags exubérants (une implémentation moderne) pour de meilleurs résultats: ctags.sourceforge.net
idbrii

17
Peut-être que le kev n'est pas constructif?
Floyd

27
mais closed as not constructiveil y a presque deux ans, il est si constructif pour moi
sazary

15
Je pense que la vraie raison de la fermeture de cette question aurait dû être: "Cette question, bien qu'elle soit extrêmement utile, ne rentre pas dans la politique de StackOverflow de Q&R. questions et réponses".
Diego Pino

2
Je comprends pourquoi cette question a été close, étant donné les règles de SO. Mais signaler une question> 400 votes positifs avec une réponse> 300 votes positifs pour la suppression est un peu grincheux, n'est-ce pas?
DevSolar

Réponses:


394

Ctrl+] - aller à la définition
Ctrl+ T- revenir en arrière de la définition.
Ctrl+ W Ctrl+ ]- Ouvrir la définition dans une division horizontale

Ajoutez ces lignes dans vimrc
map <C-\> :tab split<CR>:exec("tag ".expand("<cword>"))<CR>
map <A-]> :vsp <CR>:exec("tag ".expand("<cword>"))<CR>

Ctrl+ \- Ouvrir la définition dans un nouvel onglet
Alt+ ]- Ouvrir la définition dans une division verticale

Une fois les balises générées. Vous pouvez utiliser les touches suivantes pour entrer et sortir des fonctions:

Ctrl+ Left MouseClick- Aller à la définition
Ctrl+Right MouseClick - Revenir à la définition


8
C -] => (touche de contrôle) et] touche C - T => (touche de contrôle) et touche T Juste pour les débutants à ctags. Merci pour le nouveau tour de tabulation
kumar

6
De même, après avoir divisé la fenêtre avec Ctrl-w C-]vous pouvez faire C-w T(alias Shift-t) pour changer cette division dans un nouvel onglet.
dash-tom-bang

1
@Will Si vous utilisez vim depuis le terminal, vous devez modifier les préférences du terminal pour que la touche d'option se comporte comme une touche alt. Si vous utilisez MacVim, ajoutez cette ligne à vimrc 'set macmeta'. Il y a doc pour macmeta,: h macmeta.
Amjith

17
g C-]est très utile. Il ouvre une boîte de dialogue rapide pour en sélectionner une parmi plusieurs définitions.
Vincenzo Pii

3
g]est également utile. Vous pouvez positionner le curseur sur le nom de la balise et appuyer sur g]pour obtenir une liste des balises correspondantes.
zeekvfu

176

Une ligne qui va toujours dans mon .vimrc:

set tags=./tags;/

Cela va chercher dans le répertoire courant les "balises", et remonter l'arborescence vers root jusqu'à ce qu'on en trouve un. IOW, vous pouvez être n'importe où dans votre arbre source au lieu de simplement la racine de celui-ci.


37
Monter à la racine est excessif. Je suggère de ne rentrer qu'à la maison à la place: tags + = tags; $ HOME
gotgenes

37
Les arbres sources sur lesquels je travaille ne sont pas toujours dans mon répertoire personnel ... et étant donné que $ HOME a tendance à être à deux répertoires de la racine ... eh bien, je peux me permettre deux recherches de répertoire supplémentaires. :)
uzi

6
Je suis d'accord avec uzi. Si mon cwd est / home / me / programming / foo / bar / baz / bang / bam, il ne s'agit que de 8 recherches de répertoire. Je suppose que cela dépend de votre tolérance à la vitesse, mais le temps de recherche 1 répertoire n'est pas sensiblement différent de 8 sur ma machine.
Nate Murray

1
Cela dépend de votre scénario, j'ai besoin d'utiliser la suggestion gotgenes sur une de mes machines car il y a environ 8 000 répertoires dans / home, et cela a tendance à être un peu lent.
jkerian

1
Y a-t-il quelque chose de similaire pour cscope?
szx

45

Un autre plugin utile pour le développement C est cscope Tout comme Ctags vous permet de passer aux définitions, Cscope saute à l' appel fonctions d' .

Si vous avez cscope dans votre répertoire ~ / bin /, ajoutez ce qui suit à votre .vimrc et utilisez g ^] pour accéder à la fonction appelante (voir: aide cscope).

if has("cscope")
    set csprg=~/bin/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
endif

Presque oublié ... Tout comme ctags - vous devez générer (et mettre à jour périodiquement) la base de données. J'utilise le script suivant

select_files > cscope.files
ctags -L cscope.files
ctags -e -L cscope.files
cscope -ub -i cscope.files

Où 'select_files' est un autre script qui extrait la liste des fichiers C et d'en-tête du Makefile. De cette façon, je n'indexe que les fichiers réellement utilisés par le projet.


Quel est l'avantage de cscope sur les ctags? Se complimentent-ils?
Whaledawg

4
Ils se complètent. Ctags trouve la définition d'un symbole ou d'une fonction. Cscope peut trouver tous les endroits appelant une fonction. leur utilisation facilite la navigation dans les grands arbres sources.
nimrodm

1
Cependant, AFAIK cscope a une compréhension limitée de C ++.
Luc Hermitte

C'est limité et pas très bon. Mais pour ce qu'il fait (sauter à USAGES), il n'y a pas de meilleure alternative. Son principal problème est que lorsque vous souhaitez passer aux appels de fonction (f), vous devez souvent passer à n'importe quel endroit où le symbole est utilisé à la place et filtrer les résultats mentalement ...
Greg Rogers

2
@Whaledawg Oui, lorsque j'appuie sur CTRL +] ma carte son envoie "clap.wav" en sortie :)
Patrizio Rullo

27

Vous pouvez ajouter des répertoires à votre recherche ctags. Par exemple, j'ai un index ctags construit pour Qt4, et je l'ai dans mon .vimrc:

set tags+=/usr/local/share/ctags/qt4


16

J'utilise ALT-gauche et ALT-droite pour sauter / pousser de / vers la pile de balises.

" Alt-right/left to navigate forward/backward in the tags stack
map <M-Left> <C-T>
map <M-Right> <C-]>

Si vous utilisez hjklpour le mouvement, vous pouvez cartographier <M-h>et à la <M-l>place.


n'est pas la même chose que ctrl -] et ctrl-t - Je suppose que votre suggestion est un peu plus nette.

@Sasha, Pardon? Je ne sais pas ce que tu dis. = X À noter, cela fonctionne également dans: aide.
strager

2
Je pense que c'est plus intuitif et plus propre que celui par défaut.
Ayman

1
@Ayman Mais viole également le principe de ne pas avoir à retirer les mains du homerow, comme utiliser hjkl vs les touches fléchées.
TankorSmash

@TankorSmash, quel principe?
strager

10

Plusieurs définitions du même nom

<C-w>g<C-]>ouvrez la définition dans un fractionnement, mais faites également ce :tjumpqui va à la définition ou, s'il y a plusieurs définitions, vous présente une liste de définitions parmi lesquelles choisir.


2
Semblable à la première commande, vim possède une :ptagcommande qui ouvre la définition dans une fenêtre d'aperçu.
idbrii

1
La fenêtre de prévisualisation est agréable car vous pouvez la fermer avec: pc depuis n'importe quelle autre fenêtre, sans avoir à déplacer au préalable le curseur sur la fenêtre de prévisualisation.
Heikki Naski

Il existe également une astuce autocmd avec ptag :h CursorHold-examplequi affiche la balise de l'élément sous le curseur dans la fenêtre d'aperçu après un délai configurable.
dash-tom-bang

+1 pour: tjump je suis maintenant lié: tjump <Cr><Cw> <CR> fonctionne mieux que <C -]> imho J'adorerais combiner ce comportement avec: ptag
Andreas Fliesberg

:helpest parfois génial ... voir :help CTRL-W_g}et:ptjump
Andreas Fliesberg

8

La commande que j'utilise le plus est C-] qui passe à la définition de la fonction sous le curseur. Vous pouvez l'utiliser plus souvent pour suivre plus d'appels. Après cela, Co vous ramènera d'un niveau, Ci va encore plus loin.


16
Ct remonte d'un niveau dans la pile C-], tandis que Co revient à une position précédente du curseur après un mouvement. Donc, si vous C-] à une fonction puis paginez vers le bas, Ct retournera immédiatement tandis que Co retournera au début de la fonction, puis reviendra à l'appel.
Greg Hewgill

6

J'ai trouvé le plug-in de liste de balises incontournable. Il répertorie toutes les balises qu'il connaît (fichiers que vous avez ouverts) dans une fenêtre séparée et facilite la navigation dans des fichiers plus volumineux.

Je l'utilise principalement pour le développement Python, mais cela ne peut être meilleur que pour C / C ++.


5

J'ai encapsulé la manipulation de balises dans un plugin expérimental de mes .

En ce qui concerne le développement de C dans vim, je l' ai déjà répondu là - bas : j'utiliser ma propre suite, et quelques autres plugins.



4

J'ai mis ce qui suit dans mon fichier .gvimrc, qui recherche dans l'arborescence à partir de n'importe quel point un fichier de balises lorsque gvim démarre:

function SetTags()
    let curdir = getcwd()

    while !filereadable("tags") && getcwd() != "/"
        cd ..
    endwhile

    if filereadable("tags")
        execute "set tags=" . getcwd() . "/tags"
    endif

    execute "cd " . curdir
endfunction

call SetTags()

Je régénère ensuite périodiquement un fichier de balises en haut de mon arbre source avec un script qui ressemble à:

#!/bin/bash

find . -regex ".*\.\(c\|h\|hpp\|cc\|cpp\)" -print | ctags --totals --recurse --extra="+qf" --fields="+i" -L -

7
Vous venez de réinventer la recherche vers le haut. Voir: h recherche de fichiers. Voir aussi stackoverflow.com/questions/563616/vimctags-tips-and-tricks/…
gotgenes

2

J'utilise vim dans les macos, et les ctags originaux ne fonctionnent pas bien, donc je télécharge le plus récent et configure make make install. J'installe ctgas dans / usr / local / bin / ctags (pour conserver l'original)

"taglist
let Tlist_Ctags_Cmd = "/usr/local/bin/ctags"
let Tlist_WinWidth = 50
map <leader>ta :TlistToggle<cr>
map <leader>bta :!/usr/local/bin/ctags -R .<CR>
set tags=tags;/
map <M-j> <C-]>
map <M-k> <C-T>

1

J'ai adapté la fonction de recherche SetTags () ci-dessus (qui devrait être remplacée par l'équivalent set tags+=./tags;/) pour fonctionner avec cscope. Semble fonctionner!

"cscope file-searching alternative
function SetCscope()
    let curdir = getcwd()

    while !filereadable("cscope.out") && getcwd() != "/"
            cd ..
                endwhile

    if filereadable("cscope.out")
            execute "cs add " . getcwd() . "/cscope.out"
                endif

    execute "cd " . curdir
    endfunction

call SetCscope()

3
Comme l'a dit gotgenes, vous venez de réinventer la recherche ascendante. Voir: h recherche de fichiers. Voir ce plugin pour un exemple pertinent.
idbrii

1

Une autre itération sur la fonction SetCscope () ci-dessus. Cela définit le pré-chemin cscope pour obtenir des correspondances sans être dans le répertoire où "cscope.out" est:

function s:FindFile(file)
    let curdir = getcwd()
    let found = curdir
    while !filereadable(a:file) && found != "/"
        cd ..
        let found = getcwd()
    endwhile
    execute "cd " . curdir
    return found
endfunction

if has('cscope')    
    let $CSCOPE_DIR=s:FindFile("cscope.out")
    let $CSCOPE_DB=$CSCOPE_DIR."/cscope.out"
    if filereadable($CSCOPE_DB)
        cscope add $CSCOPE_DB $CSCOPE_DIR
    endif

    command -nargs=0 Cscope !cscope -ub -R &
endif

3
Comme l'a dit gotgenes, vous venez de réinventer la recherche ascendante. Voir: h recherche de fichiers. Voir ce plugin pour un exemple pertinent.
idbrii
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.