11 марта 2009 г.

Emacs: вставка русского текста

В течение некоторого времени меня мучала проблема: русский текст, выделенный в Firefox, вставлялся в Emacs не в русской кодовой странице, а в японской (да, в японской кодовой странице тоже есть кириллица!), символами двойной ширины, как иероглифы. В какой-то момент я сделал обходной маневр с использованием внешней программы xclip и это решение просуществовало у меня около года, хотя обладало внушительной коллекцией существенных недостатков. И вот, наконец, у меня таки дошли руки поковыряться и выяснить причину. Нет, совсем настоящую причину я не выяснил — она то ли в самом Firefox, то ли в X Window System, магическим образом тяготеющей к японским кодировкам. Однако, был найден более красивый обходной маневр. Для Emacs, причина кроется в функции x-select-utf8-or-ctext, которая выбирала этот самый ctext, если он длинее в байтах. Кто его такого туда клал, так и остется невыясненным, однако решение оказалось простым — переопределить функцию x-select-utf8-or-ctext таким образом, чтобы она без всяких лишних эвристик возвращала utf8, если он не пустой, и ctext в противном случае.
(defadvice x-select-utf8-or-ctext (around prefer-utf8 (utf8 ctext) activate)
  "Prefer UTF8_STRING to COMPOUND_TEXT whenever possible."
  (cond ((= (length utf8) 0) (setq ad-return-value ctext))
        (t (setq ad-return-value utf8))))

3 комментария:

  1. проверил, при копировании из консоли тоже
    вставляются иероглифы - причина либо в самом emacs, либо в иксах, причем скорее первое, потому что в vim вставляется нормально

    ОтветитьУдалить
  2. Бывает. Я вообще-то проверял, у меня из xterm и urxvt копируется нормально. С каким эмулятором терминала проблема?

    ОтветитьУдалить
  3. у меня и из xterm, и из gnome-terminal, а с kterm вообще восторг - в него при наборе русского текста вообще не русские буквы из японской кодовой страницы,
    а иероглифы настоящие сыпятся (один из них я узнал - иероглиф "люди"), при этом
    он выводит диагностическое сообщение Couldn't set locale: ja_JP.eucJP, ja_JP.ujis, ja_JP.EUC, japanese.euc, Japanese-EUC, ja, japan
    Warning: missing font: GB2312.1980-0

    вот уж точно русский с японцем - братья навек

    ОтветитьУдалить