Vim sauve des developpeurs

Par Alan Pilloud
Publié le 17 mai 2018

Mon éditeur favori m’a encore bien aidé ce coup-ci ! Je me préparais à une bonne tranche de “je cherche, je copie, je colle, je formatte…”, mais je me suis ravisé.

Tout d’abord, un peu de contexte : je devais unir sous une même clé des chaînes traduites en trois langues.

Voici donc ce à quoi je souhaitais arriver :

$data = [
    "surface" => [ "Fl\u00E4che (m2)", "Surface (m2)", "Surface (m2)" ],
    "surface_balcon" => [ "Fläche Balkon (m2)", "Balcony surface (m2)", "Surface balcon (m2)" ],
    "surface_commerciale" => [ "Handelsfläche (qm)", "Commercial surface (m2)", "Surface commerciale (m2)" ],
    // ... etc.
];

J’ai pu obtenir un fichier duquel j’ai pu extraire des clés et des fichiers de traductions clé-valeur.

Le fichier qui contient les clés

Ce fichier contenait uniquement les clés qui m’intéressaient.

// 81 lignes qui contiennent chacun une clé
if (this.surfaceBalcon>0) c.put("surface_balcon", Format.surface(this.surfaceBalcon));
if (this.surfaceCommerciale>0) c.put("surface_commerciale", Format.surface(this.surfaceCommerciale));
if (this.surface>0) c.put("surface", Format.surface(this.surface));
                           ^^^^^^^-> Clé
// etc.

On va devoir les extraire.

Pour ca, j’ai fait une macro qui cherche c.put(, puis ", puis copie la clé et ses guillemets dans le registre “a” ("aya").
Ensuite on vide la ligne, on colle la clé et on formate "ma_cle" => [], autour. Ceci est utilisé sur chaque ligne.

Ensuite, j’ai ouvert les crochets en les remplacant : %s/\[\]/[\r]/.

On arrive à ce résultat :

$data = [
    "surface" => [
],
    "surface_balcon" => [
],
    "surface_commerciale" => [
],
    // ... etc.
];

Les fichiers qui contiennent les traductions

Il y en a trois qui se présentent sous cette forme :

criteres.commercial=Locaux commerciaux
objet.soustype.garage_double=Garage double
objet.surface_commerciale=Surface commerciale (m2)
objet.description=Description
objet.nb_logements=Logements
objet.remarques=Remarques
nav.apropos=A Propos
// etc. y'en a une pélée !

Ce sont des traductions en vrac, celles qui m’intéressent sont prefixées par objet..

J’ai donc besoin d’extraire de chaque fichier la traduction correspondant à la clé. Voici comment on peut faire dans un terminal :

# je cherche dans des fichiers .properties
# on utilise les options de grep suivantes :
#  -o pour n'afficher que ce qui satisfait le filtre
#  -h pour ne pas afficher les noms de fichiers dans lesquels on trouve quelque chose
#  -P pour utiliser les regex Perl ce qui permet la syntaxe de recherche excluant de l'output le mot recherché

$ grep -ohP "(?<=objet\.surface\=).*" *.properties

# output :
Fl\u00E4che (m2)
Surface (m2)
Surface (m2)

Reste à mettre tout ça sur une ligne :

# on joint les lignes avec un délimiteur peu commun
# on remplace le délimiteur par les chaînes dont j'ai besoin pour mon tableau PHP.
$ grep -ohP "(?<=objet\.surface\=).*" *.properties | paste -sd "|" - | sed "s/|/\", \"/g"

# output :
Fl\u00E4che (m2)", "Surface (m2)", "Surface (m2)

Pas mal ! Maintenant, il me faut pouvoir adapter la clé recherchée pour chaque clé constituant mon tableau.

Pour ça, on va faire une fonction Vim qui me permettra de placer mon curseur sur la clé, appuyer un keybinding de mon choix et me faire tout le travail :)

nmap <Leader>k <Esc>:call getTranslationsTable()<CR>


function! getTranslationsTable()
    let wordUnderCursor = expand("<cword>")
    let machaine = system('grep -ohP "(?<=objet.'.wordUnderCursor.'\=).*" *.properties | paste -sd "|" - | sed "s/|/\", \"/g"')
    call append(line('.'), '"'.substitute(machaine, '[\r\n]*$', '', '').'"')
endfunction

Et ça marche, ça maaarche !

Plus que quelques lignes à joindre à coup de maj+j et on est bons les p’tits amis !

Et voila comment j’ai transformé une tâche pas super excitante en un bon moment de code :)

J’utilise habituellement les fonctions Vim pour me faire des petits snippets ou des outils de formattage.
Je suis bien content de m’être plongé la dedans et j’aime encore plus mon Vim !

Envie d'en parler ?

Ecrivez un email ou DM sur twitter