Emacs, перекодировка текста, ошибочно введенного в английской кодировке

Постоянно пользуюсь Emacs-ом. Практически для всего. Но иногда досаждает, когда резко начал набирать текст, набрал, потом глядь, а клавиатуру забыл переключить на русский. Все набранное совершенно непонятно. Давно собирался написать приспособление для перекодировки и вот, наконец собрался.

Как это работает

Работа функции перекодировки проста, как топор. Сначала создаем хэш, в котором ключ, это буква на английском, значение - соответствуюая ей буква на русском. Затем читаем символ за символом буфер от начала до конца выделения и заменяем каждый символ равный ключу хэша, соответствующим этому ключу значением.

Если ключа нет в хэше, символ не заменяем.

Примечание: соответствующий английскому русский символ, это тот символ, который нарисован на той же клавише, что и английский. Это важно потому, что связано с раскладкой клавиатуры. У меня старая раскладка, у которой запятая находится на клавише 6, а точка на клавише 7, соответственно. Если кому-то нужна другая раскладка, нужно отредактировать хэш.

Подключить функцию элементарно, копируем функцию и строку подключения к клавише в файл .emacs и все.

Теперь, если мы ошиблись и набрали русский текст с включенной английской раскладкой, выделяем неверно набранный текст и нажимаем клавишу F9.

Тексты программ

Подключение к клавише F9:

(global-set-key [f9] 'eik/tr)

Текст функции:

(defun eik/tr  (start end)
  "English-russian recoding."
  (interactive "r")
  (setq eik-chartable (make-hash-table   :test 'equal))
  (puthash "q" "й" eik-chartable)
  (puthash "w" "ц" eik-chartable)
  (puthash "e" "у" eik-chartable)
  (puthash "r" "к" eik-chartable)
  (puthash "t" "е" eik-chartable)
  (puthash "y" "н" eik-chartable)
  (puthash "u" "г" eik-chartable)
  (puthash "i" "ш" eik-chartable)
  (puthash "o" "щ" eik-chartable)
  (puthash "p" "з" eik-chartable)
  (puthash "[" "х" eik-chartable)
  (puthash "]" "ъ" eik-chartable)
  (puthash "a" "ф" eik-chartable)
  (puthash "s" "ы" eik-chartable)
  (puthash "d" "в" eik-chartable)
  (puthash "f" "а" eik-chartable)
  (puthash "g" "п" eik-chartable)
  (puthash "h" "р" eik-chartable)
  (puthash "j" "о" eik-chartable)
  (puthash "k" "л" eik-chartable)
  (puthash "l" "д" eik-chartable)
  (puthash ";" "ж" eik-chartable)
  (puthash "'" "э" eik-chartable)
  (puthash "z" "я" eik-chartable)
  (puthash "x" "ч" eik-chartable)
  (puthash "c" "с" eik-chartable)
  (puthash "v" "м" eik-chartable)
  (puthash "b" "и" eik-chartable)
  (puthash "n" "т" eik-chartable)
  (puthash "m" "ь" eik-chartable)
  (puthash "," "б" eik-chartable)
  (puthash "." "ю" eik-chartable)
  (puthash "`" "ё" eik-chartable)
  (puthash "Q" "Й" eik-chartable)
  (puthash "W" "Ц" eik-chartable)
  (puthash "E" "У" eik-chartable)
  (puthash "R" "К" eik-chartable)
  (puthash "T" "Е" eik-chartable)
  (puthash "Y" "Н" eik-chartable)
  (puthash "U" "Г" eik-chartable)
  (puthash "I" "Ш" eik-chartable)
  (puthash "O" "Щ" eik-chartable)
  (puthash "P" "З" eik-chartable)
  (puthash "{" "Х" eik-chartable)
  (puthash "}" "Ъ" eik-chartable)
  (puthash "A" "Ф" eik-chartable)
  (puthash "S" "Ы" eik-chartable)
  (puthash "D" "В" eik-chartable)
  (puthash "F" "А" eik-chartable)
  (puthash "G" "П" eik-chartable)
  (puthash "H" "Р" eik-chartable)
  (puthash "J" "О" eik-chartable)
  (puthash "K" "Л" eik-chartable)
  (puthash "L" "Д" eik-chartable)
  (puthash ":" "Ж" eik-chartable)
  (puthash "\"" "Э" eik-chartable)
  (puthash "Z" "Я" eik-chartable)
  (puthash "X" "Ч" eik-chartable)
  (puthash "C" "С" eik-chartable)
  (puthash "V" "М" eik-chartable)
  (puthash "B" "И" eik-chartable)
  (puthash "N" "Т" eik-chartable)
  (puthash "M" "Ь" eik-chartable)
  (puthash "<" "Б" eik-chartable)
  (puthash ">" "Ю" eik-chartable)
  (puthash "~" "Ё" eik-chartable)
  (puthash "@" "\"" eik-chartable)
  (puthash "#" "\'" eik-chartable)
  (puthash "$" "*" eik-chartable)
  (puthash "%" ":" eik-chartable)
  (puthash "^" "," eik-chartable)
  (puthash "&" "." eik-chartable)
  (puthash "*" ";" eik-chartable)
  (setq eik-str-out "")
  (setq eik-char-in "")
  (setq eik-char-out "")
  (setq eik-i start)
  (while (< eik-i end)
    (setq eik-char-in 
	  (buffer-substring-no-properties eik-i (+ eik-i 1)))
    (setq eik-char-out (gethash eik-char-in eik-chartable nil))
    (if (not eik-char-out)
	(setq eik-char-out eik-char-in))
    (setq eik-str-out (concat eik-str-out  eik-char-out))
    (setq eik-i (1+ eik-i))
    )
  (delete-region start end)
  (insert eik-str-out start)
  (delete-char -1)
)

Опубликовано: November 24, 2010

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


Имя: Владимир

Полезно. Вот за что люблю Емакс, так это за возможность действительно БЫСТРОЙ и ЛЕГКОЙ кастомизации редактора.



Имя: polkan

это называется РАСКЛАДКА, а не кодировка...



Имя: Vladimir

Удобно :)
polkan: хм, раскладка, layout. Может знаете emacs термин :D?



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

Имя:

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