Emacs确定键盘布局

use*_*991 9 emacs

有没有办法让Emacs检测当前的键盘布局?

我经常用英语和德语写文本,切换(Win OS)键盘布局.但是,无论我当前输入什么语言,某些功能(例如CY)应始终位于同一物理键上.

谢谢

des*_*esu 4

考虑使用M-x set-input-methodM-x toggle-input-method。Toggle 绑定到C-\\,set 绑定到C-x RET C-\\如果您有超级密钥,我推荐此绑定:

\n

(global-set-key [?\\H-\\\\] \'set-input-method)

\n

如果您问的不是如何输入不同的语言,而是在操作系统中使用不同语言时如何使多个命令起作用,请尝试绑定它们。它对俄罗斯符号效果很好。我什至写过一个黑夜

\n
(setq russian-symbols \'(\n                         (?\xd0\xb9 . ?q)\n                         (?\xd1\x86 . ?w)\n                         (?\xd1\x83 . ?e)\n                         (?\xd0\xba . ?r)\n                         (?\xd0\xb5 . ?t)\n                         (?\xd0\xbd . ?y)\n                         (?\xd0\xb3 . ?u)\n                         (?\xd1\x88 . ?i)\n                         (?\xd1\x89 . ?o)\n                         (?\xd0\xb7 . ?p)\n                         (?\xd1\x85 . ?\\[)\n                         (?\xd1\x8a . ?\\])\n                         (?\xd1\x84 . ?a)\n                         (?\xd1\x8b . ?s)\n                         (?\xd0\xb2 . ?d)\n                         (?\xd0\xb0 . ?f)\n                         (?\xd0\xbf . ?g)\n                         (?\xd1\x80 . ?h)\n                         (?\xd0\xbe . ?j)\n                         (?\xd0\xbb . ?k)\n                         (?\xd0\xb4 . ?l)\n                         (?\xd0\xb6 . ?\\;)\n                         (?\xd1\x8d . ?\')\n                         (?\xd1\x8f . ?z)\n                         (?\xd1\x87 . ?x)\n                         (?\xd1\x81 . ?c)\n                         (?\xd0\xbc . ?v)\n                         (?\xd0\xb8 . ?b)\n                         (?\xd1\x82 . ?n)\n                         (?\xd1\x8c . ?m)\n                         (?\xd0\xb1 . ?,)\n                         (?\xd1\x8e . ?.)\n\n                         (?\xd0\x99 . ?Q)\n                         (?\xd0\xa6 . ?W)\n                         (?\xd0\xa3 . ?E)\n                         (?\xd0\x9a . ?R)\n                         (?\xd0\x95 . ?T)\n                         (?\xd0\x9d . ?Y)\n                         (?\xd0\x93 . ?U)\n                         (?\xd0\xa8 . ?I)\n                         (?\xd0\xa9 . ?O)\n                         (?\xd0\x97 . ?P)\n                         (?\xd0\xa5 . ?{)\n                         (?\xd0\xaa . ?})\n                         (?\xd0\xa4 . ?A)\n                         (?\xd0\xab . ?S)\n                         (?\xd0\x92 . ?D)\n                         (?\xd0\x90 . ?F)\n                         (?\xd0\x9f . ?G)\n                         (?\xd0\xa0 . ?H)\n                         (?\xd0\x9e . ?J)\n                         (?\xd0\x9b . ?K)\n                         (?\xd0\x94 . ?L)\n                         (?\xd0\x96 . ?:)\n                         (?\xd0\xad . ?\\")\n                         (?\xd0\xaf . ?Z)\n                         (?\xd0\xa7 . ?X)\n                         (?\xd0\xa1 . ?C)\n                         (?\xd0\x9c . ?V)\n                         (?\xd0\x98 . ?B)\n                         (?\xd0\xa2 . ?N)\n                         (?\xd0\xac . ?M)\n                         (?\xd0\x91 . ?<)\n                         (?\xd0\xae . ?>)\n\n                         (?\xd0\x81 . ?~)\n                         (?\xd1\x91 . ?`)\n                         ))\n\n(setq russian-symbols-full (append russian-symbols\n                             \'((?. . ?/)\n                             (?, . ??)\n                             (?\\" . ?@)\n                             (?\xe2\x84\x96 . ?#)\n                             (?\\; . ?$)\n                             (?: . ?^)\n                             (?\\? . ?&))))\n(defun cm-ru-to-en-string(string)\n  (apply \'concat (mapcar (lambda (arg) (setq arg (format "%c" (or (cdr (assoc arg russian-symbols-full)) arg)))) string)))\n\n(defun cm-en-to-ru-string(string)\n  (apply \'concat (mapcar (lambda (arg) (setq arg (format "%c" (or (car (rassoc arg russian-symbols-full)) arg)))) string)))\n\n(defun cm-ru-to-en-region()\n  (interactive)\n  (let ((text (buffer-substring-no-properties (mark) (point))))\n    (delete-region (mark) (point))\n    (insert (cm-ru-to-en-string text))))\n\n(defun cm-en-to-tu-region()\n  (interactive)\n  (let ((text (buffer-substring-no-properties (mark) (point))))\n    (delete-region (mark) (point))\n    (insert (cm-en-to-ru-string text))))\n\n;; DO NOT USE vvv SINCE YOU WILL NOT BE ABLE TO INPUT THROUGH C-\\\n\n;; (let ((symbols russian-symbols))\n;;   (while symbols\n;;     (global-set-key (vector (car (car symbols))) (vector (cdr (car symbols))))\n;;     (setq symbols (cdr symbols))))\n\n;; DO NOT USE ^^^ SINCE YOU WILL NOT BE ABLE TO INPUT THROUGH C-\\\n\n;; (- ?\\C-\xd1\x8b ?\xd1\x8b) ;;russian C-\n;; (- ?\\C-s ?s) ;;english C-\n;; (- ?\\M-\xd1\x8b ?\xd1\x8b) ;;russian M-\n;; (- ?\\M-s ?s) ;;english M-\n\n\n(setq russian-symbols-map1\n  (append \n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\C-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\C-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\M-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\M-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\C-\\M-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\C-\\M-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\H-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\H-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\H-\\C-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\H-\\C-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\H-\\M-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\H-\\M-s ?s) (cdr arg))))) russian-symbols)\n    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\\H-\\C-\\M-\xd1\x8b ?\xd1\x8b) (car arg)) (+ (- ?\\H-\\C-\\M-s ?s) (cdr arg))))) russian-symbols)))\n\n(setq russian-symbols-map2\n  (append\n    russian-symbols-map1\n    russian-symbols)) ; We must not start with russian letters, but if it is element in a sequence - in should be fine.\n\n(setq symbols2 russian-symbols-map1)    ; One-key sequence command.\n(let ((symbols2 russian-symbols-map1))\n    (while symbols2\n      (if\n        (and (symbolp (lookup-key global-map\n                        (vector\n                          (cdr (car symbols2))\n                          )))\n          (lookup-key global-map\n            (vector\n              (cdr (car symbols2))\n              )))\n        (global-set-key\n          (vector\n            (car (car symbols2))\n            )\n          (lookup-key global-map\n            (vector\n              (cdr (car symbols2))\n              ))))\n      (setq symbols2 (cdr symbols2))))\n\n\n\n(let ((symbols1 russian-symbols-map2) (symbols2 russian-symbols-map1)) ; Two keys sequence\n  (while symbols1\n    (while symbols2\n      (if\n        (and (symbolp (lookup-key global-map\n                        (vector\n                          (cdr (car symbols2))\n                          (cdr (car symbols1))\n                          )))\n          (lookup-key global-map\n            (vector\n              (cdr (car symbols2))\n              (cdr (car symbols1))\n              )))\n        (global-set-key\n          (vector\n            (car (car symbols2))\n            (car (car symbols1))\n            )\n          (lookup-key global-map\n            (vector\n              (cdr (car symbols2))\n              (cdr (car symbols1))\n              ))))\n      (setq symbols2 (cdr symbols2)))\n    (setq symbols2 russian-symbols-map1)\n    (setq symbols1 (cdr symbols1))))\n\n(provide \'shamanizm) ;russian emacs-users should lol reading this\n
Run Code Online (Sandbox Code Playgroud)\n

有用。我已将所有全局热键与俄语符号绑定到 2 级。

\n

我现在没有使用它,它会占用启动时间,并且会破坏我的可读性,*Help*比如It is bound to C-x b, C-x \xd0\xb8, C-\xd1\x87 b, C-\xd1\x87 \xd0\xb8. 明智地使用它。

\n

  • 我对您的代码没有透彻的了解,但我想说这不适用于我的问题。对于俄语,你有一组完全不同的字符。- 对于德语键盘,当我尝试用 Cy 猛拉时,Z 和 Y 会交换,总是隐藏我的窗口。(我猜最简单的方法是将 yank 绑定到 Cz 和 Cy,但如果 Emacs 可以看到键盘扫描代码或当前布局,那就太好了。) (2认同)
  • 不要使用全局设置键/查找键,而是将重新映射添加到“功能键映射”。这应该可以解决您的 *Help* 问题(除了 Emacs 只会告诉您有关 `Cx b` 而不是 `Cx и`),并且会自动处理任何深度的绑定。 (2认同)