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

Опубликовано 10 June 2017 в Редакторы и IDE

Думаю вы как и я не можете позволить себе пользоваться только английской раскладкой клавиатуры. Так или иначе для работы приходится использовать обе: и русскую, и английскую. В целом, это не доставляет никаких проблем, пока дело не касается Emacs. Не знаю почему, но в нем горячие клавиши в русской раскладке просто перестают работать. Видимо, сказывается страшное наследие "ASCII - единственно возможный набор символов для всех языков мира". Возможно, есть какие-то другие причины. Тем не менее, в Emacs есть свой довольно странный способ переключение раскладок (Input Method в терминах Emacs): C-\. Я никогда не находил этот вариант приемлемым и переключался на английскую раскладку каждый раз. Но я все-таки нашел способ как избежать этого и заставить горячие клавиши работать вне зависимости от раскладки клавиатуры.

Этот сниппет взят с небольшими изменениями из поста написанного Владимиром "Горячие клавиши Emacs в русской раскладке".

Для того чтобы использовать его, вставьте его в конфигурационный файл вашего Емакса:

(defun 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))))

(reverse-input-method 'russian-computer)

Если вы пользуетесь Spacemacs user, то вставьте следующий код в список dotspacemacs-configuration-layers в вашем файле .spacemacs.

(reverse-input-method
      :location (recipe
                 :fetcher github
                 :repo "avkorablev/reverse-input-method-layer"))
 )

и этот код в тело функции dotspacemacs/user-config

(reverse-input-method 'russian-computer)

Работает идеально. Единственный недостаток обнаружился при пересчете формулы в таблицах OrgTable. На эту операцию используется хоткей C-c-*, а на моем маке * меняет свое положение в русской раскладке.

---
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev