web-dev-qa-db-fra.com

Trucs et astuces de Vim et Ctags

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, macros, raccourcis et astuces favoris. .

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

EDIT Quel autre add-on utiliseriez-vous avec Ctags?

EDIT2 Quelle version de gVim utilisez-vous avec les tags? 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?

485
Sasha

Ctrl+] - aller à la définition
Ctrl+T - Sauter de la définition.
Ctrl+WCtrl+] - Ouvrir la définition dans une scission horizontale

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

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

Une fois les tags générés. Vous pouvez utiliser les touches suivantes pour baliser et baliser des fonctions:

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

394
Amjith

Une ligne qui va toujours dans mon .vimrc:

set tags=./tags;/

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

176
uzi

Un autre plugin utile pour le développement en C est cscope Tout comme Ctags vous permet de passer directement aux définitions, Cscope passe aux fonctions appelantes .

Si vous avez cscope dans votre répertoire ~/bin /, ajoutez ce qui suit à votre fichier .vimrc et utilisez g ^] pour accéder à la fonction appelante (voir: help 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.

45
nimrodm

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

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

Tout ce qui précède et ...

code_complete: paramètre de fonction complet, extraits de code, etc.

taglist.vim: navigateur de code source (supporte C/C++, Java, Perl, python, tcl, sql, php, etc.)

23
Johan

J'utilise ALT-left et ALT-right pour faire apparaître/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 hjkl pour le déplacement, vous pouvez mapper <M-h> et <M-l>.

16
strager

Plusieurs définitions du même nom

<C-w>g<C-]> ouvre la définition dans un fractionnement, mais fait également :tjump qui passe à la définition ou, s'il existe plusieurs définitions, vous présente une liste de définitions parmi lesquelles choisir.

10
Heikki Naski

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

8
raimue

J'ai trouvé le plug-in taglist indispensable. Il répertorie toutes les balises connues (fichiers que vous avez ouverts) dans une fenêtre distincte et facilite la navigation dans les fichiers plus volumineux.

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

6
Walter

J'adapte mes plugins vim depuis deux ans pour prendre en charge un projet assez puissant en c ++. Vous pouvez les regarder.

Ils utilisent ctags et cscsope.

http://www.vim.org/scripts/script.php?script_id=1638
http://www.vim.org/scripts/script.php?script_id=2507

5
Mykola Golubyev

J'ai encapsulé la manipulation des balises dans un plugin expérimental à moi.

En ce qui concerne le développement C++ dans vim, j’ai déjà répondu ici : j’utilise ma propre suite et quelques autres plugins.

5
Luc Hermitte

Je mets le texte suivant dans mon fichier .gvimrc, qui recherche dans l’arborescence un fichier de balises au moment de son démarrage 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 ressemblant à:

#!/bin/bash

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

J'utilise vim dans les macos, et les ctags d'origine ne fonctionnent pas bien, alors je télécharge le plus récent et configure make make install it. 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>
2
Zhenyu Li

Une autre itération sur la fonction SetCscope () ci-dessus. Cela définit cscope pre-path 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
1
saoret.one

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 travailler!

"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()
1
dergachev