Emacs и XEmacs

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

Для настройки старых версий emacs следует посмотреть изначальный "Cyrillic HOWTO"  от Беликова — дословный перевод можно найти на моей домашней страничке в разделе Cyrillic HOWTO (old rus).

Существует масса способов кириллизации emacs — в основном эти способы требуют некоего низкоуровневого (в духе emacs Лиспа) "хака". Более "идеологически"  правильным способом кириллизации emacs'а является настройка с использованием MULE (MULtilanguage emacs support) — раздел “Emacs и 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 — это набор шрифтов, который emacs подбирает себе при загрузке. Причём startup подбирается с тем расчётом чтобы для каждого шрифта из Fontset'а имелись italic и bold варианты, а standard подбирается так, чтобы в Fontset'е имелось как можно больше различных кодировок. Чтобы сделать изменение постоянным, запишите следующую строчку в ˜/.emacs.

     (set-default-font "fontset-standard")
    

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

    (set-language-environment "cyrillic-koi8")
    

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

Чтобы полностью избавиться от проблем взаимодействия с системным переключателем в среде X Window, следует воспользоваться программкой переключения xxkb. В ~/.xxkb следует добавить строчку

  XXkb.app_list.wm_class_class.alt_group1: Emacs                                

После этого Emacs игнорирует переключения xkb.

Будьте готовы к тому, что могут выбраться совершенно неюзабельные шрифты. Чтобы кастомизировать выбор шрифтов, нужно создать свой собственный набор шрифтов (на сленге 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”:

;; только в X Window
(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)

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

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

;;
;; шрифты для X Window
;;

;; Подстановка шрифтов
(cond (window-system
       (create-fontset-from-fontset-spec 
        "-rfx-courier-medium-r-*-*-18-*-*-*-*-*-fontset-Evgueni" t)
       ;; по умолчанию
       (set-default-font "fontset-Evgueni")
       ;; по умолчанию для фреймов
       (add-to-list 'default-frame-alist '(font . "fontset-Evgueni"))
       )
      ) 

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

;; This could help for transferring data from bad old apps
(set-selection-coding-system 'koi8-r)

;;
;; Чтобы раскладка соответствовала раскладке русских букв на виндовых (а теперь
;;   таких большинство) клавиатурах, можно добавить еще следующие строки:
;;
;; redefine some orginal keybindings под MS - можно ли попроще?
;; 
;; кнопка \| => \/ при переключения регистра (для моего удобства)
;;

 (quail-define-package
  "cyrillic-jcuken" "Cyrillic" "RU" nil
  "ЙЦУКЕН 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" ?Н) ("U" ?Г) ("I" ?Ш)
  ("O" ?Щ) ("P" ?З) ("{" ?Х) ("}" ?Ъ) ("A" ?Ф) ("S" ?Ы) ("D" ?В) ("F" ?А)
  ("G" ?П) ("H" ?Р) ("J" ?О) ("K" ?Л) ("L" ?Д) (":" ?Ж) ("\"" ?Э) ("|" ?/)
  ("Z" ?Я) ("X" ?Ч) ("C" ?С) ("V" ?М) ("B" ?И) ("N" ?Т) ("M" ?Ь) ("<" ?Б)
  (">" ?Ю) ("?" ?,))

X-ресурсы

Для настройки интерфейса emacs полезно воспользоваться механизмом X-ресурсов. Для кириллизации меню и для задания геометрии окна emacs в файл можно .Xdefaults прописать следующие строки (или что-то вроде):

Emacs.pane.menubar.font: 8x16
Emacs.pane.menubar.*.fontlist: -rfx-courier-medium-r-*-*-18-*-*-*-*-*-koi8-r
Emacs.geometry: 86x51+0+0

Шрифты и геометрию следует подобрать согласно вашим требованиям.