Поддержка разных языков

Emacs поддерживает широкий спектр наборов знаков разных языков, включая европейские варианты латинского алфавита, а также китайскую, девангари (хинди и маратхи), эфиопскую, греческую, IPA, японскую, корейскую, лаосскую, русскую, тайскую, тибетскую и вьетнамскую письменности. Эти возможности были внесены из измененной версии Emacs, известной как MULE (от "MULti-lingual Enhancement to GNU Emacs".(4))

Введение в наборы знаков разных языков

Пользователи этих систем письма выработали много более или менее стандартных систем кодирования для хранения файлов. Внутренне Emacs использует единую многобайтную кодировку, так что в ней можно перемешивать знаки из всех этих систем письма в одном буфере или строке. Эта кодировка представляет каждый знак, не входящий в ASCII, как последовательность байт в промежутке от 0200 до 0377. Emacs переводит из этой многобайтной кодировки в различные другие системы кодирования при считывании и записи файлов, при обмене данными с подпроцессами и (в некоторых случаях) в команде C-q (смотрите раздел Однобайтные и многобайтные не-ASCII-знаки).

Команда C-h h (view-hello-file) выводит файл `etc/HELLO', который показывает, как сказать "здравствуйте" на разных языках. Это иллюстрирует различные виды письменности.

Даже в странах, где используются эти знаки, на клавиатурах обычно нет клавиш для всех из них. Поэтому Emacs поддерживает различные методы ввода, как правило, один для каждой письменности или языка, чтобы их было удобно вводить.

Префиксный ключ C-x RET используется для команд, которые имеют отношение к многобайтным знакам, системам кодирования и методам ввода.

Включение поддержки многобайтных знаков

Вы можете включить или выключить поддержку многобайтных знаков либо для всего Emacs, либо для отдельного буфера. Когда в буфере выключены многобайтные знаки, каждый байт в нем представляет один знак, даже коды от 0200 до 0377. Старые средства для поддержки европейских наборов знаков, ISO Latin-1 и ISO Latin-2, работают так же, как они работали в Emacs 19, и кроме того, работают для других наборов знаков ISO 8859.

Однако, чтобы использовать ISO Latin, необязательно выключать поддержку многобайтных знаков; многобайтный набор знаков Emacs включает все эти знаки, и Emacs может автоматически переводить из него в коды ISO и наоборот.

Чтобы отредактировать определённый файл в однобайтном представлении, обратитесь к нему через find-file-literally. Смотрите раздел Обращение к файлам. Чтобы превратить буфер в многобайтном представлении в однобайтное представление тех же знаков, проще всего сохранить содержимое этого буфера в файле, уничтожить его и снова обратиться к этому файлу с помощью find-file-literally. Вы также можете использовать C-x RET c (universal-coding-system-argument) и указать `raw-text' в качестве системы кодирования для обращения к файлу или для его сохранения. Смотрите раздел Задание системы кодирования. Обращение к файлу как к `raw-text' не выключает преобразование формата, декомпрессию и автоматический выбор режима, в отличие от find-file-literally.

Чтобы выключить поддержку многобайтных знаков по умолчанию, запустите Emacs с ключом --unibyte (смотрите раздел Ключи запуска) или установите переменную среды `EMACS_UNIBYTE'. Вы также можете настроить параметр enable-multibyte-characters или, что эквивалентно, прямо установить переменную default-enable-multibyte-characters в вашем файле инициализации, это даёт в основном тот же эффект, что и --unibyte.

Во время инициализации не создаются многобайтные строки из значений переменных среды, вхождений файла `/etc/passwd', etc., которые содержат не входящие в ASCII восьмибитные знаки. Однако, файл инициализации обычно считывается как многобайтный -- как все файлы на Лиспе -- даже если задан ключ --unibyte. Чтобы избежать создания многобайтных строк из находящихся в этом файле строк с не-ASCII-знаками, поместите в его первой строке комментарий с текстом `-*-unibyte: t;-*-'. Для файлов инициализации других пакетов, вроде Gnus, нужно сделать то же самое.

В строке режима показано, включена ли поддержка многобайтных знаков в текущем буфере. Если она включена, перед двоеточием в начале строки режима стоят два или более знака (чаще всего два дефиса). Когда многобайтные знаки не включены, перед двоеточием есть только один дефис.

Языковые среды

Все поддерживаемые наборы знаков допустимы в буферах Emacs, если включены многобайтные знаки; нет необходимости выбирать конкретный язык, чтобы увидеть его знаки в буфере Emacs. Однако, важно выбрать языковую среду, чтобы получить различные установки по умолчанию. На самом деле языковая среда представляет выбор предпочтительной письменности (в большей или меньшей степени), а не выбор языка.

Языковая среда определяет, какие системы кодирования распознаются при считывании текста (смотрите раздел Распознавание систем кодирования). Это относится к файлам, приходящей почте, сетевым новостям и любому другому тексту, который вы считываете в Emacs. Она также может задавать систему кодирования, используемую по умолчанию для создания файла. Каждая языковая среда также указывает принимаемый по умолчанию метод ввода.

Чтобы выбрать языковую среду, воспользуйтесь командой M-x set-language-environment. Не имеет значения, какой буфер является текущим, когда вы запускаете эту команду, потому что её действия применяются глобально ко всему сеансу Emacs. Поддерживаемые языковые среды включают:

Chinese-BIG5, Chinese-CNS, Chinese-GB, Cyrillic-Alternativnyj, Cyrillic-ISO, Cyrillic-KOI8, Devanagari, English, Ethiopic, Greek, Hebrew, Japanese, Korean, Lao, Latin-1, Latin-2, Latin-3, Latin-4, Latin-5, Thai, Tibetan и Vietnamese.

Некоторые операционные системы позволяют вам указать используемый вами язык путем установки переменных среды, определяющих вашу местность. Emacs может обрабатывать один распространенный частный случай: если название вашей региональной установки для типов знаков содержит строку `8859-n', Emacs автоматически выбирает соответствующую языковую среду.

Чтобы получить сведения об эффектах определенной языковой среды яз-среда, используйте команду C-h L яз-среда RET (describe-language-environment). Это сообщит вам, для каких языков полезна данная языковая среда, и перечислит приходящие с ней наборы знаков, системы кодирования и методы ввода. Эта команда также показывает образцы текста, которые иллюстрируют используемые в этой языковой среде системы письма. По умолчанию она описывает выбранную языковую среду.

Вы можете настроить для себя любую языковую среду с помощью обычной ловушки set-language-environment-hook. Команда set-language-environment запускает эту ловушку после подготовки новой языковой среды. Функции этой ловушки могут определить текущую языковую среду по значению переменной current-language-environment.

До начала подготовки новой языковой среды, команда set-language-environment запускает ловушку exit-language-environment-hook. Эта ловушка полезна для отмены настроек, сделанных с помощью set-language-environment-hook. К примеру, если вы установили с использованием set-language-environment-hook особые привязки ключей для конкретной языковой среды, вам стоит сделать так, чтобы exit-language-environment-hook восстанавливала нормальные привязки.

Методы ввода

Метод ввода -- это разновидность преобразования знаков, разработанная специально для интерактивного ввода. В Emacs, как правило, каждый язык имеет свой метод ввода; иногда несколько языков, в которых используются одни и те же знаки, могут разделять один метод ввода. Есть немного языков, которые поддерживают несколько методов ввода.

В простейшем случае метод ввода работает через отображение ASCII-букв в другой алфавит. Таким способом действуют методы ввода для греческого и русского.

Более мощный способ -- составление: преобразование последовательности знаков в одну букву. Составление используется во многих европейских методах ввода для сознания одной не-ASCII-буквы из последовательности, состоящей из буквы, за которой идет знак акцента (или наоборот). Например, некоторые методы ввода преобразуют последовательность a' в одну букву с акцентом. В этих методах ввода нет собственных специальных команд; вс , что они делают, -- компонуют последовательности печатных знаков.

Методы ввода для силлабических систем письма обычно используют последовательно отображение и затем составление. Таким способом работают методы ввода для тайского и корейского. Сначала буквы отображаются в символы отдельных звуков или меток тона; затем такие последовательности, составляющие целый слог, отображаются в один знак слога.

Для китайского и японского требуются более сложные методы. В китайских методах ввода вы сначала вводите фонетическое написание китайского слова (в методе ввода chinese-py, помимо прочих) или последовательность частей знака (методы ввода chinese-4corner, chinese-sw и другие). Поскольку одно фонетическое написание обычно соответствует многим различным китайским знакам, вы должны выбрать одну из альтернатив с помощью особых команд Emacs. Такие ключи, как C-f, C-b, C-n, C-p, и цифры имеют в этой ситуации особые определения, используемые для выбора среди альтернатив. TAB выводит буфер, показывающий все возможные варианты.

В японских методах ввода вы сначала вводите целое слово, используя фонетическое написание; потом, когда это слово уже в буфере, Emacs преобразует его в один или несколько знаков, используя большой словарь. Одно фонетическое написание соответствует многим по-разному записанным японским словам, поэтому вы должны выбрать один из них; для циклического прохода по альтернативам используйте C-n и C-p.

Иногда полезно остановить действие метода ввода, чтобы только что введенные вами знаки не сливались с последующими. Например, в методе ввода latin-1-postfix последовательность e ' комбинируется в `e' с акцентом. Что если вы хотели ввести их как раздельные знаки?

Один способ -- набрать акцент дважды; это специальное средство для ввода буквы и акцента раздельно. Например, e ' ' даёт два знака `e''. Другой способ -- набрать после `e' ещё одну букву, которая не скомбинируется с ней, и сразу удалить её. Например, вы могли бы набрать e e DEL ', чтобы получить раздельные `e' и `''.

Еще один способ, более общий, но не такой лёгкий для набора, --- использовать между двумя знаками C-\ C-\, чтобы предотвратить их комбинирование. Это команда C-\ (toggle-input-method), примененная дважды.

C-\ C-\ особенно полезна в наращиваемом поиске, поскольку она останавливает ожидание дальнейших знаков для составления и начинает поиск того, что вы уже набрали.

Две переменные, input-method-highlight-flag и input-method-verbose-flag, управляют тем, как методы ввода поясняют происходящее. Если input-method-highlight-flag не равна nil, частичная последовательность подсвечивается в буфере. Если input-method-verbose-flag не равна nil, в эхо-области показывается список возможных следующих знаков (но не в том случае, когда вы находитесь в минибуфере).

Выбор метода ввода

C-\
Включает или выключает использование выбранного метода ввода.
C-x RET C-\ метод RET
Выбирает новый метод ввода для текущего буфера.
C-h I метод RET
C-h C-\ метод RET
Описывает метод ввода метод (describe-input-method). По умолчанию, она описывает текущий метод ввода (если он есть). Такое описание должно давать вам все подробности о том, как использовать любой конкретный метод ввода.
M-x list-input-methods
Выводит перечень всех поддерживаемых методов ввода.

Чтобы выбрать метод ввода для текущего буфера, используйте C-x RET C-\ (set-input-method). Эта команда считывает имя метода ввода из минибуфера; имя обычно начинается с языковой среды, для которой этот метод предназначался. В переменной current-input-method записывается, какой метод ввода был выбран.

Методы ввода используют для обозначения знаков, не входящих в ASCII, различные последовательности ASCII-знаков. Иногда бывает полезно временно выключить метод ввода. Чтобы сделать это, наберите C-\ (toggle-input-method). Чтобы опять задействовать метод ввода, наберите C-\ снова.

Если вы напечатаете C-\, но метод ввода пока не выбран, вас попросят указать его. Это имеет тот же эффект, что и использование C-x RET C-\ для задания метода ввода.

Выбор языковой среды определяет метод ввода, используемый по умолчанию. Тогда вы можете выбрать его в текущем буфере, набирая C-\. Переменная default-input-method задаёт метод ввода, принимаемый по умолчанию (nil означает, что такого нет).

Некоторые методы ввода для алфавитных систем письма работают путем отображения клавиатуры для эмуляции различных раскладок, часто используемых для этих систем письма. Как правильно сделать это отображение, зависит от действительной раскладки вашей клавиатуры. Чтобы указать её, используйте команду M-x quail-set-keyboard-layout.

Чтобы просмотреть перечень всех поддерживаемых методов ввода, наберите M-x list-input-methods. Перечень сообщает сведения о каждом методе ввода, включая строку, обозначающую этот метод ввода в строке режима.

Однобайтные и многобайтные не-ASCII-знаки

Когда включены многобайтные знаки, знаки с кодами от 0240 (восьмиричное) до 0377 (восьмиричное) на самом деле недопустимы в буфере. Допустимые печатные знаки, не входящие в ASCII, имеют коды, начинающиеся от 0400.

Если вы набираете самовставляющийся знак в недопустимом диапазоне от 0240 до 0377, Emacs предполагает, что вы намеревались использовать один из наборов знаков Latin-n, и преобразует его в код Emacs, представляющий этот знак Latin-n. Вы указываете, какой набор знаков ISO нужно для этого применять, своим выбором языковой среды (смотрите выше). Если вы не указали свой выбор, по умолчанию используется Latin-1.

То же происходит, когда вы используете C-q для ввода восьмиричного кода в этом диапазоне.

Системы кодирования

Носители различных языков выработали много более или менее стандартных систем кодирования для их представления. Emacs не использует эти системы кодирования внутренне; вместо этого, при считывании данных он преобразует их из различных систем кодирования в свою внутреннюю, а при записи он преобразует данные из внутренней системы кодирования в другие системы. Преобразование возможно при считывании и записи файлов, отправке или получении данных с терминала и при обмене данными с подпроцессами.

Emacs присваивает каждой системе кодирования свое имя. Большинство систем кодирования используются для одного языка, и имя такой системы кодирования начинается с имени языка. Некоторые системы кодирования используются для нескольких языков; их имена обычно начинаются с `iso'. Есть также специальные системы кодирования no-conversion, raw-text и emacs-mule, которые не делают преобразования печатных знаков вообще.

Помимо преобразований между разными представлениями не-ASCII-знаков, система кодирования может производить преобразование последовательности "конец-строки". Emacs работает с тремя различными соглашениями о том, как разделять строки в файле: переводом строки, возвратом каретки и переводом строки и просто возвратом каретки.

C-h C кодирование RET
Описывает систему кодирования кодирование.
C-h C RET
Описывает систему кодирования, используемую в данный момент.
M-x list-coding-systems
Выводит перечень всех поддерживаемых систем кодирования.

Команда C-h C (describe-coding-system) выводит сведения о конкретной системе кодирования. Вы можете задать имя системы кодирования в качестве аргумента; иначе, с пустым аргументом, она опишет системы кодирования, выбранные в данный момент для различных целей как в текущем буфере, так и принимаемые по умолчанию, а также перечень приоритетов для распознавания систем кодирования (смотрите раздел Распознавание систем кодирования).

Чтобы вывести перечень всех поддерживаемых систем кодирования, наберите M-x list-coding-systems. Этот перечень даёт информацию о каждой системе кодирования, включая букву, обозначающую её в строке режима (смотрите раздел Строка режима).

Каждая система кодирования из перечисленных в этом списке -- кроме no-conversion, что означает не делать никаких преобразований --- указывает, как преобразовывать печатные знаки и нужно ли это делать, но оставляет выбор преобразования конца-строки до решения, основанном на содержимом файла. Например, если оказалось, что в файле для разделения строк используется последовательность возврат каретки-перевод строки, будет использовано преобразование из конца-строки DOS.

Каждая из перечисленных систем кодирования имеет три варианта, которые точно указывают, что делать для преобразования конца-строки:

...-unix
Не производить преобразования конца-строки; предполагается, что в файле для разделения строк используется перевод строки. (Это соглашение обычно используется в системах Unix и GNU.)
...-dos
Предполагать, что в файле для разделения строк используется возврат каретки-перевод строки, и делать соответствующее преобразование. (Это соглашение обычно используется в системах Microsoft.(5))
...-mac
Предполагать, что в файле для разделения строк используется возврат каретки, и делать соответствующее преобразование. (Это соглашение обычно используется в системе Macintosh.)

Эти варианты систем кодирования опускаются для краткости в выводе list-coding-systems, поскольку они полностью предсказуемы. Например, система кодирования iso-latin-1 имеет варианты iso-latin-1-unix, iso-latin-1-dos и iso-latin-1-mac.

Система кодирования raw-text хороша для файлов, которые содержат в основном ASCII-текст, но могут включать байты со значениями выше 127, которые не предназначались для кодирования не-ASCII-знаков. С raw-text, Emacs копирует эти байты без изменений и, чтобы они интерпретировались правильно, устанавливает в текущем буфере enable-multibyte-characters равной nil. raw-text обрабатывает преобразование конца-строки обычным способом, основываясь на увиденных данных, и имеет три обычных варианта для указания нужного преобразования конца-строки.

В противоположность этому, система кодирования no-conversion не задаёт никакого преобразования кодов знаков вообще -- ни для значений байт, выходящих за пределы ASCII, ни для конца-строки. Это полезно для считывания и записи двоичных файлов, tar-файлов и других, которые нужно просматривать буквально. Она тоже устанавливает enable-multibyte-characters в значение nil.

Простейший способ отредактировать файл без любых преобразований --- воспользоваться командой M-x find-file-literally. Она использует no-conversion, а также подавляет другие средства Emacs, которые могли бы преобразовать содержимое файла до того, как вы его увидите. Смотрите раздел Обращение к файлам.

Система кодирования emacs-mule полагает, что файл содержит не-ASCII-знаки во внутренней кодировке Emacs. Она обрабатывает преобразование конца-строки, основываясь на увиденных данных, и имеет три обычных варианта для указания нужного преобразования конца-строки.

Распознавание систем кодирования

Чаще всего Emacs может распознать, какую систему кодирования он должен использовать для любого данного файла, -- если вы указали свои предпочтения.

Некоторые системы кодирования могут быть распознаны или выделены по тому, какие последовательности знаков появляются среди данных. Однако, есть системы кодирования, которые не могут быть различены, даже потенциально. Например, нет способа отличить Latin-1 от Latin-2; они используют одни и те же значения байт с разными смыслами.

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

Список приоритетов систем кодирования зависит от выбранной языковой среды (смотрите раздел Языковые среды). Например, если вы используете французский, вы, вероятно, захотите, чтобы Emacs предпочитал Latin-1, а не Latin-2; а если вы используете чешский -- чтобы предпочтение отдавалось Latin-2. Это одна из причин задавать языковую среду.

Однако, вы можете детально изменять список приоритетов с помощью команды M-x prefer-coding-system. Эта команда считывает имя системы кодирования в минибуфере и добавляет её в начало списка приоритетов, так, чтобы ей отдавалось предпочтение среди остальных. Если вы применяете эту команду несколько раз, при каждом использовании в начало списка приоритетов добавляется один элемент.

Если вы используете систему кодирования, которая определяет тип преобразования последовательности конец-строки, такую как iso-8859-1-dos, то это означает, что Emacs должен попытаться распознать предпочтительно iso-8859-1 и использовать преобразование конца-строки DOS, если iso-8859-1 была распознана.

Иногда имя файла указывает на то, какая система кодирования должна для него использоваться. Это соответствие задаёт переменная file-coding-system-alist. Для добавления элементов к этому списку есть особая функция, modify-coding-system-alist. К примеру, чтобы все `.txt'-файлы считывались и записывались с использованием системы кодирования china-iso-8bit, вы можете выполнить следующее лисповское выражение:

(modify-coding-system-alist 'file "\\.txt\\'" 'china-iso-8bit)

Первым аргументом должен быть file, вторым -- регулярное выражение, определяющее, к каким файлам это относится, а третий аргумент говорит, какую систему кодирования применять для этих файлов.

Emacs узна т, какой вид преобразования конца-строки следует использовать, основываясь на содержимом файла: если он видит только возвраты каретки или только последовательности возврат каретки-перевод строки, то выбирает соответствующее преобразование. Вы можете подавить автоматическое использование преобразования конца-строки, установив переменную inhibit-eol-conversion в значение nil.

Вы можете указать систему кодирования для конкретного файла, применяя конструкцию `-*-...-*-' в начале этого файла или в списке локальных переменных в его конце (смотрите раздел Локальные переменные в файлах). Вы делаете это, определяя значение для "переменной" с именем coding. На самом деле в Emacs нет переменной coding; вместо установки переменной он использует заданную систему кодирования для этого файла. Например, `-*-mode: C; coding: latin-1;-*-' велит использовать систему кодирования Latin-1 и режим C. Если вы явно указали систему кодирования в файле, она перекрывает file-coding-system-alist.

Переменная auto-coding-alist -- это самый сильный способ указать систему кодирования для определённых образцов имен файлов; эта переменная даже перекрывает теги `-*-coding:-*-' в самом файле. Emacs использует это средство для tar-файлов и архивов, чтобы избежать ошибочной интерпретации тега `-*-coding:-*-' в элементе архива как относящегося ко всему архивному файлу.

Когда Emacs выбрал систему кодирования для буфера, он сохраняет её в buffer-file-coding-system и по умолчанию использует эту систему кодирования для операций, которые записывают этот буфер в файл. Это включает команды save-buffer и write-region. Если вы хотите записывать файлы из этого буфера, используя другую систему кодирования, вы можете указать для этого файла новую систему кодирования с помощью set-buffer-file-coding-system (смотрите раздел Задание системы кодирования).

Когда вы посылаете сообщение с помощью режима Mail (смотрите раздел Посылка почты), у Emacs есть четыре разных способа узнать систему кодирования для текста сообщения. Он пробует значение buffer-file-coding-system, собственное для этого буфера, если оно не равно nil. Иначе, он использует значение sendmail-coding-system, если оно не равно nil. Третий способ -- использовать систему кодирования, принимаемую по умолчанию для новых файлов, которая управляется вашей языковой средой, если она не nil. Если все три эти значения равны nil, Emacs кодирует исходящую почту, используя систему кодирования Latin-1.

Когда вы получаете новую почту в Rmail, каждое сообщение автоматически переводится из той системы кодирования, в которой оно было написано --- как если бы оно было отдельным файлом. При этом используется заданный вами список приоритетов систем кодирования. Если в сообщении в формате MIME указан набор знаков, Rmail подчиняется этому указанию, если rmail-decode-mime-charset не равна nil.

Для считывания и сохранения самих Rmail-файлов Emacs использует систему кодирования, задаваемую переменной rmail-file-coding-system. Значение по умолчанию равно nil, что означает, что Rmail-файлы не переводятся (они считываются и сохраняются во внутренней кодировке Emacs).

Задание системы кодирования

В случаях, когда Emacs не может автоматически подобрать правильную систему кодирования, вы можете указать её явно с помощью таких команд:

C-x RET f кодирование RET
Использовать систему кодирования кодирование для файла, к которому обращается текущий буфер.
C-x RET c кодирование RET
Задает систему кодирования кодирование для непосредственно следующей команды.
C-x RET k кодирование RET
Использовать систему кодирования кодирование для ввода с клавиатуры.
C-x RET t кодирование RET
Использовать систему кодирования кодирование для вывода на терминал.
C-x RET p код-ввода RET код-вывода RET
Использовать системы кодирования код-ввода и код-вывода для ввода и вывода подпроцесса текущего буфера.
C-x RET x кодирование RET
Использовать систему кодирования кодирование для передачи выделений другим программам и получения их из других программ через оконную систему.
C-x RET X кодирование RET
Использовать систему кодирования кодирование для передачи или получения одного выделения -- следующего -- в оконную систему или из нее.

Команда C-x RET f (set-buffer-file-coding-system) задаёт систему кодирования файла для текущего буфера -- другими словами, указывает, какую систему кодирования следует использовать для сохранения или повторного считывания этого файла. Вы задаёте систему кодирования в минибуфере. Так как эта команда применяется только к файлу, к которому вы уже обратились, она влияет лишь на способ сохранения этого файла.

Другой способ указать систему кодирования для файла -- сделать это во время обращения. Сначала используйте команду C-x RET c (universal-coding-system-argument); эта команда считывает в минибуфере имя системы кодирования. После выхода из минибуфера заданная система кодирования применяется для непосредственно следующей команды.

Таким образом, если непосредственно следующей командой будет, скажем, C-x C-f, то она считает файл, используя указанную систему кодирования (и запоминает эту систему кодирования для последующей записи файла). Или, если следующей командой будет C-x C-w, она запишет файл, используя эту систему кодирования. Другие команды работы с файлами, на которые действует заданная система кодирования, включают C-x C-i и C-x C-v, а также варианты C-x C-f с показом в другом окне.

C-x RET c также влияет на программы, начинающие подпроцессы, включая M-x shell (смотрите раздел Запуск команд оболочки из Emacs).

Однако, если непосредственно следующая команда не использует систему кодирования, то C-x RET c в результате не имеет эффекта.

Простой способ обратиться к файлу без преобразования предоставляет команда M-x find-file-literally. Смотрите раздел Обращение к файлам.

Переменная default-buffer-file-coding-system определяет выбор системы кодирования для вновь создаваемых файлов. Она применяется, когда вы обращаетесь к новому файлу или создаёте буфер и затем сохраняете его в файл. При выборе языковой среды эта переменная как правило устанавливается в подходящее значение по умолчанию.

Команда C-x RET t (set-terminal-coding-system) задаёт систему кодирования для терминального вывода. Если вы зададите систему кодирования для терминального вывода, все выводимые на терминал знаки переводятся в эту систему.

Это средство полезно для некоторых текстовых терминалов, сделанных с поддержкой какого-то конкретного языка или набора знаков -- например, европейских терминалов, поддерживающих один из наборов знаков ISO Latin. При использовании многобайтного текста вам нужно указать систему кодирования, чтобы Emacs знал, какие знаки этот терминал может на самом деле обработать.

По умолчанию вывод на терминал не преобразуется совсем, если только Emacs не может предугадать правильную систему кодирования для вашего типа терминала.

Команда C-x RET k (set-keyboard-coding-system) задаёт систему кодирования для ввода с клавиатуры. Перевод кодов вводимых с клавиатуры знаков полезен для терминалов, клавиши которых посылают графические не-ASCII-знаки, например, для некоторых терминалов, разработанных для кодировки ISO Latin-1 или её подмножеств.

По умолчанию ввод с клавиатуры не переводится.

Между использованием системы кодирования для перевода ввода с клавиатуры и использованием метода ввода есть некое сходство: в обоих случаях определяются вводимые с клавиатуры последовательности, превращающиеся с один знак. Однако, методы ввода разработаны для удобного интерактивного использования людьми, и переводимые ими последовательности обычно являются последовательностями печатных ASCII-знаков. Системы кодирования как правило переводят последовательности неграфических знаков.

Команда C-x RET x (set-selection-coding-system) задаёт систему кодирования для передачи выделенного текста оконной системе и для получения текста выделений, сделанных в других приложениях. Эта команда относится ко всем будущим выделениям, пока вы не отмените это, снова применив эту команду. Команда C-x RET X (set-next-selection-coding-system) задаёт систему кодирования для следующего выделения, сделанного в Emacs или считанного Emacs.

Команда C-x RET p (set-buffer-process-coding-system) задаёт систему кодирования для ввода и вывода подпроцесса. Эта команда относится к текущему буферу; как правило, каждый подпроцесс имеет собственный буфер, следовательно, вы можете указывать перекодировку ввода и вывода процесса, давая эту команду в соответствующем буфере.

По умолчанию ввод и вывод процессов не переводится совсем.

Переменная file-name-coding-system задаёт систему кодирования, используемую для кодирования имён файлов. Если вы установите её равной имени системы кодирования (это лисповский символ или строка), Emacs станет кодировать имена файлов при всех файловых операциях, используя эту систему кодирования. Это позволяет использовать в именах файлов не-ASCII-знаки, или по крайней мере те не-ASCII-знаки, которые могут быть закодированы текущей системой кодирования.

Если file-name-coding-system равна nil, Emacs использует систему кодирования по умолчанию, определяемую языковой средой. В языковой среде, принимаемой по умолчанию, любые знаки в именах файлов, не входящие в ASCII, никак особенно не кодируются; они появляются в файловой системе во внутреннем представлении Emacs.

Внимание: если вы измените file-name-coding-system (или языковую среду) в середине сеанса Emacs, вы можете столкнуться с проблемами, если вы уже обратились к файлам, чьи имена были закодированы с использованием старой системы кодирования и не могут быть представлены (или кодируются иначе) в новой системе кодирования. Если вы попытаетесь сохранить один из таких буферов под именем файла, к которому он обращается, может быть использовано неправильное имя или может возникнуть ошибка. Если случается такая проблема, используйте C-x C-w, чтобы задать для этого буфера новое имя файла.

Наборы шрифтов

Шрифт X Windows обычно определяет начертание для одного алфавита или письменности. Поэтому для отображения полного спектра всех систем письма, которые поддерживает Emacs, необходимо множество шрифтов. В Emacs такое множество называется набором шрифтов. Набор шрифтов определяется как список шрифтов, каждый из которых предназначается для работы с одним диапазоном кодов знаков.

Каждый набор шрифтов имеет имя, как и отдельный шрифт. Доступные шрифты определяются X-сервером; наборы шрифтов определяются внутри самого Emacs. Как только вы определили набор шрифтов, вы можете использовать его в Emacs, указывая его имя в любом контексте, где вы могли бы написать один шрифт. Разумеется, наборы шрифтов Emacs могут содержать только те шрифты, которые поддерживаются X-сервером; если некоторые знаки появляются на экране как пустые прямоугольники, это означает, что в используемом наборе шрифтов нет шрифта для этих знаков.

Emacs создаёт два набора шрифтов автоматически: стандартный набор шрифтов и стартовый набор шрифтов. Стандартный набор шрифтов скорее всего содержит шрифты для широкого спектра знаков, не входящих в ASCII; однако, по умолчанию Emacs использует не его. (По умолчанию Emacs старается найти шрифт, которые имеет жирный и курсивный варианты.) Вы можете указать, что нужно использовать стандартный набор шрифтов, с помощью ключа -fn или с помощью X-ресурса `Font' (смотрите раздел Ключи для задания шрифта). Например,

emacs -fn fontset-standard

Набор шрифтов не обязан задавать шрифт для каждого кода. Если набор шрифтов не определяет шрифт для некоторого знака, или его он определяет шрифт, которого нет в вашей системе, то он не может правильно отобразить этот знак. Вместо этого знака будет показан пустой прямоугольник.

Высота и ширина набора шрифтов определяются ASCII-знаками (то есть шрифтами, используемыми в этом наборе для ASCII-знаков). Если другой шрифт в этом наборе имеет иную высоту или ширину, то знаки, приписанные к этому шрифту, обрезаются до размера набора шрифтов. Если highlight-wrong-size-font отлична от nil, то вокруг знаков с неправильным размером ещё выводится прямоугольник.

Определение наборов шрифтов

Emacs создаёт стандартный набор шрифтов автоматически в соответствии с standard-fontset-spec. Именем этого набора является

-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard

или просто `fontset-standard' для краткости.

Жирный, курсивный и жирный курсивный варианты стандартного набора шрифтов создаются автоматически. Их имена имеют `bold' вместо `medium', или `i' вместо `r' или и то, и другое.

Если вы задали ASCII-шрифт по умолчанию с помощью ресурса `Font' или аргумента -fn, Emacs автоматически генерирует из него набор шрифтов. Это стартовый набор шрифтов, и его имя --- fontset-startup. Emacs делает это, заменяя в имени шрифта поля foundry, family, add_style и average_width на `*', заменяя charset_registry на `fontset', а поле charset_encoding -- на `startup' и используя затем полученную строку для задания набора шрифтов.

К примеру, если вы запустили Emacs таким образом:

emacs -fn "*courier-medium-r-normal--14-140-*-iso8859-1"

Emacs генерирует следующий набор шрифтов и использует его для первого фрейма:

-*-*-medium-r-normal-*-14-140-*-*-*-*-fontset-startup

В X-ресурсе `Emacs.Font' вы можете указывать набор шрифтов, точно так же, как и обычное имя шрифта. Но будьте внимательны и не задавайте набор шрифтов в ресурсе с символами подстановки, как `Emacs*Font', -- такая спецификация применяется для различных целей, например для меню, а меню не может обращаться с наборами шрифтов.

Вы можете определить дополнительные наборы шрифтов, используя X-ресурсы с именами `Fontset-n', где n -- число, отсчитываемое от нуля. Значение этого ресурса должно иметь такую форму:

шаблон-шрифта, [имя-кодировки:имя-шрифта]...

шаблон-шрифта, кроме двух последних полей, должен иметь форму стандартного имени X-шрифта. Два последних поля должны иметь вид `fontset-псевдоним'.

У набора шрифтов есть два имени, одно длинное, а другое короткое. Длинное имя -- это шаблон-шрифта. Короткое имя -- это `fontset-псевдоним'. Вы можете ссылаться на набор шрифтов по любому из этих имен.

Конструкция `кодировка:шрифт' определяет, какой шрифт должен использоваться (в этом наборе) для одного конкретного набора знаков. Здесь кодировка -- это имя набора знаков, а шрифт --- это используемый для него шрифт. При определении одного набора шрифтов вы можете применять эту конструкцию любое число раз.

@hyphenation{зна-че-ния} Для остальных наборов знаков Emacs выбирает шрифт, основываясь на шаблоне-шрифта. Он заменяет `fontset-псевдоним' на значения, описывающие набор знаков. Для шрифта знаков ASCII, `fontset-псевдоним' заменяется на `ISO8859-1'.

Кроме того, когда несколько последовательных полей являются символами подстановки, Emacs сжимает их в один символ. Это делается для предотвращения использования автоматически масштабированных шрифтов. Шрифты, получаемые масштабированием более крупного шрифта, непригодны для редактирования, а масштабирование мелкого шрифта бессмысленно, потому что мелкий шрифт лучше использовать с его собственным размером, что Emacs и делает.

Таким образом, если шаблон-шрифта задан так:

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

то спецификация шрифта для ASCII-знаков была бы такой:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

а спецификация шрифта для китайских знаков GB2312 такой:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

У вас может не оказаться китайских шрифтов, соответствующих приведенной выше спецификации. Большинство дистрибутивов X Windows включают только китайские шрифты с `song ti' или `fangsong ti' в поле family. В таком случае `Fontset-n' можно задать таким образом:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
 chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

Тогда спецификации всех шрифтов, кроме китайских GB2312, будут иметь `fixed' в поле family, а спецификации для китайских знаков GB2312 несут в поле family символ подстановки `*'.

Функция, которая обрабатывает значение ресурса, определяющего набор шрифтов, и создаёт этот набор, называется create-fontset-from-fontset-spec. Вы также можете вызывать эту функцию явно, чтобы сгенерировать набор шрифтов.

Смотрите раздел Ключи для задания шрифта, для большей информации об именовании шрифтов в X.

Поддержка однобайтных европейских знаков

Наборы знаков ISO 8859 Latin-n определяют коды знаков в диапазоне от 160 до 255 для обращения с акцентированными буквами и знаками препинания, необходимыми в различных европейских языках. Если вы выключите поддержку многобайтных знаков, Emacs все же сможет работать с одной из этих кодировок. Чтобы указать, какие из этих кодов следует использовать, вызовите M-x set-language-environment и задайте подходящую языковую среду, такую как `Latin-n'.

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

Emacs может также отображать такие знаки, при условии, что они поддерживаются терминалом или шрифтом. Это работает автоматически. Или, если вы используете оконную систему, Emacs может отображать однобайтные знаки через наборы шрифтов, показывая в действительности эквивалентные многобайтные знаки в соответствии с языковой средой. Чтобы затребовать это, установите переменную unibyte-display-via-language-environment в отличное от nil значение.

Если ваш терминал не поддерживает набор знаков Latin-1, Emacs может отображать их как ASCII-последовательности, которые по крайней мере дают вам ясное представление о том, что это за знаки. Чтобы сделать так, загрузите библиотеку iso-ascii. Могут быть реализованы похожие библиотеки и для других наборов знаков Latin-n, но пока их у нас нет.

Обычно не входящие в ISO-8859 знаки (между 128 и 159 включительно) отображаются как восьмиричные управляющие последовательности. Вы можете изменить это для нестандартных `расширенных' версий наборов знаков ISO-8859, используя функцию standard-display-8bit из библиотеки disp-table.

Есть три разных способа вводить однобайтные не-ASCII-знаки:

  • Если ваша клавиатура может генерировать коды знаков от 128 и выше, представляющие знаки, не входящие в ASCII, выполните следующее выражение, чтобы Emacs смог их понимать:
    (set-input-mode (car (current-input-mode))
     (nth 1 (current-input-mode))
     0)
    
  • Вы можете использовать метод ввода для выбранной языковой среды. Смотрите раздел Методы ввода. Когда вы используете метод ввода в однобайтном буфере, задаваемые с его помощью знаки переводятся в однобайтное представление.
  • Для ввода печатных знаков Latin-1 вы можете использовать C-x 8 как префикс "составления". C-x 8 удобен для вставки (в минибуфере, а также в остальных буферах), для поиска и во всех других контекстах, где допускаются последовательности знаков. C-x 8 работает путем загрузки библиотеки iso-transl. Когда эта библиотека загружена, клавиша-модификатор ALT, если она у вас есть, служит для той же цели, что и C-x 8; используйте ALT вместе со знаком акцента, чтобы модифицировать следующую букву. Кроме того, если у вас есть залипающие клавиши для генерации акцентов Latin-1, то они тоже определены для компоновки со следующим знаком, если iso-transl загружена.

Назад |  Вперед |  Содержание



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024