Como faço para definir codificação de caracteres emacs para arquivos em um diretório?

2

Eu estou usando Aquamacs, uma distro do GNU Emacs 23.3.50.1.

Eu estou olhando para alguns arquivos de origem escritos com alguns comentários em grego, e eles são codificados em CP1253.

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

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

Então eu posso fazer com que eles abram corretamente, e eu certamente poderia adicionar variáveis ​​de arquivo em cada arquivo.

Mas eu gostaria de definir a codificação para o diretório inteiro. Em vez de editar manualmente o .dir-locals.el, 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, reconhece claramente a nova largura de tabulação, por isso está lendo o arquivo.

Alguma idéia por quê? E existe algum log como o emacs está processando a lista-a?

Ben
fonte
Com o emacs24, se eu tentar definir coding em .dir-locals.el, recebo um aviso ao abrir um novo arquivo: Warning (:warning): Coding cannot be specified by dir-locals
ggll

Respostas:

1

Infelizmente, parece que o cabeçalho de codificação, por design, não se propaga dos dir-locals do Emacs; Eu lutei com sua configuração e repliquei o problema também.

Mais tarde me deparei com essa 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, mas caso você não esteja familiarizado com essa variável, você pode verificar sua codificação depois de 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 trabalhando - arquivar variáveis ​​locais.

Alternativas que eu posso pensar (primeiro não testado) seria dar uma olhada em algumas das funções elisp:

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

OU segundo: (supondo 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 arquivos. 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.

assem
fonte