Mots-clé : vim

vim : exemple concret de conversion de fichier C en fichier Pascal

Voici un aperçu des petites choses possibles avec les macros vim.
J’avais un énorme fichier include (fichier fmod.h) à convertir en Pascal, afin de pouvoir accéder à l’extraordinaire librairie de fmod. Pour information, cette librairie est gratuite et redistribuable en tant que telle si votre produit est gratuit et ne vous rapporte rien. Donc profitez en c’est une librairie aussi simple d’utilisation que puissante et stable.

Je vous explique juste le principe de base, avec un exemple concret, et vous verrez qu’il vous suffit de faire pareil pour les quelques autres conversions, et vous gagnerez quelques minutes, voire comme dans mon cas, quelques heures de travail (que vous auriez inévitablement perdues avec un autre éditeur) :

Voici un exemple de déclaration C :

typedef FMOD_RESULT
  (F_CALLBACK *FMOD_FILE_OPENCALLBACK)
    (const char *name, int unicode,
      unsigned int *filesize, void **handle, void **userdata);

La fonction finale déclarée en Pascal doit être ainsi :

FMOD_FILE_OPENCALLBACK =
  function (
    const name:Pchar; unicode:Integer;
    var filesize: Cardinal; handle:Pointer;
    userdata:Pointer):FMOD_RESULT;

Je vais vous expliquer les premiers pas : il faut convertir ces paramètres :
void **handle, void **userdata)
en :
handle:Pointer; userdata:Pointer)

Le principe des macros avec les expressions régulières est très simple, je vais la construire pas à pas :

– Va chercher la première chaine qui est void ** :
void \*\*\
Notez bien que comme les étoiles * sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.

– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z :
void \*\*\([a-z]\+\)
Au même titre que les étoiles *, et les antislashes \, les parenthèses () sont des caractères d’expression régulière, il faut mettre un antislash \ pour qu’elles ne soient pas interprétées.
Oui je le concède ça rend la lecture un peu difficile. Mais le temps gagné en vaut la chandelle croyez moi.
– Va chercher la première chaine qui est void ** et qui est suivie d’une chaine composée de au moins un caractère minuscule comprise entre a et z, et qui se termine par une virgule :
void \*\*\([a-z]\+\)\(,\{1\}\)
Ici aussi notez le \{1\} : ici, les crochets \{\} sont des caractères d’expression régulière donc il ne faudrait pas mettre d’antislash, mais comme il sont dans une expression qu’on recherche, il les faut. Bref, essayez une fois avec, une fois sans, et l’un des deux fonctionnera !

Expression finale :

Remplace toutes les chaines de type void **[caractères de a à z], par [caractères de a à z]: Pointer;  :
:%s/void \*\*\([a-z]\+\)\(,\{1\}\)/\1: Pointer;/g

Ainsi :
void **handle,
donnera :
handle: Pointer;.

Mais (et c’est là où c’est génial) :
void **autrenomdevariable,
donnera :
autrenomdevariable: Pointer;.

Et cela s’appliquera sur tout le fichier, quel que soit le nom de la variable.

Ensuite, il vous suffit de vous concocter toute votre séance de petites macros, et de les mettre dans un fichier.
Puis vous appelez :

vim -s macro_vim.cmd [nom du fichier]

et vim jouera la macro dessus.

vim : imap, ab, abbr ne fonctionnent pas ? Solution ici !

Exemple concret : un mapping sous vim c’est ça :
imap ooo Olivier

map signifie : lorsque je taperais ooo tu le transformeras en Olivier.
Le petit i de imap juste avant, signifie « uniquement en mode insertion« .

Pourtant, il peut arriver qu’en mode insertion ça ne fonctionne pas ! Si c’est votre cas, il y a une solution très simple : essayez de vous mettre en mode « nopaste » : essayez de taper l’ordre :

:set nopaste

Puis mettez vous en mode insertion soit « i » et ré-essayez. Ca devrait fonctionner.

Moi, je le fais par défaut (= j’ai ajouté :set nopaste dans mon fichier de configuration ~/.vimrc) au moins je ne suis pas ennuyé.

J’ai posé la question et j’ai eu la réponse sur stackoverflow ici.

L’explication est à peine plus longue. En fait, sous vim, tout ce qu’on tape est analysé. Si on a fait un imap ooo test, alors, lorsqu’on fait un copier-coller, et que dedans il y a ooo, alors vim va automatiquement faire la transformation. Dans presque tous les cas, lorsqu’on fait un copier coller, on ne veut pas que ça soit modifié ! Donc il faut préciser à vim : attention, je vais faire un « coller », alors s’il te plait, désactive tes « mappings ». L’ordre est très simple, il suffit de se mettre en mode paste et donc de donner l’ordre : :set paste. Là où on peut être dérouté, c’est que, justement, par défaut, vim est en mode paste, autrement dit tous les mappings clavier sont désactivés !

C’est une configuration pour les débutants, mais avec ce que je vous ai appris et tous les liens sur vim, vous n’êtes plus un débutant, pas vrai ?
Il vous suffit donc d’ajouter :set nopaste dans votre fichier de configuration ~/.vimrc. Les (rares) fois où vous aurez un copier coller particulier (par exemple avec la souris), il vous suffira de faire un

:set paste

puis juste après le coller, de dire qu’on a fini, et de ré activer les mappings :

:set nopaste

Aussi simple que ça !

vim : insérer nom du fichier courant

Tous mes fichiers php commencent ainsi :

 1 <?php
 2 /**
 3  * fichier decision.php
 4  *
 5  * @author Olivier Pons
 6  * @version 1.0
 7  * @since 1.0
 8  * @copyright Olivier Pons
 9  *
10  * @package Ajax
11  */
12

Comment faire de manière pratique, sous vim, pour s’assurer que la ligne :
* fichier decision.php
contient vraiment le bon nom du fichier.

C’est très simple (comme tout dans vim), mais il suffit de le savoir (comme tout dans vim) :

Je vais détailler pas à pas l’explication de la macro et au final la mettre en entier :

Il faut donner l’ordre en ligne de commande = deux points = « : »
Donc : :
Il faut lui dire de rechercher = pourcent = « % »
Donc : :%
Il faut lui dire que c’est une chaine qu’on recherche = s = « s »
Donc : :%s
Ensuite on précise qu’on a fini l’ordre = slash = « / »
Donc : :%s/
Ensuite on précise le premier paramètre = chaine à rechercher = « fichier  » = « fichier  »
Donc : :%s/fichier
Ensuite on précise que le premier paramètre est une expression régulière qui doit contenir la chaine à rechercher, mais aussi tout ce qui suit = « :%s/fichier \(.*\) »
Donc : :%s/fichier \(.*\)
NB : on est obligé de mettre des antislashes \(.*\) devant les parenthèses pour dire que ce sont des caractères spéciaux qui doivent être interprétés comme des commandes.
Puis premier paramètre = fini = slash = « / »
Donc : :%s/fichier \(.*\)/
Puis le second paramètre = ce qui va être remplacé. Là c’est comme pour les parenthèses juste au dessus : on précise que c’est un « calcul » a effectuer = signe « = » mais comme c’est un caractère à interpréter on est obligé de mettre l’antislash soit \=.
Donc : :%s/fichier \(.*\)/\=
NB : à partir du signe « \=« , vim sait que ce qui suit est un calcul, donc chaque parenthèse sera déjà interprétée comme un ordre, il n’y aura pas besoin de mettre d’antislash pour les caractères spéciaux telles que les parenthèses, et ce sur tout le paramètre en entier.
Ensuite on lui passe le calcul de l’expression que j’ai fait ainsi (à vous de l’adapter pour vous) : renvoyer le nom du fichier = expand('%') =» ici moi j’aurais « ./json_decision.php » ce qui ne me convient pas. Je voulais uniquement le nom du fichier, sans quoi que ce soit derrière. On peut préciser exactement quelle partie du nom on veut : tapez « :help expand » pour avoir toutes les possibilités. Ici, moi, je ne voulais que le nom du fichier sans rien derrière. Donc j’ai juste tapé : expand('%:t')
Puis second paramètre = fini = slash = « / »
Donc : :%s/fichier \(.*\)/\='fichier '.expand('%:t')/
Enfin en troisième paramètre, les options : il n’y en a aucune mais on aurait pu mettre « g » pour dire de faire ça de manière globale, soit :
:%s/fichier \(.*\)/\='fichier '.expand('%:t')/g

Mais comme je ne veux le faire qu’une seule fois, voici ma ligne finale :

:%s/fichier \(.*\)/\='fichier '.expand('%:t')

Donc en pratique : je liste tout un répertoire de fichiers php, que j’ouvre sous vim, et j’y applique une macro qui fait :
– rechercher/remplacer que je viens d’expliquer ;
– sauvegarde du fichier et on passe au suivant (« wn« ).

Ainsi, j’ai passé tous mes fichiers et tout a fonctionné comme sur des roulettes : je suis sûr que dans tout mon code, dans le commentaire de début, le nom du fichier est en adéquation avec le vrai nom !

Si vous avez des suggestions ou commentaires n’hésitez pas !

vim howto : comment installer un plugin

J’ai vu cet exceptionnel exemple de plugin ici.
Petite parenthèse : regardez d’ailleurs le site vimcasts.org, c’est vraiment un site exceptionnel pour tous ceux qui veulent apprendre des astuces géniales de vim.

Donc, comment installer un plugin ? Moi, habitué de Windows © je me suis dit « ça doit être très compliqué, je vais chercher sur la toile ».
Mais… c’est tellement simple que j’avais beau chercher partout, je n’ai pas trouvé de réponse !
Voilà en pratique comment j’ai fait.
Le plugin génial que j’ai vu ici, se trouve là : https://github.com/godlygeek/tabular

Je vais donc à cette adresse :
Page Internet du plugin Tabularize

Je le télécharge, et voici les fichiers que je trouve dedans :
Fichiers dans le plugin Tabularize

Je me dis « bon sang comment l’installer dans vim ? ».
En pratique, rien de plus simple. Très souvent, dans votre répertoire « home » (auquel vous accédez en tapant le tilde en ligne de commande : ~), concernant vim, il y a un dossier caché qui commence par un point : « .vim » (n’oubliez pas le point au début).
Allez dans ce dossier et regardez s’il y a un sous-dossier plugin. S’il n’y en a pas, créez le. Moi qui suis sous Windows, et qui m’en éloigne de plus en plus jour après jour, j’ai installé cygwin et mon « home » est dans C:\cygwin\home\Olivier. Voilà ce que ça donne après avoir crée le bon dossier :
Fichiers dans le plugin Tabularize
Ensuite il vous suffit de copier simplement les dossiers du plugin dans le répertoire « ~/.vim/plugin » et… tout fonctionne (dans mon cas c’est donc C:\cygwin\home\Olivier\.vim\plugin) !
Copier les fichiers du plugin Tabularize dans le répertoire plugin de vim

Si vous avez des suggestions n’hésitez pas !

vim : l'efficacité par la preuve directe

Depuis que j’ai vu ces vidéos, je sors avec plein de femmes, j’ai plein d’argent, et je suis aimé de la France entière.

Si vous parlez couramment l’Anglais, il faut absolument que vous voyez les vidéos de ce qu’il est possible de faire avec vim et qu’on n’a pas forcément en tête.

http://vimcasts.org/

Laissez d’autre sites en commentaire si vous avez des liens intéressants. Je n’hésiterai pas à les valider !

vim : expressions régulières rechercher remplacer (mémo)

Ci-suit une série d’expressions régulières qui fonctionnent sous vim, et dont j’ai fait la traduction en langue Française, afin que vous puissiez comprendre les subtilités :

  • /^ \+$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum un ou plus d’espaces (un antislash avant le « + »)
  • /^ *$ : rechercher toutes les lignes qui commencent et finissent par une suite de minimum zéro ou plus d’espaces (pas d’antislash avant le « * »)
  • /^ \*$ : rechercher toutes les lignes qui commencent par un espace et finissent par le caractère « * » (un antislash avant le « * »)
  • /^ \{1,1\}$ : rechercher toutes les lignes qui contiennent un et un seul espace (ne pas oublier l’antislash avant les « {} »)

Et maintenant une expression complexe qui m’a été très utile :
Si vous tapez exactement cela :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g

Vous aurez tous les ordres du type :

$this->Sejour_deb

Qui seront transformés en :

$this->SejourDeb

Très très utile.
Explication :

:%s/\($this->[a-z]\+\)\(_\)\(.\)/\1\u\3/g
: = exécuter un ordre ;
% = appliquer sur la totalité du document ;
s = appliquer sur la chaine (ici ligne par ligne) ;
\($this->[a-z]\+\) = groupe qui a $this-> puis une série de lettres ;
\(_\) = groupe qui a un tiret bas ;
\(.\) = groupe qui contient un caractère quel qu’il soit ;
On voit qu’il y a trois groupes, ils sont accessibles via antislash puis le numéro du groupe, exemple : »\1« , et le cas concret :
/ = remplacer par… ;

  • \1 le groupe numéro 1 ;
  • \u mettre en majuscule ;
  • \3 le groupe numéro 3 ;

/g faire toutes les occurrences trouvées.

vi et vim : chercher / remplacer (aide – explication rapide)

Comme je me sers souvent du rechercher / remplacer et que sous vim ce n’est pas évident au premier abord, j’en fais un résumé ici :

  • Rechercher « olivier » et remplacer par « famille » sans demander à chaque occurence trouvée :
    :%s/olivier/famille/g
  • Rechercher « olivier » et remplacer par « famille » et demander à chaque occurence trouvée :
    :%s/olivier/famille/gc
  • Rechercher « moi » et remplacer par « olivier » mais le mot en entier (exemple : le mot « moi » sera trouvé dans « je suis moi », mais pas « le mois de janvier ») :
    :%s/\\moi\\/olivier/gc
  • Rechercher « olivier » ou « inès » et remplacer par « famille » :
    :%s/olivier\\|inès/famille/g

NB : il faut taper le texte exactement comme il est écrit, par exemple si vous voyez :

:%s/olivier/moi/g

il faudra taper « deux points pourcent s slash (olivier) slash (moi) slash g » (entrée).

Je me suis inspiré de ce site en Anglais ici. J’en ai fait un court résumé / traduction.

Uzbl : un browser Web entièrement en ligne de commande !

C’est ici que vous pourrez voir cet « ovni » du monde Internet : http://www.uzbl.org/.

Il est en plusieurs parties : le coeur même du système, et un programme qui interagit avec lui, lui envoie des messages, et affiche son résultat de retour. Comme le coeur semble extrêmement bien fait, on est censé pouvoir faire tout un tas de choses, automatiquement : un cas concret, c’est l’exemple du second programme qui interagit avec le coeur : en pratique on a un navigateur. Et puis il a rajouté une troisième couche, un troisième programme qui interagit avec le second, et qui donne la possibilité de tout gérer par onglets. Comme tout est open source, et apparemment très bien écrit, il est possible de faire plein de choses.

Le second programme, il a décidé de faire en sorte que son comportement soit du style « vi », à savoir : tout se fait au clavier, il y a un mode « navigation » où les touches se comportement d’une certaine façon, et il y a le mode édition (touche « i » comme sur vi, pour les connaisseurs), où on peut entrer des informations dans les formulaires.

Dans la vidéo, sur le site, on voit qu’il va déjà bien plus vite en tapant sur son clavier qu’en utilisant la souris. Je pense que lorsqu’on va toujours sur des sites qu’on connait bien, on doit au final gagner beaucoup de temps.

Vim : aide et exemples excellents

Voici un site qui, si vous parlez Anglais, va vous faire gagner un temps fou :
http://vimcasts.org/
Ce sont des vidéos explicatives sur le fonctionnement de vim, avec toutes les options et surtout, pourquoi vim vous fait gagner du temps.

Ici aussi, si vous parlez Anglais, ce document explique pour les développeurs, comment gagner un temps fou avec vim.

Vim : mémo pour des ordres simples

Je vais ici mettre toutes les astuces au fur et à mesure que je les découvre :

Le fichier de configuration personnalisé par rapport à l’utilisateur connecté est :
~/.vimrc

Directement sous vim comment éditer le fichier de configuration :
:e $MYVIMRC

Pour mettre des espaces au lieu de tabulations :
set expandtab

Pour dire à combien d’espaces à insérer lorsqu’on appuie sur Tab :
set tabstop=2

Les macros :

  • Commencer l’enregistrement :
    q[lettre]
  • Terminer l’enregistrement :
    q
  • Rejouer une macro :
    @[lettre]

Directement sous vim comment éditer un fichier de coloration syntaxique :
:e $VIMRUNTIME/syntax/

Tiré de l’aide et ré-expliqué à ma sauce :

  • Donner un ordre uniquement applicable sur le fichier en cours :
    setlocal [ordre]
  • Aller à la ligne automatiquement si la taille dépasse 78 caractères :
    textwidth=78
  • Appliquer un ordre que si le fichier est de type « text » :
    autocmd FileType text [ordre]
  • Mélange des 3 précédents points :
    autocmd FileType text setlocal textwidth=78
    Explication : dès que le fichier est de type « text », appliquer uniquement sur ce fichier cet ordre : aller à la ligne automatiquement si la taille dépasse 78 caractères.

Lancer une commande shell sans quitter vim :
:![commande shell]

Lancer un commande shell sans quitter vim :
:sh
(puis quand vous avez fini, quitter le shell via Ctrl-d ou l’ordre « exit ») et vous revenez sous vim !

Si vous avez d’autres suggestions surtout n’hésitez pas !