Використання укра╖нсько╖ мови в 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: