Emacs поддерживает широкий спектр наборов знаков разных языков,включая европейские варианты латинского алфавита, а также китайскую,девангари (хинди и маратхи), эфиопскую, греческую, IPA, японскую,корейскую, лаосскую, русскую, тайскую, тибетскую и вьетнамскуюписьменности. Эти возможности были внесены из измененной версии Emacs,известной как MULE (от "MULti-lingual Enhancement to GNUEmacs".@transnote{Многоязыковое расширение GNU Emacs.})
Введение в наборы знаков разных языков
Пользователи этих систем письма выработали много более или менеестандартных систем кодирования для хранения файлов. Внутренне Emacsиспользует единую многобайтную кодировку, так что в ней можноперемешивать знаки из всех этих систем письма в одном буфере или строке.Эта кодировка представляет каждый знак, не входящий в ASCII, какпоследовательность байт в промежутке от 0200 до 0377. Emacs переводитиз этой многобайтной кодировки в различные другие системы кодированияпри считывании и записи файлов, при обмене данными с подпроцессами и (внекоторых случаях) в команде C-q (see section Однобайтные и многобайтные не-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
. See section Обращение к файлам.Чтобы превратить буфер в многобайтном представлении в однобайтноепредставление тех же знаков, проще всего сохранить содержимое этогобуфера в файле, уничтожить его и снова обратиться к этому файлу с помощьюfind-file-literally
. Вы также можете использовать C-xRET c (universal-coding-system-argument
) и указать`raw-text' в качестве системы кодирования для обращения к файлу илидля его сохранения. See section Задание системы кодирования. Обращение к файлу какк `raw-text' не выключает преобразование формата, декомпрессию иавтоматический выбор режима, в отличие от find-file-literally
.
Чтобы выключить поддержку многобайтных знаков по умолчанию, запуститеEmacs с ключом @option{--unibyte} (see section Ключи запуска) или установитепеременную среды @env{EMACS_UNIBYTE}. Вы также можете настроитьпараметр enable-multibyte-characters
или, что эквивалентно, прямоустановить переменную default-enable-multibyte-characters
в вашемфайле инициализации, это дает в основном тот же эффект, что и@option{--unibyte}.
Во время инициализации не создаются многобайтные строки из значенийпеременных среды, вхождений файла `/etc/passwd', etc., которыесодержат не входящие в ASCII восьмибитные знаки. Однако, файлинициализации обычно считывается как многобайтный -- как все файлы наЛиспе -- даже если задан ключ @option{--unibyte}. Чтобы избежатьсоздания многобайтных строк из находящихся в этом файле строк сне-ASCII-знаками, поместите в его первой строке комментарий с текстом`-*-unibyte: t;-*-'. Для файлов инициализации других пакетов,вроде Gnus, нужно сделать то же самое.
В строке режима показано, включена ли поддержка многобайтных знаков втекущем буфере. Если она включена, перед двоеточием в начале строкирежима стоят два или более знака (чаще всего два дефиса). Когдамногобайтные знаки не включены, перед двоеточием есть только один дефис.
Языковые среды
Все поддерживаемые наборы знаков допустимы в буферах Emacs, есливключены многобайтные знаки; нет необходимости выбирать конкретный язык,чтобы увидеть его знаки в буфере Emacs. Однако, важно выбратьязыковую среду, чтобы получить различные установки по умолчанию.На самом деле языковая среда представляет выбор предпочтительнойписьменности (в большей или меньшей степени), а не выбор языка.
Языковая среда определяет, какие системы кодирования распознаются присчитывании текста (see section Распознавание систем кодирования). Это относится кфайлам, приходящей почте, сетевым новостям и любому другому тексту,который вы считываете в 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-xRET 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-xquail-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
) выводит сведения оконкретной системе кодирования. Вы можете задать имя системыкодирования в качестве аргумента; иначе, с пустым аргументом, она опишетсистемы кодирования, выбранные в данный момент для различных целей как втекущем буфере, так и принимаемые по умолчанию, а также переченьприоритетов для распознавания систем кодирования (see section Распознавание систем кодирования).
Чтобы вывести перечень всех поддерживаемых систем кодирования,наберите M-x list-coding-systems. Этот перечень дает информацию окаждой системе кодирования, включая букву, обозначающую ее в строкережима (see section Строка режима).
Каждая система кодирования из перечисленных в этом списке -- кроме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, которыемогли бы преобразовать содержимое файла до того, как вы его увидите.See section Обращение к файлам.
Система кодирования emacs-mule
полагает, что файл содержит не-ASCII-знаки во внутренней кодировкеEmacs. Она обрабатывает преобразование конца-строки, основываясьна увиденных данных, и имеет три обычных варианта для указания нужногопреобразования конца-строки.
Распознавание систем кодирования
Чаще всего Emacs может распознать, какую систему кодирования он должениспользовать для любого данного файла, -- если вы указали своипредпочтения.
Некоторые системы кодирования могут быть распознаны или выделены потому, какие последовательности знаков появляются среди данных. Однако,есть системы кодирования, которые не могут быть различены, дажепотенциально. Например, нет способа отличить Latin-1 от Latin-2; онииспользуют одни и те же значения байт с разными смыслами.
Emacs справляется с такой ситуацией при помощи списка приоритетовсистем кодирования. Если вы не указали, какую систему кодирования надоиспользовать, Emacs во время считывания файла сверяет данные с каждойсистемой кодирования, начиная с первой по приоритету и продвигаясь внизпо списку, пока не найдет систему кодирования, подходящую для этогофайла. Затем он преобразует содержимое файла, предполагая, что онопредставлено в этой системе кодирования.
Список приоритетов систем кодирования зависит от выбранной языковойсреды (see section Языковые среды). Например, если вы используетефранцузский, вы, вероятно, захотите, чтобы 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
.
Вы можете указать систему кодирования для конкретного файла, применяяконструкцию `-*-...-*-' в начале этого файла или в спискелокальных переменных в его конце (see section Локальные переменные в файлах). Вы делаетеэто, определяя значение для "переменной" с именем 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
(see section Задание системы кодирования).
Когда вы посылаете сообщение с помощью режима Mail (see section Посылка почты), у 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 (see section Запуск команд оболочки из Emacs).
Однако, если непосредственно следующая команда не использует системукодирования, то C-x RET c в результате не имеет эффекта.
Простой способ обратиться к файлу без преобразования предоставляеткоманда M-x find-file-literally. See section Обращение к файлам.
Переменная 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 RETX (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-xC-w, чтобы задать для этого буфера новое имя файла.
Наборы шрифтов
Шрифт X Windows обычно определяет начертание для одного алфавита илиписьменности. Поэтому для отображения полного спектра всех системписьма, которые поддерживает Emacs, необходимо множество шрифтов. ВEmacs такое множество называется набором шрифтов. Набор шрифтовопределяется как список шрифтов, каждый из которых предназначается дляработы с одним диапазоном кодов знаков.
Каждый набор шрифтов имеет имя, как и отдельный шрифт. Доступныешрифты определяются X-сервером; наборы шрифтов определяются внутрисамого Emacs. Как только вы определили набор шрифтов, вы можетеиспользовать его в Emacs, указывая его имя в любом контексте, где вымогли бы написать один шрифт. Разумеется, наборы шрифтов Emacs могутсодержать только те шрифты, которые поддерживаются X-сервером; еслинекоторые знаки появляются на экране как пустые прямоугольники, этоозначает, что в используемом наборе шрифтов нет шрифта для этих знаков.
Emacs создает два набора шрифтов автоматически: стандартный наборшрифтов и стартовый набор шрифтов. Стандартный набор шрифтовскорее всего содержит шрифты для широкого спектра знаков, не входящих вASCII; однако, по умолчанию Emacs использует не его. (По умолчаниюEmacs старается найти шрифт, которые имеет жирный и курсивный варианты.)Вы можете указать, что нужно использовать стандартный набор шрифтов, спомощью ключа @option{-fn} или с помощью X-ресурса `Font'(see section Ключи для задания шрифта). Например,
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'или аргумента @option{-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
. Вы также можете вызывать этуфункцию явно, чтобы сгенерировать набор шрифтов.
See section Ключи для задания шрифта, для большей информации об именовании шрифтов в X.
Поддержка однобайтных европейских знаков
Наборы знаков ISO 8859 Latin-n определяют коды знаков вдиапазоне от 160 до 255 для обращения с акцентированными буквами изнаками препинания, необходимыми в различных европейских языках. Есливы выключите поддержку многобайтных знаков, Emacs все же сможет работатьс одной из этих кодировок. Чтобы указать, какие из этихкодов следует использовать, вызовите M-x set-language-environment изадайте подходящую языковую среду, такую как `Latin-n'.
Для получения большей информации об однобайтном режиме смотритеsection Включение поддержки многобайтных знаков. В частности, обратите внимание нато, что ваши файлы инициализации считываются как однобайтные, если онисодержат не-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)
- Вы можете использовать метод ввода для выбранной языковой среды.See section Методы ввода. Когда вы используете метод ввода в однобайтномбуфере, задаваемые с его помощью знаки переводятся в однобайтноепредставление.
- Для ввода печатных знаков Latin-1 вы можете использовать C-x 8 какпрефикс "составления". C-x 8 удобен для вставки (в минибуфере,а также в остальных буферах), для поиска и во всех других контекстах,где допускаются последовательности знаков. C-x 8 работает путем загрузки библиотеки
iso-transl
. Когдаэта библиотека загружена, клавиша-модификатор ALT, если она у васесть, служит для той же цели, что и C-x 8; используйте ALTвместе со знаком акцента, чтобы модифицировать следующую букву. Крометого, если у вас есть залипающие клавиши для генерации акцентов Latin-1,то они тоже определены для компоновки со следующим знаком, еслиiso-transl
загружена.