34.10.5 Кодировки по умолчанию

В этом разделе описаны переменные, задающие кодировку по умолчанию для определённых файлов или при запуске определённых подпрограмм, а также функция, используемая операциями ввода-вывода для доступа к ним.

Смысл этих переменных в том, что вы устанавливаете их один раз и навсегда в нужные вам значения по умолчанию, а затем больше их не меняете. Чтобы указать конкретную кодировку для определённой операции в программе на Lisp, не изменяйте эти переменные; вместо этого переопределите их с помощью coding-system-for-read и coding-system-for-write (см. Указание кодировки для одной операции).

Пользовательская опция: auto-coding-regexp-alist

Эта переменная представляет собой список соответствий между текстовыми шаблонами и соответствующими кодировками. Каждый элемент имеет вид (regexp . coding-system); файл, первые несколько килобайт которого совпадают с regexp, декодируется с помощью coding-system, когда его содержимое считывается в буфер. Настройки в этом списке имеют приоритет над тегами coding: в файлах и содержимым file-coding-system-alist (см. ниже). Значение по умолчанию установлено так, что Emacs автоматически распознаёт почтовые файлы в формате Babyl и читает их без преобразований кодировки.

Пользовательская опция: file-coding-system-alist

Эта переменная представляет собой список, указывающий кодировки для чтения и записи конкретных файлов. Каждый элемент имеет вид (pattern . coding), где pattern — это регулярное выражение, соответствующее определённым именам файлов. Элемент применяется к файлам с именами, совпадающими с pattern.

CDR элемента, coding, должен быть либо кодировкой, либо ячейкой cons, содержащей две кодировки, либо именем функции (символом с определением функции). Если coding — это кодировка, то она используется как для чтения, так и для записи файла. Если coding — это ячейка cons с двумя кодировками, её CAR задаёт кодировку для декодирования, а CDR — кодировку для кодирования.

Если coding — это имя функции, то функция должна принимать один аргумент — список всех аргументов, переданных в find-operation-coding-system. Она должна возвращать кодировку или ячейку cons с двумя кодировками. Это значение имеет тот же смысл, что описан выше.

Если coding (или то, что возвращает вышеуказанная функция) равно undecided, выполняется обычное определение кодировки.

Пользовательская опция: auto-coding-alist

Эта переменная представляет собой список, указывающий кодировки для чтения и записи конкретных файлов. Её формат подобен file-coding-system-alist, но, в отличие от последней, эта переменная имеет приоритет над любыми тегами coding: в файле.

Переменная: process-coding-system-alist

Эта переменная представляет собой список, указывающий, какие кодировки использовать для дочернего процесса, в зависимости от того, какая программа в нём выполняется. Она работает подобно file-coding-system-alist, за исключением того, что pattern сопоставляется с именем программы, использованной для запуска дочернего процесса. Кодировка или кодировки, указанные в этом списке, используются для инициализации кодировок, применяемых для ввода-вывода в дочерний процесс, но позднее вы можете указать другие кодировки с помощью set-process-coding-system.

Предупреждение: Кодировки, такие как undecided, которые определяют кодировку по данным, не работают полностью надёжно при асинхронном выводе дочерних процессов. Это связано с тем, что Emacs обрабатывает асинхронный вывод дочерних процессов порциями, по мере их поступления. Если кодировка оставляет преобразование кодов символов или преобразование концов строк неопределённым, Emacs должен пытаться определить правильное преобразование для каждой порции по отдельности, и это не всегда работает.

Поэтому для асинхронного дочернего процесса, если это вообще возможно, используйте кодировку, которая определяет как преобразование кодов символов, так и преобразование концов строк, то есть такую как latin-1-unix, а не undecided или latin-1.

Переменная: network-coding-system-alist

Эта переменная представляет собой список, указывающий кодировку для сетевых потоков. Она работает во многом подобно file-coding-system-alist, с той разницей, что pattern в элементе может быть либо номером порта, либо регулярным выражением. Если это регулярное выражение, оно сопоставляется с именем сетевой службы, использованной для открытия сетевого потока.

Переменная: default-process-coding-system

Эта переменная задаёт кодировки для ввода и вывода дочерних процессов (и сетевых потоков), когда ничего другого не указано.

Значение должно быть ячейкой cons вида (input-coding . output-coding). Здесь input-coding применяется к вводу из дочернего процесса, а output-coding — к выводу в него.

Пользовательская опция: auto-coding-functions

Эта переменная содержит список функций, которые пытаются определить кодировку для файла на основе его недекодированного содержимого.

Каждая функция в этом списке должна быть написана так, чтобы просматривать текст в текущем буфере, но не должна изменять его никаким образом. Буфер будет содержать текст частей файла. Каждая функция должна принимать один аргумент, size, который указывает, сколько символов просмотреть, начиная с точки. Если функции удаётся определить кодировку для файла, она должна вернуть эту кодировку. В противном случае она должна вернуть nil. Каждая функция также может узнать имя файла, к которому относится содержимое буфера, из переменной auto-coding-file-name.

Функции в этом списке могут вызываться как при посещении файла, когда Emacs хочет декодировать его содержимое, так и/или когда буфер файла должен быть сохранён и Emacs хочет определить, как кодировать его содержимое.

Если файл имеет тег ‘coding:’, он имеет приоритет, поэтому эти функции вызываться не будут.

Функция: find-auto-coding filename size

Эта функция пытается определить подходящую кодировку для filename. Она просматривает буфер, посещающий указанный файл, используя описанные выше переменные по порядку, пока не найдёт совпадение с одним из правил, заданных этими переменными. Затем она возвращает ячейку cons вида (coding . source), где coding — это используемая кодировка, а source — символ, один из auto-coding-alist, auto-coding-regexp-alist, :coding или auto-coding-functions, указывающий, кто предоставил соответствующее правило. Значение :coding означает, что кодировка была указана тегом coding: в файле (см. тег coding в Руководстве по GNU Emacs). Порядок поиска соответствующего правила: сначала auto-coding-alist, затем auto-coding-regexp-alist, затем тег coding: и, наконец, auto-coding-functions. Если подходящее правило не найдено, функция возвращает nil.

Второй аргумент size — это размер текста в символах, следующего за точкой. Функция просматривает текст только в пределах size символов после точки. Обычно буфер должен быть расположен в начале при вызове этой функции, поскольку одним из мест для тега coding: являются первая или вторая строки файла; в этом случае size должен быть равен размеру буфера.

Функция: set-auto-coding filename size

Эта функция возвращает подходящую кодировку для файла filename. Она использует find-auto-coding для поиска кодировки. Если кодировку определить не удалось, функция возвращает nil. Смысл аргумента size такой же, как в find-auto-coding.

Функция: find-operation-coding-system operation &rest arguments

Эта функция возвращает кодировку, используемую (по умолчанию) для выполнения operation с аргументами arguments. Значение имеет следующий вид:

(decoding-system . encoding-system)

Первый элемент, decoding-system — это кодировка для декодирования (в случае, если operation выполняет декодирование), а encoding-system — кодировка для кодирования (в случае, если operation выполняет кодирование).

Аргумент operation — это символ; он должен быть одним из write-region, start-process, call-process, call-process-region, insert-file-contents или open-network-stream. Это имена примитивов ввода-вывода Emacs, которые могут выполнять преобразование кодов символов и концов строк.

Остальные аргументы должны быть теми же аргументами, которые могут быть переданы соответствующему примитиву ввода-вывода. В зависимости от примитива, один из этих аргументов выбирается в качестве цели. Например, если operation выполняет файловый ввод-вывод, целью является аргумент, задающий имя файла. Для примитивов дочерних процессов целью является имя процесса. Для open-network-stream целью является имя службы или номер порта.

В зависимости от operation, эта функция ищет цель в file-coding-system-alist, process-coding-system-alist или network-coding-system-alist. Если цель найдена в списке, find-operation-coding-system возвращает соответствующую запись из списка; в противном случае она возвращает nil.

Если operation равно insert-file-contents, аргумент, соответствующий цели, может быть ячейкой cons вида (filename . buffer). В этом случае filename — это имя файла для поиска в file-coding-system-alist, а buffer — это буфер, содержащий содержимое файла (ещё не декодированное). Если file-coding-system-alist указывает функцию для вызова для этого файла, и этой функции необходимо проверить содержимое файла (как она обычно и делает), она должна проверять содержимое buffer вместо чтения файла.