Scripts et astuces pour développer avec VIM

Complétion automatique

La fonctionnalité omnifunc s'utilise avec les touches Ctrl+X Ctrl-O en mode insertion. Pour les premiéres versions de VIM 7, il faut l'activer :

autocmd FileType c set omnifunc=ccomplete#Complete

Le plugin OmniCppComplete permet d'avoir la complétion du C++ et ajoute la complétion au cours de la frappe : aprés avoir tapé "." ou "->", les attributs s'affichent.

" plugin omnicppcomplete
let OmniCpp_ShowAccess = 0
let OmniCpp_LocalSearchDecl=1

En plus de Ctrl-X Crtl-O, on peut utiliser Ctrl-n et Ctrl-p qui utilisent la completion omni (donc des tags) plus une completion intelligente avec le contenu des fichiers ouvert (pas besoin d'avoir généré/regénéré les tags pour les fichiers ouvert).

Le plugin echofunc affiche le prototype de la fonction aprés avoir tapé "(".

Navigation

Ouverture de fichier

Pour que le curseur soit positionné là où il était la dernière fois que l'on a fermé le fichier :

" jump to last known position when reopening a file
if has("autocmd")
    autocmd BufReadPost *
        \ if line("'\"") > 0 && line("'\"") <= line("$") |
        \   execute "normal! g`\"" |
        \ endif
    " begin commit message at first line
    autocmd BufRead,BufNewFile COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])
    autocmd BufRead,BufNewFile svn-commit.tmp call setpos('.', [0, 1, 1, 0])
endif

Les cas particuliers des messages de commits sont traités pour toujours commencer à la première ligne.

Liste de symbole

Le plugin taglist permet de visualiser les tags dans un "split" et le tag courant dans la barre de statut.

Voici un exemple de configuration avec une touche de raccourci :

" plugin taglist
let Tlist_Process_File_Always = 1
let Tlist_Exit_OnlyWindow = 1
let Tlist_Auto_Highlight_Tag = 1
let Tlist_Display_Prototype = 0
let Tlist_Display_Tag_Scope = 0
let Tlist_Show_One_File = 1
let Tlist_Compact_Format = 1
let Tlist_Enable_Fold_Column = 0
let Tlist_Inc_Winwidth = 0
let Tlist_Use_Right_Window = 1
" open/close tag list window with F8
map <silent> <F8> :TlistToggle<CR>

Pour afficher le nom de la fonction dans la barre d'état, il faut ajouter %([%{Tlist_Get_Tagname_By_Line()}]%) à statusline :

set laststatus=2
set statusline=%<%f\ %h%w%m%r%3.(\ %)%{fugitive#statusline()}%=%([%{Tlist_Get_Tagname_By_Line()}]%)%3.(\ %)%-14.(%l,%c%V%)\ %P

Visualiser les parenthèses, accolades, crochets

On peut déplacer le curseur sur la parenthèse correspondante avec la touche "%".

Pour mettre la parenthèse correspondante en surbrillance :

" show matching brackets
set showmatch

Recherche dans le fichier courant

Pour voir le résultat d'une recherche au cours de la frappe :

" highlight search
set hlsearch
" unhighlight current search
map <silent> <F11> :nohlsearch<CR>
imap <F11> <ESC><F11>a
" highlight search while typing
set incsearch
Ici, le raccourci F11 est utilisé pour annuler la surbrillance en cours.

ctags

cscope

" if compiled with --enable-cscope
if has("cscope")
    " use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t'
    set cscopetag
    " use ctags before cscope
    set csto=1
    " add any cscope database in current directory
    if filereadable("cscope.out")
        cscope add cscope.out
    " else add the database pointed by environment variable
    elseif $CSCOPE_DB != ""
        cscope add $CSCOPE_DB
    endif
    " show message when any other cscope db added
    set cscopeverbose
endif

génération des tags

" build tags database with shift+F8 or alt+F8 to ignore /usr/include
command! CtagsBuild
    \ :!echo 'building ctags database...' ;
    \   ctags --fields=+iaS --extra=+q --totals -R &&
    \   echo 'adding system headers...' ;
    \   find -exec gcc -M '{}' \; 2>&- | tr '[:space:]' '\n' | grep '^/.*' | sort -u |
    \   ctags --c-kinds=+px --c++-kinds=+px --fields=+iaS --extra=+q -aL-
command! CtagsKernelBuild
    \ :!echo 'building ctags database in kernel mode...' ;
    \   ctags --fields=+iaS --extra=+q --totals -R
command! CscopeBuild
    \ :!echo 'building cscope database...' ;
    \   cscope -bR
command! CscopeKernelBuild
    \ :!echo 'building cscope database in kernel mode...' ;
    \   cscope -bkR
if has("cscope")
    map <S-F8> :CtagsBuild<CR><CR>:CscopeBuild<CR><CR>:cscope reset<CR><CR>
    map <M-F8> :CtagsKernelBuild<CR><CR>:CscopeKernelBuild<CR><CR>:cscope reset<CR><CR>
else
    map <S-F8> :CtagsBuild<CR><CR>
    map <M-F8> :CtagsKernelBuild<CR><CR>
endif

Ctags pour une Lib externe (ex: Qt4)

Pour permettre la complétion d'une librairie avec le plug-in omnicompletion, il faut générer les ctags pour cette librairie.

Pour cela, le fichier ~/.ctags doit contenir:

--c++-kinds=+p
--fields=+iaS
--extra=+q 

puis il faut générer les tags:

ctags -f ~/.vim/qt4tags -R /usr/include/qt4

ou si on veut se passer de ~/.ctags

ctags -f ~/.vim/qt4tags -R /usr/include/qt4 --c++-kinds=+p --fields=+iaS --extra=+q

et enfin préciser à vim que les tags sont disponibles (dans vimrc)

set tags+=~/.vim/qt4tags

Ctrl-x-o permet alors de compléter le nom des fonctions ainsi que les "." ou "->"

Afficher la page man d'une fonction

" allow embedded man page
runtime! ftplugin/man.vim
" show contextual help with F1
nmap <silent> <F1> :Man <C-R>=expand("<cword>")<CR><CR>

Pour fonctionner correctement, il faut que les pages man de développement apparaissent en priorité :

export MANSECT=3:2:4:5:7:8:9:1:6

Indentation

On peut réindenter du code avec la touche "=" (préfixé ou en mode visuel).

Pour réindenter facilement du code que l'on copie :

" paste with reindent with Esc prefix
nnoremap <Esc>P P'[v']=
nnoremap <Esc>p p'[v']=
Ceci est trés utile pour déplacer du code à un endroit où le niveau d'indentation est différent.

Pour visualiser les espaces en trop ou les mixes espaces/tabulations dans l'indentation :

" show bad white spaces
let c_space_errors = 1
let python_space_error_highlight = 1
highlight link cSpaceError SpaceError
highlight link pythonSpaceError SpaceError
highlight SpaceError ctermfg=235 cterm=reverse

L'indentation d'un fichier peut-être automatiquement détectée et ajustée grâce au plugin indent_finder :

if has("autocmd")
    " enable file type detection and do language-dependent indenting
    filetype plugin indent on
    " detect indentation
    autocmd BufReadPost * execute system ('python ~/.vim/plugin/indent_finder.py --vim-output "' . expand('%') . '"' )
else
    set smartindent
endif

Pour ceux qui préférent les tabulations :

" tab=4
set tabstop=4
set shiftwidth=4
" real tabs
set noexpandtab
" use tabs at the start of a line, spaces elsewhere
set smarttab

Gestionnaires de versions

Intégration GIT

Le plugin fugitive propose un intégration plutôt réussie.

Pour afficher le nom de la branche dans la barre d'état, il faut ajouter %{fugitive#statusline()} à statusline :

set laststatus=2
set statusline=%<%f\ %h%w%m%r%3.(\ %)%{fugitive#statusline()}%=%([%{Tlist_Get_Tagname_By_Line()}]%)%3.(\ %)%-14.(%l,%c%V%)\ %P

Arbre d'annulation

La touche 'u' peut être utilisée pour annuler la dernière action effectuée.

Lorsque vous utilisez cette commande, Vim crée un arbre d'annulation et garde en mémoire toutes les commandes qui ont été annulées depuis l'ouverture du fichier. Le plugin Gundo permet d'afficher cet arbre d'annulation, de naviguer entre les annulations précédentes et d'afficher les différences avec le fichier actuel.

Topic revision: r6 - 28 Oct 2011 - 13:45:50 - PierreLemagourou
 
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback