emacs & kódování UTF-8

emacs a UTF-8

editovat

Emacs od verze tuším 21 je dobře vybaven pro editaci v UTF-8. Většinou postačí mít správně nastavené locale. Problém může nastat, když máme nastavené locale např. na ISO-8859-2 a potřebujeme editovat nějaký dokument v UTF-8 (či jiném kódování).

Emacs je vybaven MULE, (MUltiLanguage Emacs) a měl by se snažit automaticky rozpoznávat kódování editovaných dokumentů. Jenže ne vždy je to možné a tak mohou nastat problémy, které pak potřeba řešit použitím vhodných příkazů. Např:

C-x RET c runs the command universal-coding-system-argument
   which is an interactive compiled Lisp function in `international/mule-cmds'.
(universal-coding-system-argument)

Execute an I/O command using the specified coding system.

Znamená to, že použijeme sekvenci Ctrl-X, poté RETURN a poté ještě c. V minibufferu budeme dotázáni na kódování, které si přejeme. Odpovíme např. utf-8 (malými písmeny). Následující příkaz pak bude vykonán s tím, že emacs použije toto kódování. Pokud tedy otevřeme v bufferu nový soubor příkazem:

C-x C-f runs the command find-file
   which is an interactive compiled Lisp function in `files'.
(find-file FILENAME &optional WILDCARDS)

Edit file FILENAME.
Switch to a buffer visiting file FILENAME,
creating one if none already exists.
Interactively, or if WILDCARDS is non-nil in a call from Lisp,
expand wildcards (if any) and visit multiple files.  Wildcard expansion
can be suppressed by setting `find-file-wildcards'.

pak se soubor načte v kódování UTF-8 a je možno jej normálně editovat a pak normálně uložit.

Podrobněji se o práci z různým kódováním dočteme v manuálu, kapitola: 27 International Character Set Support http://www.gnu.org/software/emacs/manual/html_node/emacs/International.html#International, podkapitola 27.11 Specifying a Coding System for File Text http://www.gnu.org/software/emacs/manual/html_node/emacs/Text-Coding.html#Text-Coding

Pro změnu kódování souboru, již načteného v bufferu se zde uvádí příkaz C-x <RET> r (revert-buffer-with-coding-system), ten jsem ale ve své instalaci emacs 21 v Debianu neobjevil.

Měl by se dát také použít příkaz C-x <RET> f (set-buffer-file-coding-system):

C-x RET f runs the command set-buffer-file-coding-system
   which is an interactive compiled Lisp function in `international/mule'.
(set-buffer-file-coding-system CODING-SYSTEM &optional FORCE)

Set the file coding-system of the current buffer to CODING-SYSTEM.
This means that when you save the buffer, it will be converted
according to CODING-SYSTEM.  For a list of possible values of CODING-SYSTEM,
use M-x list-coding-systems.

If the buffer's previous file coding-system value specifies end-of-line
conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is
merged with the already-specified end-of-line conversion.

If the buffer's previous file coding-system value specifies text
conversion, and CODING-SYSTEM does not specify one, CODING-SYSTEM is
merged with the already-specified text conversion.

However, if the optional prefix argument FORCE is non-nil, then
CODING-SYSTEM is used exactly as specified.

This marks the buffer modified so that the succeeding C-x C-s
surely saves the buffer with CODING-SYSTEM.  From a program, if you
don't want to mark the buffer modified, just set the variable
`buffer-file-coding-system' directly.

ale tento příkaz mi pro špatně načtený soubor v bufferu nefunguje, proto používám kombinaci C-x RET c a poté C-x C-f, jak jsem uvedl výše.

Pro zrychlení práce ale většinou uvádíme jméno editovaného souboru již na příkazové řádce, např:

emacs muj_unicodovy_soubor

V tom případě by se mohlo dát uvést příslišnou lispovou funkci uvést rovněž na příkazovou řádku:

emacs -f ...

ale dosud se mi nepodařilo zjistit, co dál.

Jinou možností, namísto C-x RET c, je dát zvolený kódovýá systém do preferencí s nejvyšší prioritou, a to příkazem

M-x  prefer-coding-system

Další možností, pokud chceme editovat více souborů v nějakém kódování, je nastavit proměnnou current-language-environment např. v konfiguračním souboru ~/.emacs:

(set current-language-environment 'utf-8)

ale to také může hodit chybu, pokud už máme nějak nastavené locale.

Takže nejlepší asi bude přenastavit si na tu chvíli locale:

$ export LANG=cs_CZ.utf8  

s výsledkem:


a pak už Emacs načítá soubory v utf-8, i když při spuštění ohlásí varování:

Warning: locale not supported by C library, locale unchanged

Problém ale nastal v tom, že emacs přestal reagovat na české klávesy. Soubor se zobrazil dobře, ale nešel česky editovat. (Možná to ale bylo tím, že sem předtím chybně uvedl cz_CZ). Tak jsem to vzdal a překonfiguroval si locales v systému (v Debianu):

# dpkg-reconfigure locales

a jako defaultní uvedl cs_CZ.UTF8 a je to bez problémů.