有没有办法让Emacs检测当前的键盘布局?
我经常用英语和德语写文本,切换(Win OS)键盘布局.但是,无论我当前输入什么语言,某些功能(例如CY)应始终位于同一物理键上.
谢谢
考虑使用M-x set-input-method和M-x toggle-input-method。Toggle 绑定到C-\\,set 绑定到C-x RET C-\\。如果您有超级密钥,我推荐此绑定:
(global-set-key [?\\H-\\\\] \'set-input-method)。
如果您问的不是如何输入不同的语言,而是在操作系统中使用不同语言时如何使多个命令起作用,请尝试绑定它们。它对俄罗斯符号效果很好。我什至写过一个黑夜
\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\nRun 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. 明智地使用它。