Como defino a codificação de caracteres do emacs para arquivos em um diretório?

Como defino a codificação de caracteres do emacs para arquivos em um diretório?

Estou usando o Aquamacs, uma distro do GNU Emacs 23.3.50.1.

Estou vendo alguns arquivos de origem escritos com alguns comentários em grego e eles estão codificados em CP1253.

E posso reverter com a codificação adequada ou posso adicionar uma variável local de arquivo:

/* -*- mode: c-mode; tab-width: 4; coding: cp1253-unix; -*- */

Assim, posso fazer com que eles abram corretamente e certamente poderia adicionar variáveis ​​de arquivo a cada arquivo.

Mas eu gostaria de definir a codificação para todo o diretório. Em vez de editar .dir-locals.el manualmente, pensei em simplesmente:

M-x copy-file-locals-to-dir-locals

Do arquivo que abriu corretamente. E isso gera:

;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

((c-mode
  (tab-width . 4)
  (coding . cp1253-unix)))

Sem dados. No entanto, ele reconhece claramente a nova largura da guia, por isso está lendo o arquivo.

Alguma idéia do porquê? E há algum registro enquanto o emacs está processando a lista a?

Responder1

Infelizmente, parece que o cabeçalho de codificação, por design, não se propaga a partir dos diretórios locais do Emacs; Tive dificuldades com sua configuração e também repliquei o problema.

Mais tarde me deparei com esta fonte que parece verificar o que você encontrou: http://www.emacsmirror.org/package/dir-locals.html

Não tenho certeza se existe um log para processar a lista a, mas caso você não esteja familiarizado com esta variável, você pode verificar sua codificação após visitar um arquivo com:

C-h v buffer-file-coding-system RET

ou

M-x describe-variable RET buffer-file-coding-system RET

Pessoalmente, acho que sua melhor aposta seria o que você já tem funcionando - arquivar variáveis ​​locais.

As alternativas que consigo pensar (a primeira não foi testada) seriam dar uma olhada em algumas das funções do elisp:

(coding-system-priority-list)
(set-coding-system-priority &rest coding-systems)

OU segundo: (assumindo que sua estrutura de diretórios seja /something/blah/greekcode/file.c)

(add-to-list 'auto-coding-alist 
     '("/greekcode/[^/]+.c\\'" . cp1253-unix))

Isso tem precedência até mesmo sobre variáveis ​​locais de arquivo. Modifique o regexp conforme necessário e experimente avaliando:

(find-auto-coding "/home/brian/greekcode/garbage.c" 1) <= C-x C-e

retorna:

(cp1253-unix . auto-coding-alist)

Espero que isso ajude! Adoraria ouvir o que outros usuários do emacs propõem como soluções.

informação relacionada