Como encontro a codificação do buffer atual no vim?

89

Digamos que estou editando algum arquivo com o vim (ou gvim). Não tenho idéia da codificação do arquivo e quero saber se ele está em UTF-8 ou ISO-8859-1 ou o que for? De alguma forma, posso dizer ao vim para me mostrar qual codificação é usada?

innaM
fonte

Respostas:

104

A configuração de codificação de arquivo mostra a codificação do buffer atual:

:set fileencoding
fileencoding=utf8

Realmente não existe uma maneira comum de determinar a codificação de um arquivo de texto sem formatação, pois essas informações não são salvas no próprio arquivo - exceto Arquivos UTF-8, nos quais você tem a chamada BOM que indica a codificação. É por isso que os arquivos xml e html possuem metatags de charset.

Você pode aplicar uma codificação específica com a configuração 'codificação'. Veja :help encodinge :help fileencodingno Vim como o editor lida com essas configurações. Você também pode adicionar várias configurações de codificação de arquivo ao vimrc para que o vim tente detectar com base nas listadas.

jtimberman
fonte
11
Perfeito. Mesmo que seja contra-intuitivo. Obrigado!
innaM
7
Infelizmente, não está correto. Para o Vim, não é possível encontrar a codificação do arquivo que você está lendo. Não está escrito no arquivo Só pode adivinhar com base nos caracteres disponíveis no arquivo. Por exemplo, um arquivo com o texto "abcdef" pode estar em várias codificações, pois praticamente todos suportam esses caracteres, mas um arquivo com "šđčćž" provavelmente estará no CP1252. Portanto, você não está lendo a codificação de algum lugar, mas adivinhando o que poderia ser essa codificação e com base nela exibindo-a corretamente.
Rook
6
O que você está fazendo aqui é definir explicitamente a codificação, com base em suas observações sobre o conteúdo do arquivo. Se você deseja que o vim tente várias codificações, ao abrir um arquivo, coloque várias delas na opção _vimrc.
Rook
@ldigas, obrigado pelo feedback, eu atualizei a resposta a ser um pouco mais claro sobre isso (espero!)
jtimberman
2
Provavelmente vale a pena mencionar que as listas técnicas são 1.) Não é exclusivo da UTF-8 - embora as UTF-8 sejam distintas das outras listas técnicas, 2.) Não é necessário e geralmente não é encontrado na UTF-8 .
Ruffin
13

Observe que a codificação dos arquivos não é explicitamente declarada em nenhum lugar do arquivo. Portanto, o VIM e outros aplicativos devem adivinhar a codificação. A maneira canônica de fazer isso é com o chardetaplicativo, que pode ser executado no VIM da seguinte maneira:

:!chardet %

A resposta fornecida pelo jtimberman mostra a codificação do buffer atual que pode não ser a mesma que o arquivo no disco. Assim, você notará que chardetalgumas vezes mostra uma codificação diferente do VIM, especialmente se você tiver o VIM configurado para sempre usar uma codificação específica (por exemplo, UTF-8).

O bom chardeté que ele fornece uma pontuação de confiança para sua estimativa, enquanto o VIM pode estar (e geralmente está) errado em adivinhar a codificação se não houver muitos caracteres acima de \ x7F (ASCII 127). Por exemplo, adicionar um único אa um arquivo longo de código PHP faz chardetpensar que o arquivo está ISO-8859-2com uma confiança de 0,72, enquanto adicionar a frase um pouco mais longa שלום, עולם!‏fornece ao UTF-8 uma pontuação de confiança de 0,99. Nos dois casos, set fileencoding?mostrou UTF-8não porque o arquivo no disco era UTF-8, mas porque o VIM está configurado para usar UTF-8 internamente.

dotancohen
fonte
Sugiro que você mencione uma palavra sobre a disponibilidade do chardet nos SOs.
Soundararajan
@Soundararajan: Provavelmente não sou o cara a mencionar isso, pois uso apenas o Debian e o CentOS. Você está convidado a editar a resposta, se tiver informações relevantes. Obrigado!
dotancohen 31/08/18
Eu não vejo a necessidade de fazer isso dentro VIM, melhor fazê-lo de fora: chardet <file>. Ainda assim, boa sugestão.
lepe
-1

Eu descobri que: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Você pode recarregar um arquivo usando uma codificação diferente se o Vim não conseguir detectar a codificação correta:

:e ++enc=<encoding>

onde encodingpoderia estarcp850, ISO-8859-1, UTF-8, ...

Você pode usar file yourfilenamepara encontrar a codificação ou chardetect(fornecida por python-chardetou uchardetdependendo da sua distribuição Linux), conforme sugerido por dotancohen.

Pierre-Damien
fonte
Isso não responde à pergunta de como descobrir a codificação atual. Em vez disso, este comando forçará outra codificação no buffer.
Ruslan