Conversion rituelle d'un fichier textuel
Par Jean-Seb le jeudi 23 octobre 2008, 21:33 - Vim - Lien permanent
Halte au paganisme chez les fichiers texte!
Convertissez les tous, Vim reconnaitra les siens!
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()
- Pour charger ce fichier depuis Vim:
"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>
- Ex:
- 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 -lva vous lister les jeux de caractères supportés en entrée et en sortie de iconv.
- On utilise l'astuce du while (merci Frédéric) : ceci permets de
traiter les résultats du
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.
Commentaires
et la commande "tr" pour changer ou effacer des caractères inutiles genre \r ? Il y pense pas ?
A propos de "tr" :
Le but était de tout faire depuis Vim, et de ne plus s'en préoccuper. Pas de détailler "info coreutils".
En réponse à la commande :
:%s/^M//g
Le symbole "^M" doit être obtenu avec Ctrl+v Ctrl+m et pas écrits comme deux caractères "^" et "M" distincts.
A+