juil 24 2009

Afficher les caractères spéciaux dans Vim

Tag: Logiciels divers, VimSylvain @ 16:52

De temps à autre, lors de l’écriture de scripts, il m’arrive d’accompagner l’appui de la touche espace de sa voisine, la touche « ALT-GR » ce qui du coup crée une espace insécable, invisible sur le moment jusqu’à ce que le script plante (la plupart du temps après un « pipeALT-GR + 8 »)…

Heureusement, grâce à Vim, il est possible d’afficher certains caractères spéciaux via les variables « list » et « listchars ».

« list » permet d’activer l’affichage des caractères spéciaux, on l’active en tapant « set list » et on le désactive en tapant « set list! » ou « set nolist ».
« listchars » contient la liste des caractères spéciaux à afficher séparés par des virgules (le « c » après le « : » étant le caractère de remplacement à afficher) :

  • Fin de ligne : « eol:c »
  • Tabulation : « tab:xy » (« x » étant le premier caractère de la tabulation, « y » étant le reste qui peut varier)
  • Espaces de fin de ligne : « trail:c »
  • Débordement à droite de la ligne par rapport à l’écran : « extends:c »
  • Débordement à gauche de la ligne par rapport à l’écran : « precedes:c »
  • Espace insécable : « nbsp:c »

Voici, pour exemple, les paramètres provenant de mon fichier « ~/.vimrc » :

" Affiche les caractères spéciaux
set listchars=nbsp:¤,tab:>-,trail:¤,extends:>,precedes:<
set list

Avant :
VIM (list = false)

Après:
VIM (list = true)

Sympa, non ? Merci vim ! :)


juil 22 2009

Habillez vos commentaires facilement grâce à Vim

Tag: Logiciels divers, VimSylvain @ 13:20

J’ai pour habitude d’afficher de jolis commentaires bien démarqués du code source afin de pouvoir les lire très rapidement sans devoir les chercher. Hors, selon les langages de programmation, ceux-ci ne s’écrivent pas de la même façon. Je vous propose donc une petite macro (à placer dans votre « ~/.vimrc ») permettant d’habiller facilement vos commentaires ; celle-ci étant accessible grâce à la touche F8 en mode normal.

Voici la macro en question :

map <F8> :call Comment()<CR>

function! Comment()
    let ext = expand("%:e")

    if ext == 'html' || ext == 'htm'
        execute "normal yyPPI<!--^[lDjI   ^[j^DI-->^[j"
        return
    endif

    if ext == 'php' || ext == 'js'
        execute "normal I// ^[A //^[yyPv$r/yyjpj"
        return
    endif

    if ext == 'txt'
        execute "normal I| ^[A |^[yyPr+lv$r-$r+yyjpj"
        return
    endif

    if ext == 'tex'
        execute "normal I% ^[A %^[yyPr%lv$r/$r%yyjpj"
        return
    endif

    if ext == 'c' || ext == 'cpp' || ext == 'cc' || ext == 'h' || ext == 'hpp'
        execute "normal yyPPI/*^[lDjI   ^[j^DI*/^[j"
        return
    endif

    " Style de commentaire par défaut
    if ext == 'sh' || ext == 'py' || ext == 'pl' || 1
        execute "normal I# ^[A #^[yyPr#lv$r/$r#yyjpj"
        return
    endif
endfunction

J’ai deux petites remarques à faire :

  1. « ^[ » correspond à « ECHAP » que l’on écrit en appuyant sur « CTRL+V » puis « ECHAP »;
  2. le style de commentaire par défaut doit être sur la dernière ligne à cause du test « || 1 » qui dans tous les cas validera la condition.

Voici le résultat obtenu selon le format de fichier :

  • Extension du fichier html ou htm :

    <!--
       Hello GNU Squad !
    -->
    
  • Extension du fichier php ou js :

    ///////////////////////
    // Hello GNU Squad ! //
    ///////////////////////
    
  • Extension du fichier txt :

    +-------------------+
    | Hello GNU Squad ! |
    +-------------------+
    
  • Extension du fichier tex :

    %///////////////////%
    % Hello GNU Squad ! %
    %///////////////////%
    
  • Extension du fichier c, cpp, h ou hpp :

    /*
       Hello GNU Squad !
    */
    
  • Extension du fichier sh, py, pl et tout le reste :

    #///////////////////#
    # Hello GNU Squad ! #
    #///////////////////#
    

À vous d’agrémenter ou de modifier selon vos besoins, si vous avez besoin d’aide, n’hésitez-pas à passer par les commentaires ;)


juin 25 2009

Gérer ses templates pour Vim sans fichiers externes

Tag: Logiciels divers, VimSylvain @ 12:50

Suite à un billet posté sur le site Informatique et liberté évoquant une solution originale pour gérer ses templates avec Vim, j’ai décidé d’améliorer un peu la technique en utilisant la puissance de ce superbe éditeur combinée à celle de sed.

Habituellement, pour chaque template, nous créons un fichier externe placé dans notre dossier personnel ~/.vim. Prenons l’exemple d’un template HTML dans ~/.vim/templates/html que l’on appellerait de cette manière dans notre fichier de configuration ~/.vimrc :

autocmd BufNewFile *.html 0r ~/.vim/templates/html

Logiciels utilisés :

  • Vim 7.2
  • GNU Sed 4.2

Le but du jeu est de centraliser toute notre configuration dans notre ~/.vimrc et donc d’y inclure nos templates. Le seul moyen, à ma connaissance, est de mettre ceux-ci en commentaires afin qu’ils n’interfèrent pas avec le reste de la configuration, il ne restera plus alors qu’à trouver le template adéquat, pour cela on passera par des marqueurs de début et de fin de template, voici donc ma solution :

" BEGIN HTML
" <html>
"     <head>
"         <title>Hello gnusquad !</title>
"     </head>
" </html>
" END HTML

autocmd BufNewFile *.html call Template('HTML')

function! Template(type)
    exe "0r !sed -n '/^\"\\s*BEGIN " . a:type . "$/,/^\"\\s*END " . a:type . "$/ {s///;/^$/d;s/^\" //;p}' $MYVIMRC"
    echo '--> INFO : Template ' . a:type . ' charge < --'
endfunction

Nous retrouvons donc en première partie le template mis en commentaire et délimité par les marqueurs « BEGIN HTML » et « END HTML », la deuxième partie appelle la fonction « Template » avec en paramètre « HTML » lorsque l'on crée un nouveau fichier ayant son nom correspondant au motif « *.html », la troisième et dernière partie contient la fonction « Template » proprement dite qui prend donc un paramètre servant à délimiter le template, on y trouve une jolie ligne de sed qui paraît obscure à première vue mais qui est très simple : on localise et ne traite que la partie contenue entre « BEGIN xxx » et « END xxx », on supprime ces deux lignes puis les lignes vides puis on décommente le template, le tout étant inséré dans le buffer courant. :)

Vous aurez donc compris qu'il est très simple d'ajouter de nouveaux templates : il suffit juste que le paramètre passé à la fonction « Template » corresponde à la partie présente après « BEGIN » et « END » de votre template. ;)