Подтвердить что ты не робот

Emacs, Linux и международные раскладки клавиатуры

Есть ли простой способ использовать привязки ключей Emacs, когда вы используете раскладку клавиатуры на английском языке (русский)?

Всякий раз, когда выполняется международный макет, все нажатия клавиш интерпретируются буквально, M-ф вместо M-a. В результате я не могу использовать команды.

Было бы неплохо, если бы Linux мог интерпретировать не префиксные и скрещенные префиксы в соответствии с международным макетом, сохраняя при этом оставшийся английский.

4b9b3361

Ответ 1

Вы можете установить метод ввода (kudos go to kindahero), набрав

M-x set-input-method RET cyrillic-yawerty RET

или

M-x set-input-method RET cyrillic-jcuken RET

Чтобы сохранить его навсегда, добавьте

(setq default-input-method "cyrillic-yawerty")

to ~/.emacs config (и используйте C-\ для переключения между раскладками клавиатуры).

Ответ 2

Вот альтернативное решение, использующее язык ОС, основанный на ответе синдиката.

Некоторые ключевые переводы отсутствуют, но их легко добавить.

;; USAGE:
;; Put in your .emacs:
;; 
;; (translate-keystrokes-ru->en)
;; (add-hook 'text-mode-hook
;;           (lambda () (literal-insert-mode 1)))
;; 
;; Only buffers with literal-insert-mode active will be sensitive to the
;; environment language. Prefixed keybindings will still be usable.

(defun translate-keystrokes-ru->en ()
  "Make emacs output english characters, regardless whether
the OS keyboard is english or russian"
  (flet ((make-key-stroke (prefix char)
           (eval `(kbd ,(if (and (string-match "^C-" prefix)
                                 (string-match "[A-Z]" (string char)))
                            (concat "S-" prefix (string (downcase char)))
                            (concat prefix (string char)))))))
    (let ((case-fold-search nil)
          (keys-pairs (mapcar* 'cons
                               "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЯЧСМИТЬБЮ№"
                               "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#"))
          (prefixes '(""    "s-"    "M-"    "M-s-"
                      "C-"  "C-s-"  "C-M-"  "C-M-s-")))
      (mapc (lambda (prefix)
              (mapc (lambda (pair)
                      (define-key key-translation-map
                          (make-key-stroke prefix (car pair))
                        (make-key-stroke prefix (cdr pair))))
                    keys-pairs))
            prefixes))))

(defun literal-insert ()
  (interactive)
  (insert-char last-input-event 1))

(define-minor-mode literal-insert-mode
    "Make emacs output characters corresponging to the OS keyboard,
 ignoring the key-translation-map"
  :keymap (let ((new-map (make-sparse-keymap))
                (english-chars "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#"))
            (mapc (lambda (char)
                    (define-key new-map (string char)
                      'literal-insert))
                  english-chars)
            new-map))

Ответ 3

Не уверен, где sabof получил 150 миллиардов. Я запустил этот код (спасибо Юрию Хану, взятому из EmacsWiki):

(loop
 for from across "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЯЧСМИТЬБЮ№"
 for to   across "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#"
 do
 (eval `(define-key key-translation-map (kbd ,(concat "C-" (string from))) (kbd ,(concat     "C-" (string to)))))
 (eval `(define-key key-translation-map (kbd ,(concat "M-" (string from))) (kbd ,(concat     "M-" (string to))))))

Это всего 128 комбинаций. К сожалению, комбинации с одиночными буквами типа C-x b не работают. Я все еще пытаюсь найти лучшее решение.

Ответ 4

Если вы хотите использовать русский макет в Emacs (а не использовать собственные методы ввода Emacs), единственный способ, которым я сейчас знаю, - добавить привязки формы:

(define-key function-key-map [?\M-ф] [?\M-a])

Это сообщит Emacs, что в случае, если M-ф не привязан, он должен попытаться найти M-a вместо этого. К сожалению, вам понадобится много этих привязок. Если кто-то записывает патч/пакет, который может автоматически предоставить все эти привязки, я был бы рад включить его в Emacs.