link0ff (link0ff) wrote in ru_emacs,
link0ff
link0ff
ru_emacs

Ввод командных комбинаций без переключения русской раскладки

В новой версии Емакс 24.1 при включенной системной русской раскладке можно вводить командные комбинации с любыми символами (с модификаторами и даже без), которые привязаны к командам, кроме `self-insert-command'. При этом, русские буквы автоматически транслируются в соответствующие английские. Например, последовательность `C-ч и' переводится в `C-x b' и запускает `switch-to-buffer'. Всё это получается при помощи такой функции:

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

Команда запускается, например, так: `M-x reverse-input-method RET russian-computer RET'

NB: Чтобы команды, запрашивающие пароль, не выполняли эту перекодировку при чтении пароля, нужно обнулять значение `local-function-key-map' во время выполнения команды, например:

(defadvice read-passwd (around my-read-passwd act)
  (let ((local-function-key-map nil))
    ad-do-it))
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

  • 34 comments