Emacs/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ů.