Підтримка різних мов – ЧАСТИНА 3

Emacs справляється з такою ситуацією за допомогою списку пріоритетів систем кодування Якщо ви не вказали, яку систему кодування треба використовувати, Emacs під час зчитування файлу звіряє дані з кожної системою кодування, починаючи з першої по пріоритету і просуваючись вниз за списком, поки не знайде систему кодування, відповідну для цього файлу Потім він перетворює вміст файлу, припускаючи, що воно представлено в цій системі кодування

2 Воно також наказано для тел MIME text / * та інших контекстів пересилання по мережі Це відрізняється від формату синтаксису посилань SGML начало-запісі/конец-запісі, який Emacs не підтримує безпосередньо

Список пріоритетів систем кодування залежить від обраної мовної середовища (див Розділ 183 [Мовні середовища], с 162) Наприклад, якщо ви використовуєте французький, ви, ймовірно, захочете, щоб Emacs волів Latin-1, а не Latin-2 а якщо ви використовуєте чеська – щоб перевага віддавалася Latin-2 Це одна з причин задавати мовне середовище

Однак, ви можете детально змінювати список пріоритетів за допомогою команди Mx 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 &quot\\txt\\’&quot ’china-iso-8bit)

Першим аргументом має бути file, друга – регулярне вираз, що визначає, до яких файлів це відноситься, а третій аргумент говорить, яку систему кодування застосовувати для цих файлів

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

Ви можете вказати систему кодування для конкретного файлу, застосовуючи конструкцію – * – .. – * – на початку цього файлу або в списку локальних змінних в його кінці (див Розділ 3125 [Змінні файлу], с 351) Ви робите це, визначаючи значення для змінної з імям coding Насправді в Emacs немає змінної coding замість установки змінної він використовує задану систему кодування для цього файлу Наприклад, – *-mode: C coding: latin-1 – * – велить використовувати систему кодування Latin-1 і режим C Якщо ви явно вказали систему кодування у файлі, вона перекриває file-coding-system-alist

Мінлива auto-coding-alist – це найсильніший спосіб вказати систему кодування-

вання для певних зразків імен файлів ця змінна навіть перекриває теги

‘- *-Coding: – * – в самому файлі Emacs використовує цей засіб для tar-файлів і архівів, щоб уникнути помилкової інтерпретації тега – *-coding: – * – в елементі архіву як відноситься до всього архівному файлу

Коли Emacs вибрав систему кодування для буфера, він зберігає її в buffer-filecoding-system і за замовчуванням використовує цю систему кодування для операцій, які записують цей буфер у файл Це включає команди save-buffer і writeregion Якщо ви хочете записувати файли з цього буфера, використовуючи іншу систему кодування, ви можете вказати для цього файлу нову систему кодування за допомогою set-buffer-file-coding-system (див Розділ 189 [Завдання кодування], с 168)

Коли ви посилаєте повідомлення за допомогою режиму Mail (див Глава 26 [Посилка пошти], с 267), у 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)

189  Завдання системи кодування

У випадках, коли Emacs не може автоматично підібрати правильну систему коди-

вання, ви можете вказати її явно за допомогою таких команд:

C-x hRETf кодування hRETi

Використовувати систему кодування кодування для файлу, до якого обра-

щается поточний буфер

C-x hRETc кодування hRETi

Задає систему кодування кодування для безпосередньо наступної ко-

мих фахівців

C-x hRETk кодування hRETi

Використовувати систему кодування кодування для введення з клавіатури

C-x hRETt кодування hRETi

Використовувати систему кодування кодування для виведення на термінал

C-x hRETp кодвведення hRETкодвиводу hRETi

Використовувати системи кодування кодвведення і кодвиводу для введення і виведення подпроцесса поточного буфера

C-x hRETx кодування hRETi

Використовувати систему кодування кодування для передачі виділень дру-

гим програмами і отримання їх з інших програм через віконну систему

C-x hRETX кодування hRETi

Використовувати систему кодування кодування для передачі або отримання

одного виділення – наступного – у віконну систему або з неї

Команда C-x hRETf (set-buffer-file-coding-system) задає систему кодування файлу для поточного буфера – іншими словами, вказує, яку систему кодування слід використовувати для збереження або повторного зчитування цього файлу Ви задаєте систему кодування в мінібуфер Так як ця команда застосовується тільки до файлу, до якого ви вже звернулися, вона впливає лише на спосіб збереження цього файлу

Інший спосіб вказати систему кодування для файлу – зробити це під час звернення Спочатку використовуйте команду Cx hRETc (universal-coding-system-argument) ця команда зчитує в мінібуфер імя системи кодування Після виходу з мінібуфера задана система кодування застосовується для безпосередньо наступної команди

Таким чином, якщо безпосередньо наступною командою буде, скажімо, Cx Cf, то вона вважає файл, використовуючи зазначену систему кодування (і запамятовує цю систему

кодування для подальшого запису файлу) Або, якщо наступною командою буде Cx Cw, вона запише файл, використовуючи цю систему кодування Інші команди роботи з файлами, на які діє задана система кодування, включають Cx Ci і Cx Cv, а також варіанти Cx Cf з показом в іншому вікні

C-x hRETc також впливає на програми, початківці підпроцеси, включаючи Mx shell

(Див Розділ 302 [Оболонка], с 323)

Однак, якщо безпосередньо наступна команда не використовує систему кодування,

то C-x hRETc в результаті не має ефекту

Простий спосіб звернутися до файлу без перетворення надає команда Mx find-file-literally Див Розділ 142 [Звернення], с 106

Мінлива default-buffer-file-coding-system визначає вибір системи кодування для новостворюваних файлів Вона застосовується, коли ви звертаєтеся до нового файлу або створюєте буфер і потім зберігаєте його у файл При виборі мовного середовища ця змінна як правило встановлюється в підходяще значення за замовчуванням

Команда C-x hRETt (set-terminal-coding-system) задає систему кодування для термінального виведення Якщо ви задасте систему кодування для термінального виведення, всі виведені на термінал знаки переводяться в цю систему

Це засіб корисно для деяких текстових терміналів, зроблених з підтримкою якогось конкретного мови або набору знаків – наприклад, європейських терміналів, що підтримують один з наборів знаків ISO Latin При використанні багатобайтові тексту вам потрібно вказати систему кодування, щоб Emacs знав, які знаки цей термінал може насправді обробити

За замовчуванням висновок на термінал НЕ перетворюється зовсім, якщо тільки Emacs не може передбачити правильну систему кодування для вашого типу терміналу

Команда C-x hRETk (set-keyboard-coding-system) задає систему кодування для введення з клавіатури Переклад кодів, які вводяться з клавіатури знаків корисний для терміналів, клавіші яких посилають графічні НЕ-ASCII-знаки, наприклад, для деяких терміналів, розроблених для кодування ISO Latin-1 або її підмножин

За замовчуванням введення з клавіатури не переводиться

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

Команда C-x hRETx (set-selection-coding-system) задає систему кодування для передачі виділеного тексту віконній системі і для отримання тексту виділень, зроблених в інших додатках Ця команда ставиться до всім майбутнім виділенням, поки ви не скасуєте це, знову застосувавши цю команду Команда C-x hRETX (set-nextselection-coding-system) задає систему кодування для наступного виділення, зробленого в Emacs або ліченого Emacs

Команда C-x hRETp (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, ви можете зіткнутися з проблемами, якщо ви вже звернулися до файлів, чиї імена були закодовані з використанням старої системи кодування і не можуть бути представлені (або кодуються інакше) у новій системі кодування Якщо ви спробуєте зберегти один з таких буферів під імям файлу, до якого він звертається, може бути використано неправильне імя або може виникнути помилка Якщо трапляється така проблема, використовуйте Cx Cw, щоб задати для цього буфера нове імя файлу

1810  Набори шрифтів

Шрифт X Windows зазвичай визначає накреслення для одного алфавіту або писемності Тому для відображення повного спектру всіх систем письма, які підтримує Emacs, необхідно безліч шрифтів У Emacs така безліч називається набором шрифтів Набір шрифтів визначається як список шрифтів, кожен з яких призначається для роботи з одним діапазоном кодів знаків

Кожен набір шрифтів має імя, як і окрема шрифт Доступні шрифти визначаються X-сервером набори шрифтів визначаються всередині самого Emacs Як тільки ви визначили набір шрифтів, ви можете використовувати його в Emacs, вказуючи його імя в будь-якому контексті, де ви могли б написати один шрифт Зрозуміло, набори шрифтів Emacs можуть містити тільки ті шрифти, які підтримуються X-сервером якщо деякі знаки зявляються на екрані як порожні прямокутники, це означає, що у використовуваному наборі шрифтів немає шрифту для цих знаків

Emacs створює два набори шрифтів автоматично: стандартний набір шрифтів і стартовий набір шрифтів Стандартний набір шрифтів швидше за все містить шрифти для широкого спектра знаків, що не входять в ASCII проте, за замовчуванням Emacs використовує не його (За замовчуванням Emacs намагається знайти шрифт, які має жирний і курсивний варіанти) Ви можете вказати, що потрібно використовувати стандартний набір шрифтів, за допомогою ключа -fn або за допомогою X-ресурсу Font (див Розділ A7 [Шрифт X], с 392) Наприклад,

emacs  -fn fontset-standard

Набір шрифтів не зобовязаний здавати шрифт для кожного коду Якщо набір шрифтів не визначає шрифт для деякого знака, або його він визначає шрифт, якого немає у вашій системі, то він не може правильно відобразити цей знак Замість цього знака буде показаний порожній прямокутник

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

1811  Визначення наборів шрифтів

Emacs створює стандартний набір шрифтів автоматично відповідно до standardfontset-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 &quot*courier-medium-r-normal-14-140-*-iso8859-1&quot

Emacs генерує наступний набір шрифтів і використовує його для першого фрейму:

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

У X-ресурсі EmacsFont ви можете вказувати набір шрифтів, точно так само, як і звичайне імя шрифту Але будьте уважні і не задавайте набір шрифтів в ресурсі з символами підстановки, як Emacs * Font, – Така специфікація застосовується для різних цілей, наприклад для меню, а меню не може звертатися з наборами шрифтів

Ви можете визначити додаткові набори шрифтів, використовуючи X-ресурси з іменами Fontset-n, Де n – Число, що відраховується від нуля Значення цього ресурсу повинно мати таку форму:

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

шаблоншрифту, крім двох останніх полів, повинен мати форму стандартного імені

X-шрифта Два останніх поля повинні мати вигляд fontset-псевдонім.

У набору шрифтів є два імені, одне довге, а інше коротке Довге імя – це шаблоншрифту Коротке імя – це fontset-псевдонім. Ви можете посилатися на набір шрифтів по будь-якому з цих імен

Конструкція кодування: шрифт визначає, який шрифт повинен використовуватися (в цьому наборі) для одного конкретного набору знаків Тут кодування – це імя набору знаків, а шрифт – це використовуваний для нього шрифт При визначенні одного набору шрифтів ви можете застосовувати цю конструкцію будь-яке число разів

Для інших наборів знаків 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Мож-

але задати таким чином:

EmacsFontset-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 Ви також можете викликати цю функцію явно, щоб згенерувати набір шрифтів

Див Розділ A7 [Шрифт X], с 392, для більшої інформації про іменування шрифтів в

X

1812  Підтримка однобайтних європейських знаків

Набори знаків ISO 8859 Latin-n визначають коди знаків в діапазоні від 160 до 255 для поводження з акцентованими літерами та знаками пунктуації, необхідними в різних європейських мовах Якщо ви вимкнете підтримку багатобайтові знаків, Emacs все ж зможе працювати з однією з цих кодувань Щоб вказати, які з цих кодів слід використовувати, викличте Mx set-language-environment і задайте підходящу мовне середовище, таку як Latin-n

Для отримання більшої інформації про однобайтном режимі дивіться Розділ 182 [Включення багатобайтові знаків], с 161 Зокрема, зверніть увагу на те, що ваші файли ініціалізації зчитуються як однобайтние, якщо вони містять не-ASCIIзнакі

Emacs може також відображати такі знаки, за умови, що вони підтримуються терміналом або шрифтом Це працює автоматично Або, якщо ви використовуєте віконну систему, Emacs може відображати однобайтние знаки через набори шрифтів, показуючи насправді еквівалентні багатобайтові знаки відповідно до мовним середовищем Щоб зажадати це, встановіть змінну unibyte-display-via-languageenvironment в відмінне від nil значення

Якщо ваш термінал не підтримує набір знаків Latin-1, Emacs може відображати їх як ASCII-послідовності, які принаймні дають вам ясне уявлення про те, що це за знаки Щоб зробити так, завантажте бібліотеку iso-ascii Можуть бути реалізовані схожі бібліотеки і для інших наборів знаків Latin-n, Але поки їх у нас немає

Зазвичай не входять до ISO-8859 знаки (між 128 і 159 включно) відображаються як вісімковий керуючі послідовності Ви можете змінити це для нестандартних розширених версій наборів знаків ISO-8859, використовуючи функцію standarddisplay-8bit з бібліотеки disp-table

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

Якщо ваша клавіатура може генерувати коди знаків від 128 і вище, що представляють знаки, що не входять в ASCII, виконайте наступний вираз, щоб Emacs зміг їх розуміти:

(set-input-mode  (car  (current-input-mode)) (nth 1  (current-input-mode))

0)

Ви можете використовувати метод введення для обраної мовної середовища Див Розділ 184 [Методи введення], с 163 Коли ви використовуєте метод введення в однобайтном буфері, що задаються з його допомогою знаки переводяться в однобайтное уявлення

Для введення друкованих знаків Latin-1 ви можете використовувати Cx 8 як префікс складання. Cx 8 зручний для вставки (в мінібуфер, а також в інших буферах), для пошуку і в усіх інших контекстах, де допускаються послідовності знаків

Cx 8 працює шляхом завантаження бібліотеки iso-transl Коли ця бібліотека завантажена, клавіша-модифікатор hALTi, Якщо вона у вас є, служить для тієї ж мети, що і Cx 8 використовуйте hALTi  разом зі знаком акценту, щоб модифікувати наступну букву Крім того, якщо у вас є Липкі клавіші для генерації акцентів Latin-1, то вони теж визначені для компоновки з наступним знаком, якщо iso-transl завантажена

Джерело: Річард Столмен, Керівництво по GNU Emacs

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*