среда, 30 апреля 2014 г.

emacs. Быстрая смена кодировки

Emacs поддерживает огромное количество кодировок символов текста. Разумеется, имеются штатные универсальные средства изменения текущей кодировки буфера. Например, для того, чтобы перезагрузить буфер с использованием другой кодировки необходимо нажать C-x <ENTER> r <указать-требуемую-кодировку> <ENTER> yes <ENTER>.
Однако, пользователь в работе редко использует более трех или четырех кодировок. Хотелось бы иметь возможность однажды задать эти наши "ходовые" кодировки, а впоследствии быстро, с помощью горячей клавиши, минуя всю эту интерактивность, между ними, в случае необходимости, переключаться.
К счастью, у нас в руках emacs! И что еще круче - emacs lisp! Поэтому мы спокойно расширяем его возможности с помощью своего кода. Я написал функцию, реализующую нужный мне функционал (это, кстати, мое второе произведение на emacs lisp), поместил ее в файл .emacs и назначил горячую клавишу. Я доволен дальше некуда, надеюсь еще кому-нибудь пригодится )
(setq my-working-codings ["utf-8" "windows-1251" "koi8-r" "cp866"])
(setq my-current-coding-index -1)
(defun pa23-change-coding ()
  "Change coding for current buffer."
  (interactive)
  (let (my-current-eol
        my-next-coding-index
        my-new-coding-system
        my-new-coding)
    (setq my-current-eol
          (coding-system-eol-type buffer-file-coding-system))
    (setq my-next-coding-index (1+ my-current-coding-index))
    (if (equal my-next-coding-index (length my-working-codings))
        (setq my-next-coding-index 0))
    (setq my-new-coding-system
          (elt my-working-codings my-next-coding-index))
    (cond ((equal my-current-eol 0)
           (setq my-new-coding (concat my-new-coding-system "-unix")))
          ((equal my-current-eol 1)
           (setq my-new-coding (concat my-new-coding-system "-dos")))
          ((equal my-current-eol 2)
           (setq my-new-coding (concat my-new-coding-system "-mac"))))
    (setq coding-system-for-read (read my-new-coding))
    (revert-buffer t t)
    (setq my-current-coding-index my-next-coding-index)
    (message "Set coding %s." my-new-coding)
    )
  )
(global-set-key [f11] 'pa23-change-coding)
При смене кодировки, emacs, извещением в минибуфере, оповестит вас о том, на что он переключился. Наслаждайтесь работой в любимом редакторе!

Напомню также, что мой рабочий вариант файла .emacs можно взять здесь.

UPD: 05.05.2014

Поработал над кодом. Теперь функция выглядит значительно лучше, чем самый первый вариант )

UPD: 09.05.2014

Очередное улучшение кода.

Комментариев нет:

Отправить комментарий