Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

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

6. Редактирование текста

В этом разделе я опишу настройку различных программ для работы с кириллическими текстами. Этот раздел не охватывает текстовые процессоры, настройка которых описывается позже (смотри раздел Текстовые процессоры)

6.1 Проверка правописания на русском языке

Для проверки правописания я использую программу GNU ispell. Она имеет очень гибкие настройки и возможности для расширения. Её можно использовать при проверке правописания текстов, написанных на языках, отличных от английского, путём добавления новых словарей.

В идеальном случае, когда ваш ispell установлен правильно, вам надо только создать словарь, используя команды, обеспечиваемые файлом Makefile из дистрибутива соответствующего словаря. Однако с некой долей вероятности у вас возникнут проблемы с ispell, который откажется понимать 8-ми битные данные. Это означает, что в вашей системе ispell скомпилирован без поддержки 8-ми битных символов. В этом случае вам не удастся избежать перекомпиляции пакета ispell.

Если у вас все нормально, то можете инициировать проверку правописания для русских текстов путём вызова программы ispell с опцией '-d russian'

Последняя версия ispell имеет номер 3.1.20. При желании пакет можно взять здесь ftp.cs.ucla.edu или найти на любом крупном ftp-сервере. При самостоятельной компиляции ispell надо скопировать файл local.h.samp в local.h, закомментировать в нем NO8BIT (#undef NO8BIT) и установить правильные пути для BINDIR, LIBDIR и других рабочих директорий.

Словарь Александра Лебедева

Этот словарь построен на основе словаря русского языка для ispell, первоначально составленного Нилом Далтоном (Neal Dalton) в 1992 г. После тщательной проверки и исправления примерно 4000 ошибок в словаре Нила Далтона (в этой части работы использовался орфографический словарь русского языка, выпущенный Институтом русского языка АН СССР), в словарь были добавлены отсутствовавшие в нем правила образования форм существительных, прилагательных, причастий, наречий, изменены правила формирования окончаний глаголов, так что affix-файл можно считать переписанным заново. Одновременно в словарь было добавлено большое число слов.

Словарь постоянно совершенствуется, дополняется и корректируется. Последнюю версию словаря можно найти на сервере: mch5.chem.msu.su

Как можно понять из названия раздела, автором этого словаря является Александр Лебедев.

На основе этого словаря Serge Winitzki создал словарь для проверки правописания в текстах, набранных в дореформенной русской орфографии. Предложенное им расширение кодировки koi8 и сами словари можно найти по адресу: sawsoft.newmail.ru/LS/koi8-extended.html.

Отличительной чертой данного словаря является то, что начиная с версии 0.99c0 в него включена полноценная поддержка буквы ё (другие словари просто заменяют букву ё на букву е).

Словарь Константина Книжника

Константин Книжник создал хороший русский словарь для ispell. Вы можете найти его на домашней страничке К.Книжника. В поставку словаря включён полезный скрипт, обеспечивающий инкрементный режим проверки правописания слов для emacs.

6.2 Emacs и XEmacs

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

Для настройки старых версий Emacs следует посмотреть изначальный "Cyrillic HOWTO"  от Беликова -- дословный перевод можно найти на моей страничке: www.inp.nsk.su/~baldin в разделе Cyrillic HOWTO (old rus).

Существует масса способов кириллизации Emacs -- в основном эти способы требуют некоего низкоуровневого (в духе Emacs Лиспа) "хака". Более "идеологически"  правильным способом кириллизации emacs'а является настройка с использованием MULE (MULtilanguage Emacs support) -- раздел MULE.

Совет: При работе с X-window для Emacs, вероятно, лучше всего подойдут шрифты lucidatypewriter из коллекции шрифтов Болховитянова Cyr-RFX (См. раздел Cyr-RFX).

Emacs и MULE

MULE -- "MULtilanguage Emacs support" -- это подсистема emacs, которая создана для возможности использования в этом редакторе различных языков. Основным толчком для развития MULE послужило желание использовать китайские/японские и тому подобные языки -- с этим, говорят, проблем нет, а вот по поводу использования кириллицы мало что известно -- попробуем разобраться.

Для правильной работы с Mule надо всего-то

  1. Пакет emacs-leim. Этот пакет присутствует в подавляющем большинстве известных дистрибутивов.
  2. Русские шрифты в koi8-r или iso5 кодировке.

Далее:

  1. Идём в меню Mule, Set Font/Fontset, Fontset и выбираем standard. Зачем? Fontset -- это набор шрифтов, который емакс подбирает себе при загрузке. Причём startup подбирается с тем расчётом чтобы для каждого шрифта из Fontset'а имелись italic и bold варианты, а standard подбирается так, чтобы в Fontset'е имелось как можно больше различных кодировок. Чтобы сделать изменение постоянным, запишите следующую строчку в ~/.emacs.
     (set-default-font "fontset-standard")
    

  2. Идём в Mule, Set Language Environment, Cyrillic и устанавливаем один из 3-х вариантов. Какой -- по большому счету без разницы. Это будет влиять только на общение емакс'а с внешним миром -- если захотим Cyrillic-ISO, то текст будет сохраняться в ISO и в буфер обмена будет копироваться текст в кодировке ISO. То же самое с KOI8. Чтобы сделать изменение постоянным, запишите в ~/.emacs.
    (set-language-environment "cyrillic-koi8")
    

Всё. Теперь самое главное - отучиться пользоваться системным переключателем раскладки клавиатуры -- emacs все делает сам. По умолчанию переключатель раскладки клавиатуры повешен на C-\.

Будьте готовы к тому, что могут выбраться совершенно неюзабельные шрифты. Чтобы кастомизировать выбор шрифтов, нужно создать свой собственный набор шрифтов (на сленге emacs -- fontset). Если у вас уже установлены Cyr-RFX (См. раздел Cyr-RFX):

  1. Наберите что-то вроде
                              
      (create-fontset-from-fontset-spec
         "-b&h-*-medium-r-*-*-14-*-*-*-*-*-fontset-vasja,
      latin-iso8859-1:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-1,
      latin-iso8859-15:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-15,
      cyrillic-iso8859-5:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-5" t)
    

  2. Поместите курсор за закрывающей скобкой и нажмите C-x C-e выполнив введённый ранее кусок кода.
  3. Затем наберите
      (set-default-font "fontset-vasja")
    

    и опять-таки выполните этот код, нажав комбинацию клавиш C-x C-e (не забудьте, что курсор должен находиться за последней закрывающей скобкой). Результат должен быть виден сразу же.
  4. Добавьте эти команды в ~/.emacs, чтобы они выполнялись при каждом запуске emacs'а.
  5. Да, ещё туда же можно добавить
      (set-language-environment "Cyrillic-KOI8")
    

Чтобы emacs не плевался в консоли что не может найти иксовых шрифтов, хорошо бы обрамить вышеприведённый кусок кода следующим условием:


 (defmacro Xlaunch (&rest x)
   (list 'if (eq window-system 'x)(cons 'progn x)))
 (Xlaunch
   ...
   ...
   ...
 )

Сторонникам теории множественности кодировок (чем больше кодировок -- тем лучше): для того, чтобы включить поддержку 1251, вставьте


 (codepage-setup 1251)

в ~/.emacs. 866-ю кодовую страницу можно добавить туда же следующим образом:
 (defvar cp866-decode-table
   [
  255 240 nil nil 242 nil nil 244 nil nil nil nil nil nil 246 nil
  128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
  144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
  160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
  224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
  252 241 nil nil 243 nil nil 245 nil nil nil nil nil nil 247 nil]
   "Table for converting ISO-8859-5 characters into codepage 866 glyphs.")
 (setplist 'cp866-decode-table
      '(charset cyrillic-iso8859-5 language "Cyrillic-ISO" offset 160))
 (codepage-setup 866)

Чтобы открыть файл в какой-то кодировке, отличной от дефолтной, идём в Mule, SetCodingSystem, NextCommand, выбираем кодировку и выполняем свою команду (например, C-x-f, открыть файл) То же самое чтобы сохранить - Mule, SetCodingSystem, NextCommand, выбираем кодировку и сохраняем в данной кодировке(C-x-s).

Вот пример готового ~/.emacs для шрифтов Cyr-RFX -- раздел Cyr-RFX:


;; только в иксах
(defmacro Xlaunch (&rest x)
 (list 'if (eq window-system 'x)(cons 'progn x)))
;; проверить на наличие иксов
(Xlaunch
;; зарегистрировать набор шрифтов
(create-fontset-from-fontset-spec
     "-b&h-*-medium-r-*-*-14-*-*-*-*-*-fontset-vasja,
  latin-iso8859-1:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-1,
  latin-iso8859-15:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-15,
  cyrillic-iso8859-5:-b&h-*-medium-r-*-*-14-*-*-*-*-*-iso8859-5" t)
;; установить набор шрифтов
(set-default-font "fontset-vasja")
)

;; делать всё в кодировке KOI8-R
(set-language-environment 'Cyrillic-KOI8)

;; вспомни виндозную кодировку...
(codepage-setup 1251)

;; ..и научись досовской
(defvar cp866-decode-table
  [
 255 240 nil nil 242 nil nil 244 nil nil nil nil nil nil 246 nil
 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
 252 241 nil nil 243 nil nil 245 nil nil nil nil nil nil 247 nil]
  "Table for converting ISO-8859-5 characters into codepage 866 glyphs.")
(setplist 'cp866-decode-table
     '(charset cyrillic-iso8859-5 language "Cyrillic-ISO" offset 160))
(codepage-setup 866)

;;Ctrl-c, Ctrl-v,Ctrl-x и другие многим привычные комбинации клавиш
(pc-bindings-mode)
(pc-selection-mode)

Если вдруг кому-то придёт в голову работать в emacs из консоли, просто запустите его с опцией --unibyte. В таком случае работа с emacs не будет отличаться от работы в других консольных редакторах.

Добавление: Кусок моего ~/.emacs, отвечающего за кириллизацию, выглядит следующим образом (у меня установлен пакет Cyr-RFX -- раздел Cyr-RFX):


;; -*- emacs-lisp -*- 
;;
;; Запускать как: emacs --unibyte --debug-init 
;;

;;
;; шрифты для X-window
;;

;;Шрифт по умолчанию
(cond (window-system
       (setq default-frame-alist
             (append '((font .
                             "-b&h-lucidatypewriter-medium-r-normal-*-18-*-*-*-*-*-koi8-r")) 
                     default-frame-alist));; поставить этот шрифт первым в списке
       )
      ) 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Кириллизация;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;
;;русификация через mule - переключалка "Ctrl+\" - требуется liem  
;;
;;(set-language-environment "Cyrillic-KOI8");так
(set-language-environment "Cyrillic-koi8-r");или сяк 

;; Дать возможность печатать не только ASCII  
;; То же можно делать с помощью ключика  --unibyte 
(standard-display-european t)
;; Для любителей транслита
;(standard-display-cyrillic-trans t)
;;
;; Чтобы раскладка соответствовала раскладке русских букв на виндовых (а теперь
;;   таких большинство) клавиатурах, можно добавить еще следующие строки:
;;
;; redefine some orginal keybindings под MS - можно ли попроще?
;; 
(quail-define-package
 "cyrillic-jcuken" "Cyrillic" "RU" nil
 "ЙЦУКЕH keyboard layout widely used in Russia (ISO 8859-5 encoding)"
 nil t t t t nil nil nil nil nil t)

(quail-define-rules
 ("1" ?1) ("2" ?2) ("3" ?3) ("4" ?4) ("5" ?5) ("6" ?6) ("7" ?7) ("8" ?8)
 ("9" ?9) ("0" ?0) ("-" ?-) ("=" ?=) ("`" ?ё) ("q" ?й) ("w" ?ц) ("e" ?у)
 ("r" ?к) ("t" ?е) ("y" ?н) ("u" ?г) ("i" ?ш) ("o" ?щ) ("p" ?з) ("[" ?х)
 ("]" ?ъ) ("a" ?ф) ("s" ?ы) ("d" ?в) ("f" ?а) ("g" ?п) ("h" ?р) ("j" ?о)
 ("k" ?л) ("l" ?д) (";" ?ж) ("'" ?э) ("\\" ?\\) ("z" ?я) ("x" ?ч) ("c" ?с)
 ("v" ?м) ("b" ?и) ("n" ?т) ("m" ?ь) ("," ?б) ("." ?ю) ("/" ?.) ("!" ?!)
 ("@" ?\") ("#" ?#) ("$" ?\;) ("%" ?%) ("^" ?:) ("&" ??) ("*" ?*) ("(" ?() 
 (")" ?)) ("_" ?_) ("+" ?+) ("~" ?Ё)
 ("Q" ?Й) ("W" ?Ц) ("E" ?У) ("R" ?К) ("T" ?Е) ("Y" ?H) ("U" ?Г) ("I" ?Ш)
 ("O" ?Щ) ("P" ?З) ("{" ?Х) ("}" ?Ъ) ("A" ?Ф) ("S" ?Ы) ("D" ?В) ("F" ?А)
 ("G" ?П) ("H" ?Р) ("J" ?О) ("K" ?Л) ("L" ?Д) (":" ?Ж) ("\"" ?Э) ("|" ?|)
 ("Z" ?Я) ("X" ?Ч) ("C" ?С) ("V" ?М) ("B" ?И) ("N" ?Т) ("M" ?Ь) ("<" ?Б)
 (">" ?Ю) ("?" ?,))

Минимальная поддержка кириллицы

Поддержка кириллицы без MULE -- совместимость между версиями не гарантируется.

Минимальная поддержка кириллицы в GNU emacs (вам не нужно этого делать при настройке XEmacs) обеспечивается при выполнении следующих вызовов, добавленных в .emacs (при условии, что поддержка символов кириллицы установлена для консоли или для X Window соответственно):


(standard-display-european t)

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

Это позволит вам видеть и вводить символы, находящиеся в верхней части ASCII таблицы.

Андрей Ёлкин ( Andrei Elkin) предлагается простой вариант `русификации' emacs c использованием однобайтового представления символов в буферах редактора. Причем флаг --unibyte при вызове редактора указывать не обязательно.

Чтобы вводимая кириллица отображалась и нам всё ещё не нужен unicode (standard-display-european t), не хватает в emacs важной малости -- syntax table для unibyte mode

Собранный пакет можно найти на linux-ink.ru/pub/) -- следует взять файл emacs-unibyte-cyr-*.rpm.

Иначе можно просто взять этот файл отсюда: http://www.inp.nsk.su/~baldin/misc/koi8-r.el и положить его куда-нибудь в /usr/share/emacs/site-lisp)

И прописать ~/.emacs


;; minimal cyrillic - unibyte & koi8-r
(  ; но-икс в икс-тэрм 
  (let (this-input-mode (current-input-mode))
     (set-input-mode 
      (elt this-input-mode 0) (elt this-input-mode 1) 0 (elt this-input-mode 3))))
(standard-display-european t)  ; roughly equal to --unibyte flag
(set-language-info "Cyrillic-KOI8" 'unibyte-syntax  "koi8-r") 
(setup-cyrillic-koi8-environment) ; по умолчанию

6.3 Работа с vi

Редактор vi (по крайней мере, его клон vim, присутствующий в большинстве дистрибутивов Linux) знает о существовании 8-ми битных символов. Это даёт вам возможность вводить кириллические буквы. Редактор правильно распознает границы слов.

Насколько я понимаю, vim использует locale для преобразования букв из строчных в заглавные и обратно, т.е. на всех встреченных мной unix-like системах vim правильно работал с русским языком после настройки locale (Как настроить локаль смотрите раздел Настройка локали).

Для того, чтобы постоянно не переключаться в командном режиме между английскими и русскими буквами, необходимо выполнить мапирование русских букв в английские -- либо (в старых версиях vim или vi) через команду map для каждой буквы, либо (в новых версиях vim) через опцию langmap. Последнее делается добавлением в ваш ~/.vimrc, или в общесистемный vimrc, двух строк:


set langmap=ж;;
set langmap=ё`,йq,цw,уe,кr,еt,нy,гu,шi,щo,зp,х[,ъ],фa,ыs,вd,аf,пg,рh,оj,лk,дl,э',яz,чx,сc,мv,иb,тn,ьm,б\,,ю.,Ё~,ЙQ,ЦW,УE,КR,ЕT,HY,ГU,ШI,ЩO,ЗP,Х{,Ъ},ФA,ЫS,ВD,АF,ПG,РH,ОJ,ЛK,ДL,Ж:,Э\",ЯZ,ЧX,СC,МV,ИB,ТN,ЬM,Б<,Ю>

Подробности -- в :help langmap.

6.4 Редактирование текста в joe

Все проблемы joe можно решить, правильно настроив locale (См. раздел Настройка локали), если он правильным образом "пропатчен". Если у вас ничего не получилось, то попробуйте рецепт, описанный ниже.

Для того, чтобы распознавать 8-ми битные символы, joe требует специальную опцию -asis. Вы можете указать её в командной строке или вставить в файл ~/.joerc для личного пользования, или в /usr/lib/joerc для настройки всей системы.

joe, который входит в более-менее современные дистрибутивы (BCL 6.2, RH 5.2-6.1; FreeBSD) правильно распознаёт границы русских слов. А для преобразования регистра man joe советует ^K / -- фильтровать блок через tr, т.е. все сводится к работе tr.


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