Я использую Aquamacs, дистрибутив GNU Emacs 23.3.50.1.
Я просматриваю несколько исходных файлов, написанных с комментариями на греческом языке, и они закодированы в CP1253.
И я могу либо вернуться к правильной кодировке, либо добавить локальную переменную файла:
/* -*- mode: c-mode; tab-width: 4; coding: cp1253-unix; -*- */
Таким образом, я могу заставить их открываться правильно, и я, конечно же, могу прикрепить файловые переменные к каждому файлу.
Но я хотел бы задать кодировку для всего каталога. Вместо того, чтобы редактировать .dir-locals.el вручную, я подумал, что просто:
M-x copy-file-locals-to-dir-locals
Из файла, который открылся правильно. И это генерирует:
;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.
((c-mode
(tab-width . 4)
(coding . cp1253-unix)))
Никаких кубиков. Тем не менее, он четко распознает новую ширину табуляции, поэтому он читает файл.
Есть идеи почему? И есть ли какой-нибудь лог, как emacs обрабатывает a-list?
решение1
К сожалению, похоже, что заголовок кодирования по умолчанию не распространяется из dir-locals Emacs; у меня возникли проблемы с вашей настройкой, и я также воспроизвел проблему.
Позже я наткнулся на этот источник, который, похоже, подтверждает то, что вы нашли: http://www.emacsmirror.org/package/dir-locals.html
Я не уверен, существует ли журнал обработки a-list, но если вы не знакомы с этой переменной, вы можете проверить свою кодировку, посетив файл с помощью:
C-h v buffer-file-coding-system RET
или
M-x describe-variable RET buffer-file-coding-system RET
Лично я считаю, что лучшим вариантом будет то, что у вас уже работает — локальные переменные файлов.
Альтернативы, которые я могу придумать (первый не проверен), — это взглянуть на некоторые функции elisp:
(coding-system-priority-list)
(set-coding-system-priority &rest coding-systems)
ИЛИ второй: (предполагая, что ваша структура каталогов — /something/blah/greekcode/file.c)
(add-to-list 'auto-coding-alist
'("/greekcode/[^/]+.c\\'" . cp1253-unix))
Это имеет приоритет даже над локальными переменными файла. Измените регулярное выражение по своему усмотрению и поэкспериментируйте, оценив:
(find-auto-coding "/home/brian/greekcode/garbage.c" 1) <= C-x C-e
возвращает:
(cp1253-unix . auto-coding-alist)
Надеюсь, это поможет! Хотелось бы услышать, что другие пользователи emacs предлагают в качестве решения.