Como posso definir a codificação padrão do VIM para UTF-8?

62

Eu gostaria de contribuir para um projeto de código aberto que fornece sequências traduzidas. Um de seus requisitos é que os colaboradores devem usar UTF-8 como codificação para os arquivos PO.

Estou usando o VIM 7.3 no Linux. Como posso ter certeza de que a codificação do VIM está definida como UTF-8, para que eu possa editar e salvar o arquivo .po da maneira correta?

Paolo
fonte

Respostas:

64

Quando o Vim lê um arquivo existente, ele tenta detectar a codificação do arquivo. Ao gravar o arquivo, o Vim usa a codificação de arquivo detectada (exceto quando você o informa de forma diferente). Portanto, um arquivo detectado como UTF-8 é gravado como UTF-8, um arquivo detectado como Latim-1 é gravado como Latim-1 e assim por diante.

Por padrão, o processo de detecção é bruto. Todo arquivo que você abrir com o Vim será assumido como Latin-1, a menos que detecte uma marca de ordem de bytes Unicode na parte superior. Um arquivo UTF-8 sem uma marca de ordem de bytes será difícil de editar, pois qualquer caractere multibyte será mostrado no buffer como sequências de caracteres em vez de caracteres únicos.

Pior, o Vim, por padrão, usa Latin-1 para representar o texto no buffer. Portanto, um arquivo UTF-8 com uma marca de ordem de bytes será corrompido pela conversão para latino-1.

A solução é configurar o Vim para usar UTF-8 internamente. De fato, isso é recomendado na documentação do Vim, e o único motivo para não ser configurado dessa maneira é evitar criar uma enorme confusão entre os usuários que esperam que o Vim opere basicamente como um editor Latin-1.

No seu .vimrc, adicione set encoding=utf-8e reinicie o Vim.

Ou então, defina a LANGvariável de ambiente para indicar que UTF-8 é sua codificação de caracteres preferida. Isso afetará não apenas o Vim, mas qualquer software que dependa LANGde como ele deve representar o texto. Por exemplo, para indicar que o texto deve aparecer em inglês ( en), falado nos Estados Unidos ( US), codificado como UTF-8 ( utf-8), definido LANG=en_US.utf-8.

Agora o Vim usará UTF-8 para representar o texto no buffer. Além disso, também fará um esforço mais determinado para detectar a codificação UTF-8 em um arquivo. Além de procurar uma marca de ordem de bytes, também verificará o UTF-8 sem uma marca de ordem de bytes antes de retornar ao Latin-1. Portanto, ele não corromperá mais um arquivo codificado em UTF-8 e deverá exibir corretamente os caracteres UTF-8 durante a sessão de edição.

Para obter mais informações sobre como o Vim detecta a codificação de arquivo, consulte a fileencodingsopção na documentação do Vim .

Para mais informações sobre como definir a codificação que Vim usa internamente, ver a encoding opção .

Se você precisa substituir a codificação usada quando se escreve um arquivo de volta para o disco, consulte a fileencoding opção .

MetaEd
fonte
3
Na verdade, parece que nem preciso me preocupar em editar .vimrc; de fato, o valor padrão da codificação é "latin1" ou o valor de $ LANG, que está definido no meu sistema en_US.UTF-8. Por esta razão :set encodingencoding=utf-8fora da caixa. Como esperado, se LANG não estiver definido, :set encodingencoding=latin1. Obrigado pela ótima resposta!
Paolo
Isso pode ser geralmente útil, então eu o adicionei à resposta.
MetaEd 28/10/11
Se você abrir um arquivo codificado como latin1, essa configuração não alterará a codificação do arquivo? Como você pode obter o Vim para manter intacta a codificação de um arquivo, mas prefere utf-8 para novos arquivos?
David Kennedy
O @DaveKennedy Vim pode tratar o arquivo como Latin-1 somente quando o arquivo é inequivocamente Latin-1. Quando a codificação é ambígua, o Vim precisa escolher. Por exemplo, um arquivo contendo apenas códigos ASCII de 7 bits é válido Latin1, mas também é válido UTF-8 e outros. Esse arquivo normalmente será tratado como UTF-8. Uma maneira de evitar esse resultado é tornar a codificação do arquivo inequívoca. O truque que eu vi é adicionar uma sequência de códigos 0xF7. No UTF-8, 0xF7 é inválido. Mas, em latim-1, representa o sinal de divisão (÷). O Vim normalmente conclui que o arquivo é Latin-1.
MetaEd 6/02/2019
4

De acordo com o vimdoc, o vim tenta detectar automaticamente a codificação do arquivo; portanto, se você estiver editando arquivos existentes, será bom.

Você sempre pode forçar a codificação, se quiser :set fileencodings=utf-8. Você pode encontrar a documentação aqui .

Shunz
fonte
6
fileencodings = utf-8 fará com que o Vim reconheça o arquivo de entrada como UTF-8, mas depois realize uma conversão com perda para Latin-1. Além disso, fará com que o Vim não reconheça o UTF-16. A melhor solução é definir encoding = utf-8, que transforma o Vim de um editor nativo de um byte em um editor nativo de vários bytes.
MetaEd 27/10/11
@MetaEd você pode responder isso para a reflexão sobre o seu comentário :)
hhh