Emacs,Linux和国际键盘布局

当您使用非英语(俄语)键盘布局时,是否有简单的方法来使用Emacs键绑定?

无论何时打开国际布局,所有击键都按字面解释,M-ф而不是Ma。 结果我不能使用命令。

如果Linux可以根据国际版式解释不加前缀和移位前缀的键,同时保留其余的英文,那也不错。

Solutions Collecting From Web of "Emacs,Linux和国际键盘布局"

你可以通过输入设置输入法(荣誉去kindahero

 Mx set-input-method RET cyrillic-yawerty RET 

要么

 Mx set-input-method RET cyrillic-jcuken RET 

要永久保存,请添加

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

〜/ .emacs配置(并使用C \在键盘布局之间切换)。

根据syndikat的回答,这是一个使用操作系统语言的替代解决方案。

一些关键的翻译缺失,但应该很容易添加它们。

 ;; 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 "[AZ]" (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-" "Ms-" "C-" "Cs-" "CM-" "CMs-"))) (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)) 

不知道, 沙博夫在哪里有1500亿。 我运行这个代码(感谢来自EmacsWiki的 Yuri Khan):

 (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个组合。 不幸的是,像Cx b这样的单个字母的组合不起作用。 我仍然试图找到一个更好的解决方案。

如果你想继续在Emacs中使用俄罗斯布局(而不是使用Emacs自己的输入方法),我现在唯一的方法是添加表单的绑定:

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

这将告诉Emacs,如果M-ф没有绑定,它应该尝试查找Ma。 可悲的是,你将需要很多这些绑定。 如果有人写了一个可以自动提供所有这些绑定的补丁包,我很乐意将它包含在Emacs中。