В 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)
Работает отлично, сайд эффектов не замечено.
Посмотрел Ваш профиль на GitHub, а .emacs не нашёл. Не могли бы Вы его опубликовать там? Очень интересно посмотреть, что там у людей, которые знают гораздо больше меня.
ОтветитьУдалитьОн опубликован: https://github.com/ReanGD/dotfiles/tree/master/.config/emacs
УдалитьСомневаюсь, что там можно найти что-то уж очень полезное, всё как у всех...
к сожалению, работает не до конца, например, на комбинацию С-с a t (Global list of to do для org-mode) выдает invalid key е, то есть воспринимает последнюю клавишу t(е) согласно русской раскладке. Вы не знаете: как это можно поправить?
ОтветитьУдалитьДа меня тоже раздражает подобное поведение, но как победить его в общем виде, я не нашел, именно в этом случае, можно добавить вот такие строчки в конфиг (тут "e" - русское):
Удалить(setq org-agenda-custom-commands
'(("е" "List of all TODO entries"
((call-interactively 'org-todo-list)))))
Тогда команда будет работать и в русской раскладке. Аналогично можно в принципе русифицировать и всё остальное меню, но это кривой способ конечно.
Спасибо за отклик.
УдалитьВозможно вы уже знаете - другой вариант устранения проблем с языком следующий: использовать стандартную смену языка для редактора( дефолтные клавиши С-\):
Добавить в 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 - язык по-умолчанию остаётся системным.
Я думал над этим, в итоге пришел к тому, что переключать язык в разных приложениях разными горячими клавишами не готов.
Удалить