ubuntu-fr

Communauté francophone des utilisateurs d'Ubuntu

Planet Ubuntu-fr - Vim

Fil des billets

lundi, septembre 1 2008

Gravatar de Asher256Vim : mon vimrc personnalisé, pour mieux profiter de cet éditeur avancé ! via Asher256

Vim / gVim, éditeur texte, une icône

Vim a depuis assez longtemps été mon éditeur de texte préféré !

C'est un peu mon couteau suisse de l'édition de texte. Je l'utilise pour rédiger mes notes, modifier les fichiers de configuration de mes serveurs distants ou programmer (GShutdown ou Jargon Informatique ont été entièrement écrits avec cet éditeur !).

Les aspects qui m'ont toujours séduits dans cet éditeur c'est son côté geek, avec ses centaines de fonctions permettant de faire tout et n'importe quoi, et son extensibilité (j'en parlerai dans un autre billet, pour vous faire découvrir les plugins à ne pas rater), grâce aux plugins.

Une des choses légèrement ennuyantes avec Vim, quand on débute, c'est qu'il n'est pas par défaut configuré pour qu'on profite de toutes ses jolies fonctionnalités ; qui devraient pourant être activées d'office ! C'est pour cette raison que, avec le temps, j'ai créé puis amélioré mon vimrc, pour que Vim me permette de mieux travailler.

Pour vous faire gagner du temps, j'ai décidé de mettre en ligne mon vimrc, pour que tout intéressé puisse l'étudier, l'utiliser, le modifier, etc. et pourquoi pas proposer des améliorations !

Grâce au Vimrc disponible ci-dessous, vous profiterez des avantages suivants :

  • Des backups automatiques dans le répertoire ~/.vim/backup (pour ne pas encombrer vos répertoires de fichiers de sauvegarde finissant avec ~ par exemple)
  • Une indentation activée automatiquement lorsque vous éditerez un code source. Idem pour la colorisation syntaxique.
  • Quand vous chercherez dans votre texte avec un mot-clé, ce mot-clé se voit attribué une couleur de fond.
  • Les fichiers avec les extensions *.o, *.dll, *.so et *.a sont ignorés, quand vous utilisez l'astérisque (gain de temps pour sélectionner le fichier qui vous intéresse).
  • Quand vous utilisez l'astérisque et le bouton tab, pour sélectionner un fichier par exemple, un menu horizontal apparaît dans la barre des status, permettant de mieux sélectionner les fichiers.
  • Les PDFs sont lus d'une manière transparente, en utilisant pdftotext (logiciel à installer)
  • Des raccourcis claviers utiles sont ajoutés, comme ",lf", pour avoir la correction orthographique en français, ",le", pour avoir celle en anglais, ",ln" pour désactiver la correction orthographique, ",t" pour ouvrir un nouvel onglet, ",w" pour le fermer, ",m" pour cacher le menu de gvim, ctrl-a pour tout sélectionner, ctrl-c pour copier et ctrl-p pour coller et ",h" pour convertir un code source colorié en HTML.
  • Et bien d'autres options, que je vous invite à découvrir dans le script (que j'ai commenté pour vous rendre sa compréhension plus facile. Néanmoins, à la moindre lacune, n'hésitez pas à passer par l'aide de vim ":help" ou à poster un commentaire !)

Pour installer le script Sous GNU/Linux, mettez son contenu dans le fichier "~/.vimrc".

Le vimrc personnalisé (qui est aussi disponible en téléchargement) :

scriptencoding utf-8
"=============================================================================
"
" Fichier de configuration VIM personnalisé (meilleur pour la programmation,
" raccourcis clavier utiles, etc. pour mieux profiter de cet excellent
" éditeur).
"
" Auteur : Achraf cherti (aka Asher256)
" Email  : achraf at cherti dot name
"
" Licence : GPL
"
" Site: http://achraf.cherti.name/
"
"=============================================================================

" Options {{{1

" Options Internes {{{2

" Mode non compatible avec Vi
set nocompatible

" Le backspace
set backspace=indent,eol,start

" Activer la sauvegarde
set backup

" un historique raisonnable
set history=100

" undo, pour revenir en arrière
set undolevels=150

" Suffixes à cacher
set suffixes=.jpg,.png,.jpeg,.gif,.bak,~,.swp,.swo,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.pyc,.pyo

" Backup dans ~/.vim/backup
if filewritable(expand("~/.vim/backup")) == 2
    " comme le répertoire est accessible en écriture,
    " on va l'utiliser.
    set backupdir=$HOME/.vim/backup
else
    if has("unix") || has("win32unix")
        " C'est c'est un système compatible UNIX, on
        " va créer le répertoire et l'utiliser.
        call system("mkdir $HOME/.vim/backup -p")
        set backupdir=$HOME/.vim/backup
    endif
endif

" Inclusion d'un autre fichier avec des options
if filereadable(expand("~/.vimrc_local.vim"))
    source ~/.vimrc_local.vim
endif

" Activation de la syntaxe
if has("syntax")
    syntax on
endif

" Quand un fichier est changé en dehors de Vim, il est relu automatiquement
set autoread

" Aucun son ou affichage lors des erreurs
set errorbells
set novisualbell
set t_vb=

" Quand une fermeture de parenthèse est entrée par l'utilisateur,
" l'éditeur saute rapidement vers l'ouverture pour montrer où se
" trouve l'autre parenthèse. Cette fonction active aussi un petit
" beep quand une erreur se trouve dans la syntaxe.
set showmatch
set matchtime=2

" Afficher la barre d'état
set laststatus=2

" }}}2

" Options de recherche {{{2

" Tout ce qui concerne la recherche. Incrémentale
" avec un highlight. Elle prend en compte la
" différence entre majuscule/minuscule.
set incsearch
set noignorecase
set infercase

" Quand la rechercher atteint la fin du fichier, pas
" la peine de la refaire depuis le début du fichier
set hlsearch

" }}}2

" Options d'affichage texte {{{2

" Ne pas nous afficher un message quand on enregistre un readonly
set writeany

" Afficher les commandes incomplètes
set showcmd

" Afficher la position du curseur
set ruler

" Désactiver le wrapping
set nowrap

" Options folding
set foldmethod=marker

" Un petit menu qui permet d'afficher la liste des éléments
" filtrés avec un wildcard
set wildmenu
set wildignore=*.o,*#,*~,*.dll,*.so,*.a
set wildmode=full

" Format the statusline
set statusline=%F%m\ %r\ Line:%l\/%L,%c\ %p%%

" }}}2

" Options d'affichage GUI {{{2

" Configuration de la souris en mode console
" ="" pas de souris par défaut
"set mouse=a

" Améliore l'affichage en disant à vim que nous utilisons un terminal rapide
set ttyfast

" Lazy redraw permet de ne pas mettre à jour l'écran
" quand un script vim est entrain de faire une opération
set lazyredraw

if has("gui_running")
    map <S-Insert> <MiddleMouse>
    map <S-Insert> <MiddleMouse>

    set mousehide " On cache la souris en mode gui
    set ch=2 " ligne de commande dans deux ligne
endif

" }}}2

" Noms des fichiers {{{2

" faire en sorte que le raccourci CTRL-X-F
" marche même quand le fichier est après
" le caractère égal. Comme :
" variable=/etc/<C-XF>
set isfname-==

" }}}2

" }}}1

" Autocmd {{{1

set cindent
"set autoindent
"set smartindent

if has("autocmd")
    " Détection auto du format
    " + activer indent
    filetype plugin indent on

    augroup divers " {{{2
        au!
        " Textwidth de 78 pour tous les fichiers texte
        autocmd FileType text setlocal textwidth=78
       
        " Remet la position du curseur comme elle était avant
        autocmd BufReadPost *
        \ if line("'\"") > 0 && line("'\"") <= line("$") |
        \   exe "normal g`\"" |
        \ endif

        " La valeur des tabs par défaut
        autocmd BufNewFile,BufRead * call ChangeTabSize(4, 0)

        " Ne pas faire de wrap dans les fichiers ChangeLog
        autocmd BufNewFile,BufRead ChangeLog set nowrap textwidth=0
        autocmd BufNewFile,BufRead ChangeLog call ChangeTabSize(8, 0)

        " PKGBUILD
        autocmd BufNewFile,BufRead PKGBUILD set syntax=sh
    augroup END " }}}2

    augroup pdf " {{{2
        au!
        autocmd BufReadPre *.pdf set ro
        autocmd BufReadPost *.pdf %!pdftotext -nopgbrk "%" - | fmt -csw78
    augroup END " }}}2
endif

" }}}1

" Fonctions {{{1

" Fonctions utilisée par vimrc {{{2

function! ChangeTabSize(tab_size, expandtab)
    execute("set tabstop=".a:tab_size." softtabstop=".a:tab_size." shiftwidth=".a:tab_size)

    if a:expandtab != 0
        execute("set expandtab")
    else
        execute("set noexpandtab")
    endif
endfunction

" }}}2

" Les fonctions utiles pour l'utilisateur {{{2

" Aller dans le répertoire du fichier édité.
function! ChangeToFileDirectory()
    if bufname("") !~ "^ftp://" " C'est impératif d'avoir un fichier local !
        lcd %:p:h
    endif
endfunction

map ,fd :call ChangeToFileDirectory()<CR>

" Entrer la commande ":e" dans le répertiore du fichier édité
if has("unix")
    map ,e :e <C-R>=expand("%:p:h") . "/" <CR>
else
    map ,e :e <C-R>=expand("%:p:h") . "\" <CR>
endif

" }}}2

" }}}1

" Raccourcis clavier {{{1

" Vim 7 spell checker
if has("spell")
    setlocal spell spelllang=
    " Language : FR
    map ,lf :setlocal spell spelllang=fr<cr>
    " Language : EN
    map ,le :setlocal spell spelllang=en<cr>
    " Language : Aucun
    map ,ln :setlocal spell spelllang=<cr>
endif

set spellsuggest=5
autocmd BufEnter *.txt set spell
autocmd BufEnter *.txt set spelllang=fr

" Tabs
map ,t :tabnew<cr>
map ,w :tabclose<cr>
imap <C-t> <Esc><C-t>
imap <C-w> <Esc><C-w>
map <tab> gt

" Cacher le menu
map ,m :set guioptions=+M<cr>

" Mode normal
map ,mn :set guifont=<cr>

" Mode programmation
map ,mp :set guifont=Monospace\ 9<cr>

" Sélectionner tout
map <C-a> ggVG

" Copier (le gv c'est pour remettre le sélection)
map <C-c> "+ygv

" Couper
map <C-x> "+x

" Coller
map <C-p> "+gP

" Désactiver le highlight (lors d'une recherche par exemple)
map <F2> :let @/=""<cr>

" Convertir un html
map ,h :runtime syntax/2html.vim<cr>

" encoder rapidement
map ,c ggVGg?

" }}}1

" Les plugins Vim et leurs options {{{1

" Gérer les fichiers man
runtime ftplugin/man.vim

" }}}1

" vim:ai:et:sw=4:ts=4:sts=4:tw=78:fenc=utf-8:foldmethod=marker

mercredi, mars 5 2008

Gravatar de u-classroomu-classroom : suite du cours vim via u-classroom

La suite du cours Vim donné il y a 10 jours par yannick_lm aura lieu ce vendredi 07 mars à 20H00 (heure française métropolitaine), toujours sur le canal #u-classroom du réseau irc freenode.

Si vous n'avez pas pu suivre la première session, le cours est en ligne.

A vendredi !

jeudi, février 14 2008

Gravatar de u-classroomProchaine session : vim via u-classroom

Qui n'est jamais passé par là... Démarrage de vim (généralement par un complet hasard), râleries parce que cet éditeur bizarre n'a pas l'air de marcher (jusqu'à ce qu'on tombe sur la bonne touche, mais sans comprendre ce qui s'est passé), et fermeture violente de console parce qu'impossible de trouver comment sortir de l'éditeur :)

C'est Yannick LM qui sera le professeur pour la session classroom sur vim. Elle se déroulera le vendredi 22 février à 20 heures (heure métropolitaine, 19H00 UTC), sur le canal #u-classroom du réseau irc freenode.

Aucun prérequis n'est nécessaire à ce cours, si ce n'est une installation du logiciel ('sudo apt-get install vim' pour debian et dérivés).

Une fois vim maîtrisé, vous ne verrez plus votre console du même oeil ! Et vous pourrez profiter de la seconde session (dont la date sera donnée ultérieurement).

A bientôt sur #u-classroom !

vendredi, décembre 7 2007

Gravatar de adminSquelette de documentation des fonctions C/C++ avec vim via Administrateur

Bon, j'avoue, le titre ne veut rien dire, mais faut m'excuser, il est tard, skateinmars a pas arrêté de m'embêter, etc, etc ...

Le but de ce petit topic est de vous montrer comment générer un début de docmentation des fonctions C sous vim.

D'abord, le code. Prenez une chaise, des aspirines, un grand verre, de l'eau . Vous êtes prêt :

map T :copy.<ESC>k<ESC>:.!sed -r 's@(.[^ ]*) (.[^\(]*)\((.*)\).*@/**\n* \@name \2 :\n* \@Param \3 :\n* \@Return \1 :\n*/@; s/,/ :\n* \@Param /g; s/ [ ]+/ /g;' <CR><CR>

J'avais prévenu :)

Alors ça fait quoi ça ? Ca va générer à l'aide d'une simple touche de raccourci un squelette de documentation compatible doxygen & autres. Vous mettez cette petite ligne à la fin de votre ~/.vimrc, vous enregistrez tout ça et vous ouvrez votre code source C préféré.

Placez vous sur la ligne de déclaration d'une fonction par exemple :

 int main (int argc, const char ** argv) { 

et, en mode commande, appuyez sur T (shift + t).

Et là magie, vous voyez apparaître ceci au dessus de la déclaration :

/**
* @name main :
* @Param int argc :
* @Param const char ** argv :
* @Return int :
*/

Si ça ne marche pas c'est que :

  • Vous avez mal fait
  • J'ai mal fait

Dans le premier cas, reprenez vous, que diable ! Dans le second, tant pis pour vous je vais me coucher :)

PS : un GRAND GRAND merci au petit petit gapz qui du fond de sa cave m'a grandement aidé à faire ça (pour ne pas dire qu'il a fait de loin le plus dur) :)

jeudi, décembre 6 2007

Gravatar de u-classroomSquelette de documentation des fonctions C/C++ avec vim via u-classroom

Bon, j'avoue, le titre ne veut rien dire, mais faut m'excuser, il est tard, skateinmars a pas arrêté de m'embêter, etc, etc ...

Le but de ce petit topic est de vous montrer comment générer un début de docmentation des fonctions C sous vim.

D'abord, le code. Prenez une chaise, des aspirines, un grand verre, de l'eau . Vous êtes prêt :

map T :copy.<ESC>k<ESC>:.!sed -r 's@(.[^ ]*) (.[^\(]*)\((.*)\).*@/**\n* \@name \2 :\n* \@Param \3 :\n* \@Return \1 :\n*/@; s/,/ :\n* \@Param /g; s/ [ ]+/ /g;' <CR><CR>

J'avais prévenu :)

Alors ça fait quoi ça ? Ca va générer à l'aide d'une simple touche de raccourci un squelette de documentation compatible doxygen & autres. Vous mettez cette petite ligne à la fin de votre ~/.vimrc, vous enregistrez tout ça et vous ouvrez votre code source C préféré.

Placez vous sur la ligne de déclaration d'une fonction par exemple :

 int main (int argc, const char ** argv) { 

et, en mode commande, appuyez sur T (shift + t).

Et là magie, vous voyez apparaître ceci au dessus de la déclaration :

/**
* @name main :
* @Param int argc :
* @Param const char ** argv :
* @Return int :
*/

Si ça ne marche pas c'est que :

  • Vous avez mal fait
  • J'ai mal fait

Dans le premier cas, reprenez vous, que diable ! Dans le second, tant pis pour vous je vais me coucher :)

PS : un GRAND GRAND merci au petit petit gapz qui du fond de sa cave m'a grandement aidé à faire ça (pour ne pas dire qu'il a fait de loin le plus dur) :)

dimanche, avril 15 2007

Gravatar de tigrouQuelques trucs avec ViM #2 via tigrou

Voici la suite du billet Quelques trucs avecViM #1 qui, comme le suggèrait le #1, a bien une suite :) Voici donc 3 petits trucs qui me simplifient la vie presque tous les jours.
Note : les captures d'écran sont des GIF animés, il est possible de les revoir en cliquant dessus pour faire apparaître la page dédiée à l'image.

Mise en valeur de la ligne courante

Une fonctionnalité que l'on voit dans beaucoup d'éditeurs de texte avancés ou IDE est la mise en valeur de la ligne courante. Depuis vim 7, disponible depuis Ubuntu Edgy Eft , cette fonctionnalité est directement dans l'éditeur. Dans un terminal, la ligne est soulignée alors que dans la version graphique, il est possible de définir une couleur de fond, pour ma part, j'utilise les lignes suivantes dans mon .gvimrc pour avoir une ligne légèrement surlignée de bleu/gris dans la version graphique uniquement :

set cursorline
hi CursorLine guibg=#e7ebff

Les folds sur mesure

Beaucoup d'éditeurs proposent la possibilité de "pliage/dépliage" (fold/unfold) des structures de contrôle et/ou des commentaires. Il est possible de faire la même chose dans vim mais j'apprécie assez peu cette fonctionnalités. Par contre, il est possible de définir des zones "pliables" sur mesure ce qui peut être pratique pour être à deux endroits éloignés dans le code sans ouvrir deux buffers sur le même fichier. Pour commencer à l'utiliser, le plus simple est de passer en mode visuel en tapant v depuis le mode commande, de sélectionner quelques lignes de texte avec les déplacements habituels et puis de faire zf pour créer la zone pliée. Pour la déplier, il suffit de taper zo (Fold Open), pour la replier zc (Fold Close). Si on n'a plus besoin de la zone, on peut faire zd (Fold Delete) pour supprimer la possibilité de pliage/dépliage, le texte reste intact. Il est possible d'avoir un repère visuel où des zones pliables sont positionnées en fixant la variable foldcolumn, par exemple à 2 en tapant ":set foldcolumn=2", ce qui donne :

Les zones sont imbricables et beaucoup de raccourcis existent pour les manipuler. Plus d'informations le folding dans l'aide de vim .

Les abbréviations

Lorsqu'on écrit du code, on utilise régulièrement les mêmes constructions syntaxiques, il peut être avantageux de définir des abbréviations permettant de taper rapidement ces séquences. Dans eZVim , un plugin vim pour eZ Publish , j'en définis quelques unes, par exemple :

iabbrev ezfe {foreach __ as $k => $val}{/foreach}
match Error / __ /

La première ligne indique à vim de remplacer la chaîne ezfe suivie d'un espace par le reste de la ligne (foreach) en mode insertion. représente une frappe sur la touche "Entrée". La seconde ligne dit à vim de reconnaître la chaîne " __ " comme une erreur ce qui permet de voir rapidement les points à complèter dans ce qui vient d'être inséré pour obtenir un code syntaxiquement correct :

Plus d'informations sur les abbréviations dans l'aide de vim .

lundi, février 19 2007

Gravatar de tigrouQuelques trucs avec ViM #1 via tigrou

ViM est un formidable éditeur de texte. Bien sûr celui-ci demande un peu d'investissement avant d'être productif mais une fois franchi ce cap, il est vraiment très agréable de garder les mains sur le clavier pour toutes les tâches d'édition. Il est aussi très pratique d'utiliser le même éditeur de texte pour éditer un fichier de configuration au coup par coup sur un serveur et pour écrire de manière plus élaborée (programmation, e-mail, ...), on finit même par taper des commandes ViM dans le terminal ce qui oblige à définir des alias bizarres :-)

Je ne vais pas faire ici une introduction à l'utilisation de ViM car cela a déjà été bien fait mais plutôt donner quelques recettes de cuisine bien pratiques.

Le fichier .vimrc

Pour commencer, il faut configurer la bête :-) Pour cela, il faut créer ou éditer le fichier .vimrc dans votre dossier personnel, par exemple avec vim. Voici un .vimrc de base :

set nocompatible                " pas compatibilité avec vi
 
" priorité faible pour les fichiers avec les extensions
" suivantes lors du complètement
set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc
set history=50                  " 50 lignes dans l'historique
set ruler                       " affiche la position du curseur en bas
set sm                          " affiche la parenthèse correspondante
 
set formatoptions=tcroqn        " indentation
set autoindent
set cin
set textwidth=0                 " pas de coupure de ligne par défaut
set backspace=2
set ts=4                        " tabulation sur 4 caractères
set sw=4
 
set nobackup                    " pas de fichier backup
set dir=~/tmp                   " fichier temporaire dans ~/tmp (il faut qu'il existe !)
set autowrite
 
set hlsearch                    " surligne les recherches
set incsearch                   " recherche au fur et à mesure
 
syntax on                       " coloration syntaxique
set background=dark             " fond noir par défaut

Ce fichier est évidemment à adapter en fonction de votre utilisation, constitue déjà une bonne base pour se faciliter l'édition avec ViM. Comme toujours, en cas de doute sur un paramètre, il ne faut pas hésiter à consulter l'aide très complète en tapant :help le_paramètre pour voir de quoi il retourne.

Quelques trucs rapides

Afficher les numéros de lignes

Il suffit de taper :set nu et :set nu! pour les cacher. Si vous voulez toujours afficher les numéros de ligne, il suffit d'ajouter set nu dans votre .vimrc.

Éditer des fichiers distants via SSH

Il est bien sûr possible de se connecter en SSH et d'utiliser ViM sur la machine distante, mais il n'est peut être pas configurer voire pas installé du tout... La commande suivante me permet d'éditer mon .bashrc et le fichier /tmp/unfichier sur ma Dedibox :

$ vim 'scp://tigrou@pwet.fr/.bashrc' 'scp://tigrou@pwet.fr//tmp/unfichier'

Trier les lignes d'un fichier

ViM ne sait pas le faire directement, par contre, on peut utiliser la commande externe sort pour le faire. Pour cela, il suffit de taper :%!sort, ce qui aura pour effet de donner le contenu du buffer courant en entrée de la commande sort et de le remplacer par sa sortie.

Insèrer le résultat d'une commande

En tapant :%!la_commande, on remplace le contenu du buffer par la sortie de la commande. En tapant :r!la_commande, on insère son résultat. Par exemple pour insérer la date courante, on peut faire :r!date.