Використання української мови в X/GNU Emacs'і

Вживання української мови в emacs 'і базується в основному на використанні модуля ukrainian.el . Цей модуль дозволяє друкувати кількома різними кодовими таблицями, перекодовувати тексти з одних кодових таблиць в інші, використовувати різні розкладки клавіатури, тощо.

Разом з emacs 'ом можливе також використання стандартних драйверів клавіатури для Юнікса. Існує кілька таких драйверів, придатних для друку українською мовою. В залежності від середовища, в якому ви плануєте використовувати emacs , ви можете обрати той чи інший драйвер. Для X існують такі програми, як xrus та kikbd. Xrus може працювати в кількох різноманітних Юніксах, в той час як kikbd є стандартною складовою KDE і тому обмежений до тих систем, на яких KDE працює.

Однак стандартні клавіатурні драйвери мають один суттєвий недолік при роботі з emacs 'ом. Драйвери дають вам можливість друку українською та англійською мовами. Але коли ви друкуєте українською (тобто знаходитесь в українському режимі), ви не можете виконати жодної команди emacs 'у. Тому, перш ніж виконати будь-яку команду, потрібно перемикнутися в англійський режим, виконати команду і, повернувшись в український режим, продовжувати друкувати. Постійне перемикання з одного режиму в інший дуже незручне. І тому, тут я зупинюся тільки на використанні модуля ukrainian.el , і не буду торкатися інших питань.

Дуже чітке і доступне пояснення вживання української мови в emacs 'і написане Степаном Бобиком на його сторінці. На цій сторінці йдеться лише про деякі доповнення до цього матеріалу, а саме такі деталі, які дещо покращують роботу з модулем.

Зміни до модуля ukrainian.el

Через деякі розбіжності в типах даних в elisp'і GNU Emacs 'а та elisp'і X Emacs 'а модуль, написаний для GNU Emacs 'а, не працює з X Emacs 'ом.

Тут ви можете знайти трохи видозмінену версію ukrainian.el , яка дозволяє працювати з обома версіями emacs 'ів.

Старт emacs'у

Починаючи з версії 20.x як Emacs , так і X Emacs мають підтримку для багатьох мов. Ця підтримка з'явилася з часу поєднання двох окремих проектів - emacs та mule ( MU lti L anguage E macs).

В нових версіях emacs 'ів значно змінене внутрішнє подання тексту. В переважній більшості текстових редакторів текст уявляється звичайною послідовністю байтів. І таке подання справедливе до того часу, поки йде обробка так званих "малих" писемних систем. До малих систем відносяться практично всі мови Європи і багато мов інших реґіонів - тобто всі мови з абеткою. Для "великих" писемних систем - ієроґліфічні системи писемності (китайська, японська), такі мови, як арабська, корейська, тощо - одного байту (всього 256 символів) не вистачає. Тож mule (а тепер emacs ) намагається розв'язати це питання шляхом використання більше, ніж одного байту на літеру.

Дякуючи цьому, emacs , в якому включена підтримка багатобайтного подання тексту, дуже часто робить не те, що вам би хотілося. І навіть, якщо на перший погляд все йде, так як треба, пізніше може виявитися, що не всі функції в модулі ukrainian.el працюють.

Якщо новий emacs підтримує багато мов, то навіщо ж тоді ще використання ще якогось модуля? Відповідь дуже проста: новий emacs не підтримує української мови. І на даний час (жовтень 1999) ще не відомо коли буде підтримувати. Підтримка російської мови, яка існує зараз в обох emacs 'ах для української не підходить, і, як виявилося, не вже легко додати ті кілька літер, яких не вистачає.

Якщо ви маєте (x) emacs 'а номер версії якого, 20 або більше (перевірити версію можна за допомогою emacs -version ), то щоб модуль ukrainian.el працював так як треба, слід додати ще один параметр при старті emacs 'у:

        emacs  --unibyte [далі ті параметри, якими ви користувалися]

Цей параметр відключає підтримку для всих тих мов, які закладені в emacs . Але я сподіваюся, що більшості україномовних користувачів немає необхідності користуватися японською, китайською, тощо. Тому таке рішення задовольнить всих тих, кому потрібна англійська та українська. Після встановлення модуля russian.el, можливо також користування російською. Далі йде про те, як користуватися трьома мовами одночасно.

Необхідні зміни до .emacs

Далі я переходжу до основної частини свого твору. Вона складається із того тексту, який необхідно додати до файлу . emacs , та моїх коментарів до цього тексту. Навіть, якщо ви не розумієте про що йде мова, просто "cut-n-paste" всі ці шматки lisp коду, вставте його в . emacs і ви готові.

Як змусити emacs "розуміти" українські літери

Одним (одним із?) недоліком українського режиму при користуванні ukrainian.el є те, що emacs не розуміє української абетки. Всі українські літери в ньому вважаються розділовими знаками. І тому будь-яка команда типу стерти слово вперед/назад (M-x backward-kill-word, M-x forward-kill-word) може закінчитися крахом - emacs зітре весь український текст від курсора до першої англійської літери. Теж саме стосується пересування по тексту: команди M-x forward-word, M-x backward-word (клавіші - M-<стрілка праворуч>, M-<стрілка лівовуч>) пересуваються по тексту не словами, а англійськими літерами.

Наступний текст дозволяє виправити ці помилки. Змінні cuc та clc доповнюють emacs великими та малими літерами української мови. Але, ця модифікація працює тільки для кодової таблиці koi8-u. Саме цьому я не включаю ці визначення в текст модуля ukrainian.el , для цього потрібно було б щось солідніше - хоча б для кількох кодових таблиць.

        ;;;;;; Ukrainian/Russian viewing/input setting
        ;;;

        ;;
        ;; D.Kovalev (DK) kov@tokyo.email.ne.jp :- Some customizations around
        ;; ukrainian.el, russian.el and Cyrillic HOWTO from Linux HOWTO's
        ;; 
        ;; From Cyrillic HOWTO by Belikov :
        ;;
        ;; [...]  Emacs  doesn't know yet, that Cyrililic characters may
        ;; constitute a word, let alon the upper/lower case conversion
        ;; rules. In order to teach  Emacs  doing that, you have to modify the
        ;; syntax and case tables of  emacs :
        ;;
        (require 'case-table)
        ;; added 4 Ukrainian letters (DK)
        ;; і \246\266 
        ;; ї \247\267
        ;; ґ \255\275
        ;; є \244\264
        ;;
        ;; Also changed r?c -> c?c from the source to be politically
        ;; correct. It's supposed to be 'Cyrillic Character', not 'Russian',
        ;; right? (DK) 
        ;;
                                                ; Attention !!! included here
                                                ; works only for KOI8-U, for
                                                ; other encodings 'cuc' and
                                                ; 'cul' entries must be
                                                ; redefined.
        (let* ((cuc "\266\267\275\264\341\342\367\347\344\345\263\366\372\351\352\353\354\355\356\357\360\362\363\364\365\346\350\343\376\373\375\370\371\377\374\340\361")
               (clc "\246\247\255\244\301\302\327\307\304\305\243\326\332\311\312\313\314\315\316\317\320\322\323\324\325\306\310\303\336\333\335\330\331\337\334\300\321")
               (i 0)
               (len (length cuc)))
          (while (< i len)
            (modify-syntax-entry (elt cuc i) "w  ")
            (modify-syntax-entry (elt clc i) "w  ")
            (set-case-syntax-pair (elt cuc i) (elt clc i) (standard-case-table))
            (setq i (+ i 1))))

Дякуючи цим модифікаціям також можливо користуватися функціями переведення слів із реґістру в реґістр - тобто із малих українських літер в великі, і навпаки.

Як зробити так, щоб emacs показував українські літери

В цьому розділі нічого нового немає. Все повністю взяте із переписки з Степаном Бобиком і може бути знайденим на його сторінці з українізації emacs 'у. Тому я привожу тут це без всяких коментарів:

        ;; Ukrainian displaying mode -- file: ukrainian.el --------------
        ;; From Stephen Bobik
        
                                                ; Force the upper part of the
                                                ; ascii displayed as-it-is
        (standard-display-8bit 160 255)
                                                ; Load the  emacs  lisp code to
                                                ; perform koi8 text
                                                ; transformations.

Як зробити так, щоб можна було користуватися не тільки українською, а також і російськю мовами

Для вживання російської мови в emacs 'і існує інший модуль - russian.el (від якого походить ukrainian.el ). emacs дозволяє користуватися обома модулями одночасно. Для цього потрібно завантажити обидва модулі в emacs , це робиться за допомогою двох наступних рядків тексту. Зверніть увагу, що в моїй системі всі модулі в emacs Lisp'і знаходяться в директорії ~/.lisp . Змініть цю назву відповідно до вашої системи.

        (load-file "~/.lisp/ukrainian.el")
        (load-file "~/.lisp/russian.el")

Але, переходити із українського режиму в російський безпосередньо неможливо. Якщо ви, знаходячись, наприклад, в українському режимі спробуєте виконати команду M-x russian-insertion-mode , emacs перейде в якийсь невідомий режим і почне друкувати бозна що. Для того, щоб коректно перейти з режиму в режим, потрібно спочатку вийти з українського режиму (командою M-x ukrainian-insertion-mode , а потім вже вмикати російський режим командою M-x russian-insertion-mode .

З урахуванням цього я додав кілька нових функцій, які теж мають своє місце в . emacs , і забезпечують необхідну функціональність. Функція toggle-ukrainian , перш за все вимикає російський режим (не залежно від того був він вмикнений, чи ні), а потім вже перемикає український режим (тобто перемикається з українського в англійський і навпаки).

        ;; Because I have both Ukrainian and Russian in my  emacs  I need
        ;; following. If I, let's say, in Ukrainian insertion mode and want to
        ;; switch to Russian, I need to switch Ukrianian off first and *then*
        ;; turn Russian on. If I do 'M-x russian-insertion-mode', without
        ;; doing 'M-x ukrainian-insertion-mode' my keyboard ends up all
        ;; screwed. And vice-versa for switching from R -> U. So the
        ;; following 2 functions defined to provide easy "cross" switching
        ;; from one mode into another. (-DK)
        
        (defun toggle-ukrainian ()
          (interactive)
          "Make sure the Russian is off first and then toggle Ukrainian"
          (russian-insertion-mode -1)
          (ukrainian-insertion-mode)
          )

Функція toggle-russian працює аналоґічно до toggle-ukrainian .

        (defun toggle-russian ()
          (interactive)
          "Turn off Ukrainian mode before setting Russian mode"
          (ukrainian-insertion-mode -1)
          (russian-insertion-mode)
        )

Перемикання клавіатур

Для того, щоб було зручно перемикати клавіатуру з одного режиму в інший, в моєму . emacs визначені такі "клавіатурні прискорювачі":

        (global-set-key "\C-c\C-u" 'toggle-ukrainian)
        (local-set-key "\C-c\C-u" 'toggle-ukrainian)
        (global-set-key "\C-c\C-r" 'toggle-russian)
        (local-set-key "\C-c\C-r" 'toggle-russian)

CTRL-C, CTRL-U вмикає/вимикає український режим, а CTRL-C, CTRL-R - російський.

Я - давній Макінтошевський фан. Першим комп'ютером, в якому з'явилася справжня підтримка багатомовних середовищ, був (і багато в чому залишається єдиним до сьогоднішнього дня) Макінтош. Я дуже довго користувався Макінтошем і довгий час в emacs 'і мені не вистачало тих клавіш, якими я перемикався з мови на мову в Макінтоші - < CMD >-< SPACE >. І хоча, звичайно, я не мав ніякої надії знайти на своїй пісішній (чи навіть спарківській) клавіатурі клавішу < CMD >, але мене не полишали сподівання замінити її на < ALT >.

Наступний шматок коду дозволяє вмикати/вимикати український режим за допомогою < Alt >-< ПРОПУСК >.

                                                ;Aug 11 1999
        ;; Two more bindings for Ukrainan - -
        (local-set-key  [?\M- ] 'toggle-ukrainian)
        (global-set-key [?\M- ] 'toggle-ukrainian)
        
        ;;
        ;; End of Ukrainian/Cyrillic settings
        ;;

Кілька слів про користування модулем ukrainian.el

Далі - в стислій формі про користування модулем ukrainian.el , особливо там, де це стосується нових можливостей.

Наступні команди є стандартними для emacs 'а. Я їх приводжу тут тільки тому, що без тих змін, які описані в цьому документі, вони не працюють з українською мовою.

Кілька корисних порад

Конвертування із однієї кодової таблиці в іншу (транслітерація) за допомогою emacs'а.

Модуль ukrainian.el дозволяє не тільки передивлятися та редагувати тексти різними кодовими таблицями, але і перекодовувати тексти із однієї кодової таблиці в іншу. Для цього він має дві функції - ukrainian-translate-buffer та ukrainian-translate-region.

Перша функція транслітерує весь текст в відкритому буфері, друга - тільки виділений блок тексту.

Якщо ви, наприклад, отримали листа, написаного на Віндовс'і в кодовій таблиці windows-1251, а маєте шрифти тільки для koi8-u, відкрийте отриманий файл в emacs 'і. І виконайте такі команди:

Скрипт для транслітерації текстів

Якщо вам доводиться конвертувати тексти досить часто (або просто ліньки кожного разу відкривати текст і друкувати ці кілька команд), ви можете написати дуже простенький скрипт для конвертування текстів.

Відкрийте emacs і надрукуйте в ньому всі підряд українські літери. Порядок літер не має ніякого значення, і тому, щоб нічого не пропустити, я друкую всі підряд клавіші на клавіатурі:

            йцукенгшщзхґфивапролджєячсмітьбюЙЦУКЕНГШЩЗХҐФИВАПРОЛДЖЄЯЧСМІТЬБЮїЇ

Далі зробіть копію всього цього рядка, і за допомогою функції ukrainian-translate-region переведіть один із рядків в кодову таблицю із якої (або в яку) ви збираєтесь перекладати тексти. Далі додайте лапки навколо цих текстових рядків, додайте назву команди для транслітерації tr і ще один невеликий рядок на вершині файлу і ваш текстовий фільтр готовий.

Наступний фільтр переводить тексти із Windows-1251 в KOI8-U .

        #!/bin/sh
        tr \
        'ИЖСЙЕМЦЬЫГУЄТХБЮОПНКДФ╨ЪВЯЛЁРЭАЧижсйемцьыгу╔тхбюопнкдф╙ъвял╡рэач©╞' \
        'йцукенгшщзхґфивапролджєячсмітьбюЙЦУКЕНГШЩЗХҐФИВАПРОЛДЖЄЯЧСМІТЬБЮїЇ' 

Протилежний до нього, який перекладає із KOI8-U в Windows-1251 є такий:

        #!/bin/sh
        tr \
        'йцукенгшщзхґфивапролджєячсмітьбюЙЦУКЕНГШЩЗХҐФИВАПРОЛДЖЄЯЧСМІТЬБЮїЇ' 
        'ИЖСЙЕМЦЬЫГУЄТХБЮОПНКДФ╨ЪВЯЛЁРЭАЧижсйемцьыгу╔тхбюопнкдф╙ъвял╡рэач©╞' \





Дмитро Ковальов,
Токіо, жовтень 1999 р.
kov@tokyo.email.en.jp


Natalya and Dmytro Kovalev
Пишіть нам за адресою: kov@tokyo.email.ne.jp
Домашня сторінка: http://www.asahi-net.or.jp/~as9d-kvlv
Втр Жов 26 18:50:57 JST 1999
Counter: