Oecuménisme débridé

  • Dans l'informatique, il n'est plus question de tolérance ni de droit à la différence.
  • Et pourtant, quelle pire jungle que les fichiers textes ?
  • Nous allons nous faire les apôtres d'une conversion de masse, et plus jamais aucun fichier ne vous narguera.


Le Dos au mur.

  • L'édition d'un fichier venant de Dos/Windows est très pénible.
  • Notamment si vous le rendez exécutable, et que vous ajoutez une ligne de ce style en guise d'entête:
    • #!/usr/bin/python
    • Si votre fichier est enregistré au format Dos/Windows, c'est à dire avec 0xD 0xA en guise de terminateur de ligne, vous allez vous faire insulter à l'exécution:
    • /usr/bin/python^M: bad interpreter
  • Vous pouvez toujours courir pour éliminer le caractère 0xD sous Vim.
    • :%s/^M//g : no matches (comment ça "no matches" ?!)
  • Vous pourriez le convertir avec Sed
    • cat foo.py | sed 's/^M/g' >foo2.py && mv foo2.py foo.py : un peu lourdingue, mais fonctionne
  • Il y a plus simple. Il suffit de prévenir Vim que vous utilisez un OS de Vrai Mec.
    • :set ff=unix , puis sauvez le fichier.
    • et voila. Le fichier est converti.
  • La conversion inverse est possible (quelle idée bizarre):
    • :set ff=dos : pour faire des farces à vos camarades.


Définition du format de fichier au démarrage de Vim

  • Pour choisir le format de fichier adapté au démarrage de Vim, il vous suffit de placer dans .vimrc :
    • set ff=x (avec x = dos, unix ou mac )
  • Le problème est que vous ne pouvez plus reprendre votre .vimrc sur un OS différent sans modifier la ligne positionnant le format.
  • Il vaut mieux détecter l'OS au démarrage, et faire le ff correspondant.
  • Vim est un curieux, et il peut vous dire beaucoup de chose sur sa plate-forme d'exécution: help feature-list
    • Il faut que Vim ait été compilé avec +feature-list (c'est le cas des versions MS-Windows précompilées).
  • Pour tester, créez un fichier .detecte_os.vim , et insérez le code ci-dessous.
    • Pour charger ce fichier depuis Vim: :so .detecte_os.vim
    • Pour exécuter la fonction: :call Detecte_OS()
"fichier: .detecte_os.vim
"doc: help feature-list

"les noms de fonction commencent par une majuscule
function! Detecte_OS()

if has("unix")
   echo "version Unix detectée"
   set ff=unix
elseif has("macunix")
   echo "MacOS X detecté"
   set ff=mac
else
   echo "Version de Vim inconnue. Surement Windows."
   set ff=dos
endif

endfunction


  • Vous pouvez appeller cette fonction au démarrage de Vim, en insérant ceci dans votre .vimrc
so ~/.detecte_os.vim
autocmd VimEnter * call Detecte_OS()



L'encodage des fichiers

  • Le format de fichier est une chose, l'encodage en est une autre.
    • La phrase précédente n'apportant pas grand chose dans ce grand cri numérique qu'est Internet, je précise ma pensée.
  • le format de fichier: il concerne la structure du fichier, c'est à dire la façon dont sont encodées les fins de lignes (0x0D0A pour la famille Dos, 0x0A pour le reste du monde).
  • l' encodage des fichiers : il concerne les tables de caractères utilisés pour les fichiers (UTF-8, iso-8859-x etc.).
  • Typiquement, les problèmes d'encodages se repèrent avec les accents dans les fichiers texte.
    • un bel accent ascii tel que celui ci: é , sera encodé sous cette forme en UTF-8: é
  • l'encodage des fichiers se règle sous Vim avec les variables encoding , fileencoding et fileencodings
    • encoding détermine l'encodage des caractères utilisé au sein de Vim.
    • fileencoding détermine l'encodage à utiliser lors de la sauvegarde d'un fichier (eh oui, c'est subtil)
    • fileencodings (avec un s final) donne une liste de tables d'encodage à utiliser lors de l'édition d'un nouveau fichier. Vim tente d'utiliser la première de la liste, puis la seconde, etc.
  • Sans plus attendre, sautons au paragraphe suivant pour nous vautrer dans le concret.


Illustration des problèmes d'encodage de fichiers

  • Un exemple type des problèmes que vous allez rencontrer avec les encodages de fichier est le mapping des touches dans Vim.
  • Pour remapper une touche, vous utilisez la commande map, généralement placée dans votre .vimrc (si vous voulez un comportement permanent).
    • Ex: map µ :set cursorline! cursorcolumn!<CR>
  • Dans l'exemple précédent, on utilise une touche qui va être encodée sur deux caractères en UTF-8.
    • Si votre fichier .vimrc est encodée en latin1et que votre terminal fonctionne en Unicode, le code caractère ne correspondra pas.
    • Si vous avez un doute, hexdump peut vous aider à être sûr de l'encodage utilisé.
    • Le plus simple est de vérifier avec :set fileencoding
  • Dans mon cas, j'utilise un terminal unicode (c'est urxvt, que je vous recommande).
    • J'ai simplement choisi l'encodage des fichiers en UTF-8, et j'ai sauvé le fichier.
    • Résultat: plus de problèmes pour la prise en compte de mes raccourcis claviers.
    • la commande magique: set fileencoding=UTF-8 (suivi d'un write, bien sûr).


Baptême de masse avec Skippy (et iconv)

  • Tout cela est bien beau, mais vous pourriez vous retrouver avec une masse de fichiers à convertir.
  • Dans ce cas, hors de question des les ouvrir un par un avec Vim.
  • Heureusement, Skippy pense à vous, et vous propose un baptême de masse. Avec siphonnage des comptes bancaires associés, bien sûr.
  • Pour ce faire:
    • rasez-vous le crane.
    • mettez vos lunettes noires.
    • ressortez votre peignoir.
    • et, j'allais l'oublier, n'oubliez pas iconv
  • Voici un exemple de commande pour vous montrer la bête en action.
    • Ceci converti les sources C d'un répertoire et de ses descendants de iso-8859-1 vers UTF-8.
    • find . -iname "*.c" | while read filename; do iconv -f iso-8859-1 -t UTF-8 "$filename" > ${filename%.*}_utf8.c ; done
  • Quelques remarques sur l'exemple précédent:
    • On utilise l'astuce du while (merci Frédéric) : ceci permets de traiter les résultats du find avec une redirection.
    • Sans redirection (nécessaire dans le cas de iconv pour créer le fichier cible), nous aurions pu utiliser xargs.
    • n'oubliez pas que iconv -l va vous lister les jeux de caractères supportés en entrée et en sortie de iconv.


Parenthèse en guise de conclusion

  • Une astuce que je viens de découvrir avec xargs (merci Frédéric)
    • xargs -I{} echo {} {}
    • Cela sert à réutiliser plusieurs fois le nom que l'on passe par le tube. On met ce qu'on veut comme identifiant (-I), bien sûr.
    • Mais nous nous éloignons carrément du sujet. Fermons là le ban.