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?
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 vimrcmap <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
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.
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.
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
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.)
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>
.
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.
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.
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++.
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
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.
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 -
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>
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
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()