суббота, 2 мая 2015 г.

Горячие клавиши Emacs в русской раскладке


ru_hotkeys.jpg 


В Emacs по умолчанию горячие клавиши заданы и соответственно работают в английской раскладке, после переключения на русскую - работать они перестают. Я довольно долго искал способ решения, перепробовал несколько разных, остановился на следующем…

Добавляем в init файл функцию:
(defun cfg:reverse-input-method (input-method)
  "Build the reverse mapping of single letters from INPUT-METHOD."
  (interactive
   (list (read-input-method-name "Use input method (default current): ")))
  (if (and input-method (symbolp input-method))
      (setq input-method (symbol-name input-method)))
  (let ((current current-input-method)
        (modifiers '(nil (control) (meta) (control meta))))
    (when input-method
      (activate-input-method input-method))
    (when (and current-input-method quail-keyboard-layout)
      (dolist (map (cdr (quail-map)))
        (let* ((to (car map))
               (from (quail-get-translation
                      (cadr map) (char-to-string to) 1)))
          (when (and (characterp from) (characterp to))
            (dolist (mod modifiers)
              (define-key local-function-key-map
                (vector (append mod (list from)))
                (vector (append mod (list to)))))))))
    (when input-method
      (activate-input-method current))))

А в самом конце конфига, вызываем ее с нужной кодировкой:
(cfg:reverse-input-method 'russian-computer)

Работает отлично, сайд эффектов не замечено.

6 комментариев:

  1. Посмотрел Ваш профиль на GitHub, а .emacs не нашёл. Не могли бы Вы его опубликовать там? Очень интересно посмотреть, что там у людей, которые знают гораздо больше меня.

    ОтветитьУдалить
    Ответы
    1. Он опубликован: https://github.com/ReanGD/dotfiles/tree/master/.config/emacs
      Сомневаюсь, что там можно найти что-то уж очень полезное, всё как у всех...

      Удалить
  2. к сожалению, работает не до конца, например, на комбинацию С-с a t (Global list of to do для org-mode) выдает invalid key е, то есть воспринимает последнюю клавишу t(е) согласно русской раскладке. Вы не знаете: как это можно поправить?

    ОтветитьУдалить
    Ответы
    1. Да меня тоже раздражает подобное поведение, но как победить его в общем виде, я не нашел, именно в этом случае, можно добавить вот такие строчки в конфиг (тут "e" - русское):

      (setq org-agenda-custom-commands
      '(("е" "List of all TODO entries"
      ((call-interactively 'org-todo-list)))))

      Тогда команда будет работать и в русской раскладке. Аналогично можно в принципе русифицировать и всё остальное меню, но это кривой способ конечно.

      Удалить
    2. Спасибо за отклик.
      Возможно вы уже знаете - другой вариант устранения проблем с языком следующий: использовать стандартную смену языка для редактора( дефолтные клавиши С-\):

      Добавить в dot emacs следущие строчки
      #+begin_src emacs-lisp
      (setq default-input-method 'russian-computer)
      ;; default keybinding for toggle-input-method: C-\
      ;;(global-set-key [f11] 'toggle-input-method)
      #+end_src

      В английской раскладке нажимаем клавишу, которую только что привязали к toggle-input-method (или стнадартную С-\) и отныне при наборе пользуемся этим методом для смены языка.
      Очевидные недостатки: язык системы застыл - английский, язык в emacs виден, но по старой привычке смотришь системный язык.При переходе в другое окно emacs - язык по-умолчанию остаётся системным.

      Удалить
    3. Я думал над этим, в итоге пришел к тому, что переключать язык в разных приложениях разными горячими клавишами не готов.

      Удалить