LBSNDD : le blog sans nom de dimitri

Aller au contenu | Aller au menu | Aller à la recherche

jeudi 20 avril 2006

Incrémenter lors d'un copier-coller

Petite astuce brute de décoffrage que je viens de mettre en place et qu'il me faudra intégrer dans la prochaine version de spip.vim.

Je voulais pouvoir, d'une simple touche (donc avec macro derrière) insérer un tag <imgXX|center> à l'endroit où se trouve le curseur. Sachant que XX est le numéro de l'image et que je voudrais en prime que le XX inséré soit celui de l'image qui précède dans le fichier incrémenté de 1.

Attention, c'est vraiment du brut. J'utilise la fonction d'incrémentation [Ctrl] + A (notez le pendant [Ctrl] + X pour décrémenter). Pour l'utiliser, placez-vous en mode commande, à proximité (avant) d'une valeur numérique et pressez [Ctrl] + A. Le curseur se déplace automatiquement sur la prochaine valeur et incrémente de 1. Notez que si vous tapez 10[Ctrl] + A, vous incrémentez de 10. S'il y a un tiret devant la valeur, cela sera interprété comme un nombre négatif.

Voici maintenant mes macros (modes commande et insertion) :

map <F8> mz?<img<CR>Y'zP0<C-A>
imap <F8> <ESC>mz?<img<CR>Y'zP0<C-A>o

Détails :

  • mz place un marqueur nommé z à la ligne courante (utile pour y revenir) ;
  • ?<img<CR> recherche le motif « <img » en remontant le fichier ;
  • Y copie toute la ligne ;
  • 'z on revient sur la ligne marquée z ;
  • 0 on se place en début de ligne ;
  • <C-A> on incrémente la valeur numérique la plus proche (celle que l'on veut évidemment).

mercredi 19 avril 2006

Wikipédia dans ton éditeur de texte favori

Où comment arriver à ce que les gens pensent que Vim est plus un OS qu'un éditeur de texte (à non, la place est déjà prise...).

Vous connaissiez peut-être le greffon OOoWikipedia qui permet de rechercher un mot dans Wikipédia, l'encyclopédie libre, depuis OpenOffice.org. Voici comment faire avec Vim.

Cet exemple, assez simple, est également très modulable. En effet, il s'agit d'exécuter une commande externe avec pour argument le mot sous le curseur. Donc, vous pouvez choisir votre navigateur, mais également votre moteur de recherche. Les possibilités s'étendent donc à l'infini (enfin, presque...). Mais limitons-nous à un cas particulier : interroger Wikipédia et afficher le résultat dans Lynx (le site est à l'image du navigateur, très sobre). Oui, je choisis Lynx, car je trouve très classe de pouvoir ouvrir Wikipédia dans la même fenêtre que le texte que je suis en train de taper dans Vim (non, je ne suis pas faché avec ma souris !).

Et hop, la commande :

map <C-W> :!lynx http://fr.wikipedia.org/wiki/<cword><CR><CR>

Ici j'ai choisi de mapper la combinaison [Ctrl] + W sur cette commande. Détails :

  • ! introduit l'appel à une commande externe à Vim
  • <cword> mot-clé désignant le mot situé sous le curseur (je l'ai cherché longtemps, merci à G de me l'avoir souflé)
  • <CR> retour chariot ; deux sont nécessaires pour valider.

La commande précédemment citée est utilisable en mode commande. Voici celle pour le mode insertion.

imap <C-W> <ESC>:!lynx http://fr.wikipedia.org/wiki/<cword><CR><CR>i

La seule différence : on passe en mode commande au début (<ESC>) et on revient en mode insertion à la fin, ni vu ni connu (i).

Une piste de réflexion pour la suite : comment rechercher un groupe de mots (évidemment séparés par des espaces), à priori sélectionnés en mode visuel ?

Un début de troll (?) : on pourrait aisément se servir de Vim comme gestionnaire de fichiers et appeler des commandes externes suivant l'extension (mouais) ou le type Mime. On pourrait aussi afficher la météo de la ville dont le nom se trouve sous le curseur.

samedi 15 avril 2006

Template pour un header

Bonne résolution, je me remets à coder. Arriverais-je à pondre quelque chose de sympa ? Bien sûr que je vous montrerai !

Partir de zéro est toujours difficile. Le fameux syndrome de la page l'écran blanc (ou terminal noir dans mon cas...). Commençons par choisir de bons outils (tout en restant relatif et non trollesque) : Vim pour saisir le code en C.

J'ai vite remarqué que mes headers (fichiers inclus au moyen de la directive #include) avaient tous la même forme de base que voici (ici pour le fichier time.h) :

#ifndef __TIME_H__
#define __TIME_H__
 
#endif 

Vim propose un système de templates ou modèles. Lorsque vous créez un nouveau fichier, il peut ainsi être pré-remplit. Pour cela on utilise le système des autocommandes. Ajoutez cette ligne dans votre fichier .vimrc

au BufNewFile *.h 0r~/.vim/templates/h.h

au est l'abbréviation d'autocmd. On définit ici une commande à exécuter automatiquement lorsque l'événement BufNewFile se produit pour un fichier dont le nom correspondant au motif *.h. Ici, la commande 0r~/.vim/templates/h.h place le curseur au début de la ligne (0) puis lit et copie (r) le fichier ~/.vim/templates/h.h. C'est donc dans ce fichier sobrement nommé h.h (appelez-le comme vous voulez, mais gardez quand même l'extension pour la coloration syntaxique) que l'on va inscrire notre squelette.

Cependant nous n'avons ici qu'un contenu statique, c'est-à-dire que le fichier template est copié dans le nouveau fichier et c'est tout. Or, on aimerait bien, dans le cas des fichiers headers (et c'est d'ailleurs indispensable), pouvoir utiliser le nom du fichier pour nommer la constante qui nous sert à limiter à une l'inclusion dudit fichier. En gros, je voudrais, lorsque je crée toto.h, avoir automatiquement la constante __TOTO_H__ dans mon fichier.

Voici donc le fichier modèle h.h

#ifndef pipo
#define pipo
 
#endif 

On y inscrit un mot quelconque à l'endroit où devra se trouver le nom définitif de la constante. Puis, on complète l'autocommande :

au BufNewFile *.h 0r~/.vim/templates/h.h|exe "%s/pipo/__".substitute(toupper(expand("%")),'\.',"_","")."__/"

Ne partez pas tout de suite, je vous explique !

Le pipe | permet d'enchainer plusieurs commandes. Après avoir recopié le contenu du modèle nous exécutons la commande ci-dessus (tout ce qu'il y a après exe). Cette commande est constituée d'une substitution sur tout le fichier (%s/ancien motif/nouveau motif/). Nous remplaçons donc pipo par une chaîne commençant et finissant par __. Au milieu sera inscrit le résultat des appels imbriqués de trois fonctions.

  • % représente le nom du nouveau fichier.
  • expand("%") est nécessaire pour lire le contenu de la variable %.
  • toupper(str) convertit la chaîne str en majuscules.
  • substitute(str, motif, new, flag) remplace motif par new dans la chaîne str. Ici, on remplace le point (attention, le point est un caractère spécial, il faut le déspécialiser avec '\.') par un underscore.

Ceci devrait vous permettre de faire vos propres modèles interactifs !