[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: emacs



Terehov Gennady wrote:

А  никто не  знает как  к Emacs  перекодировку буфера  прикрутить, чтобы
кодировку,  в которой  текст отображается  в текущем  буфере можно  было
переключать?

Не уверен, что в точности понял ваш вопрос, но все же попытаюсь ответить...

Сначала следует некоторая философия, потом пример. Если скучно читать философию - прочтите сразу пример.

Emacs'ы достаточно новых версий (>= 20), которые используют MULE (multi-user language environment, если не ошибаюсь), хранят содержимое (почти) всех буферов в unicode'е (или, как это написано в Emacs документации, в multi-byte). (В чем можно убедиться, например, набрав C-h h - в зависимости от наличия у вас нужных шрифтов, вы увидете большое количество языков, в том числе русский, различные языки с диакритическими знаками (французский, чешский, польский), с необычными буквами (например, немецкий с ss), и даже иерографические языки (Thai, Japanese, Chinese итд).

Если же редактор внутренне хранит все в Unicode, а операционная система не полностью его поддерживает, т.е. имеет ASCII файлы, файлы в разных кодировках, и не-unicode шрифты (т.е. шрифты, соотв. какой-либо кодировке, и имеющие только 256 glyphs), то возникает как минимум три разные задачи:

1. При загружении в буфер не-юникод (single-byte) файла перекодировать его в юникод (multi-byte); 2. При сохранение из буфера в не-юникод файл (single-byte) перекодировать из юникод в соответствующую кодировку;
3. Надо иметь способ ввода нужных символов в буфер;
4. Наконец, надо отображать символы в буфере при отсутствии unicod шрифтов.

1 и 2 решаются с помощью установки coding system. Она задает, например, что по умолчанию все файлы на диске воспринимаются как single-byte в кодировке koi8-r. Тогда при загрузке такого файла в буфер Emacs переведет его из koi8-r в unicode (multi-byte), и будет внутренне работать с ним. А при сохранении он переведет текст обратно из юникода в single-byte в кодировке koi8-r и запишет это на диск.

Соответственно, пользователь, работающий с правильно настроенным Emacs, может никогда и не догадаться, что при редактировании файла он жил внутри Emacs в виде unicode.

Однако, если вам нужно загрузить файл в какой-то другой кодировке, можно попросить Emacs выбрать нужную кодироку (возможно, отличающуюся от текущих установок).

Пример.

Я живу в Windows, по умолчанию кодировки ввода-вывода - это cp1251-dos. Хочу перекодировать файл, пришедший в кодировке koi8-r, с юниксовыми концами строк, в cp1251-dos, чтобы продолжить его редактирование в Notepad ;).

Решение.

Загружаю Emacs. Набираю C-x RET c. В ответ на приглашение

Coding system for following command (default, cp1251-doc):

набираю koi8-r-unix.В ответ на приглашение:

Command to execute with koi8-r-unix:

набираю C-x C-f, и ввожу имя нужного мне файла. Теперь нужно сделать какое-нибудь изменение, что Емакс посчитал файл измененным, например, ввести пробел и тут же его удалить. После чего сохранить файл - он сохраниться в кодировке по умолчанию, т.е. cp1251-dos.

Итак, с помощью Emacs нам удалось поменять кодировку файла! Соответсвенно, если вы редактировали обычный файл в кодировке cp1251-dos, можно перед сохранением выбрать кодировку для следующей команды koi8-r-dos, и тогда файл запишется на диск в кодировке koi8-r, но с досовскими концами строк. Итд.

Вообще, очень советую прочесть раздел International Character Set Support в Emacs Info (C-h i, m International RET) - там хоть все и не очень понятно, зато, наверное, полно и точно описано.

Удачи, Виктор.





Reply to: