Comment définir le codage par défaut de VIM sur UTF-8?

62

J'aimerais contribuer à un projet open source fournissant des chaînes traduites. L'une de leurs exigences est que les contributeurs doivent utiliser UTF-8 comme encodage pour les fichiers PO.

J'utilise VIM 7.3 sur Linux. Comment puis-je être sûr que le codage de VIM est défini sur UTF-8, de sorte que je puisse modifier et enregistrer le fichier .po correctement?

Paolo
la source

Réponses:

64

Lorsque Vim lit un fichier existant, il essaie de détecter le codage du fichier. Lors de l'écriture du fichier, Vim utilise le codage de fichier qu'il a détecté (sauf si vous le dites différemment). Ainsi, un fichier détecté en tant que UTF-8 est écrit en UTF-8, un fichier détecté en tant que Latin-1 est écrit en tant que Latin-1, et ainsi de suite.

Par défaut, le processus de détection est brut. Chaque fichier que vous ouvrez avec Vim sera considéré comme étant Latin-1, à moins qu'il ne détecte une marque d'ordre d'octet Unicode en haut. Un fichier UTF-8 sans marque d'ordre d'octet sera difficile à modifier car tous les caractères multi-octets seront affichés dans la mémoire tampon sous forme de séquences de caractères au lieu de caractères uniques.

Pire, Vim utilise par défaut Latin-1 pour représenter le texte dans la mémoire tampon. Donc, un fichier UTF-8 avec une marque d'ordre d'octet sera corrompu par conversion vers le bas en Latin-1.

La solution consiste à configurer Vim pour utiliser UTF-8 en interne. Ceci est en fait recommandé dans la documentation de Vim, et la seule raison pour laquelle il n’a pas été configuré de cette manière est pour éviter de créer une énorme confusion chez les utilisateurs qui s’attendent à ce que Vim fonctionne essentiellement comme un éditeur Latin-1.

Dans votre .vimrc, ajoutez set encoding=utf-8et redémarrez Vim.

Sinon, définissez la LANGvariable d'environnement pour indiquer qu'UTF-8 est votre codage de caractères préféré. Cela n’affectera pas seulement Vim, mais tout logiciel sur lequel il s’appuie LANGpour déterminer comment il doit représenter le texte. Par exemple, pour indiquer que le texte doit apparaître en anglais ( en), tel que parlé aux États-Unis ( US), codé sous la forme UTF-8 ( utf-8), définissez LANG=en_US.utf-8.

Maintenant, Vim utilisera UTF-8 pour représenter le texte dans le tampon. De plus, il fera un effort plus déterminé pour détecter le codage UTF-8 dans un fichier. En plus de rechercher une marque d'ordre d'octet, il recherchera également UTF-8 sans marque d'ordre d'octet avant de retomber sur Latin-1. Donc, il ne corrompra plus un fichier codé en UTF-8 et il devrait afficher correctement les caractères UTF-8 pendant la session de montage.

Pour plus d'informations sur la manière dont Vim détecte le codage de fichier, voir l' fileencodingsoption dans la documentation de Vim .

Pour plus d'informations sur la définition du codage utilisé en interne par Vim, voir l' encoding option .

Si vous devez remplacer le codage utilisé lors de l'écriture d'un fichier sur le disque, reportez-vous à l' fileencoding option .

MetaEd
la source
3
En fait , il semble que je n'ai même pas la peine d' édition .vimrc; En fait, la valeur par défaut de l'encodage est "latin1" ou la valeur de $ LANG, qui est définie sur mon système en_US.UTF-8. Pour cette raison :set encodingdonne encoding=utf-8hors de la boîte. Comme prévu, si LANG n'est pas défini, :set encodingdonne encoding=latin1. Merci pour la bonne réponse!
Paolo
Cela pourrait être généralement utile, alors je l’ajoute à la réponse.
MetaEd
Si vous ouvrez un fichier codé en tant que latin1, ce paramètre ne modifiera-t-il pas le codage du fichier? Comment pouvez-vous faire en sorte que Vim conserve le codage d'un fichier tout en préférant utf-8 aux nouveaux fichiers?
David Kennedy
@DaveKennedy Vim peut traiter le fichier en tant que Latin-1 uniquement lorsque le fichier est sans ambiguïté en Latin-1. Lorsque l'encodage est ambigu, Vim doit choisir. Par exemple, un fichier contenant uniquement des codes ASCII 7 bits correspond à Latin1, mais également à UTF-8 et à d’autres. Un tel fichier sera normalement traité comme UTF-8. Une façon d'éviter ce résultat est de rendre le codage de fichier sans ambiguïté. Le truc que j'ai vu est d'ajouter une chaîne de codes 0xF7. Dans UTF-8, 0xF7 n'est pas valide. Mais en latin-1, il représente le signe de division (). Vim conclura normalement que le fichier est Latin-1.
MetaEd
4

Selon vimdoc, vim essaie de détecter automatiquement le codage de fichier. Par conséquent, si vous modifiez des fichiers existants, vous devez être sûr.

Vous pouvez toujours forcer l'encodage si vous voulez avec :set fileencodings=utf-8. Vous pouvez trouver la documentation ici .

M. Shunz
la source
6
fileencodings = utf-8 amènera Vim à reconnaître le fichier d'entrée en tant que UTF-8, mais effectuera ensuite une conversion avec perte en Latin-1. De plus, Vim ne pourra pas reconnaître UTF-16. La meilleure solution consiste à définir encoding = utf-8, qui transforme Vim d’un éditeur natif à un octet en un éditeur natif à plusieurs octets.
MetaEd
@MetaEd pouvez-vous répondre à cela pour préciser votre commentaire :)
hhh