Emacs确定键盘布局

时间:2011-10-18 20:58:53

标签: emacs

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

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

由于

1 个答案:

答案 0 :(得分:3)

考虑使用M-x set-input-methodM-x toggle-input-method。切换绑定到C-\,set绑定到C-x RET C-\。我推荐这种绑定,if you have hyper key

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

如果您不询问如何键入不同的语言,但如果在操作系统中使用不同语言时如何使多个命令起作用,请尝试将它们绑定。它在俄罗斯符号上很好用。我写的一个黑黑夜晚

(setq russian-symbols '(
                         (?й . ?q)
                         (?ц . ?w)
                         (?у . ?e)
                         (?к . ?r)
                         (?е . ?t)
                         (?н . ?y)
                         (?г . ?u)
                         (?ш . ?i)
                         (?щ . ?o)
                         (?з . ?p)
                         (?х . ?\[)
                         (?ъ . ?\])
                         (?ф . ?a)
                         (?ы . ?s)
                         (?в . ?d)
                         (?а . ?f)
                         (?п . ?g)
                         (?р . ?h)
                         (?о . ?j)
                         (?л . ?k)
                         (?д . ?l)
                         (?ж . ?\;)
                         (?э . ?')
                         (?я . ?z)
                         (?ч . ?x)
                         (?с . ?c)
                         (?м . ?v)
                         (?и . ?b)
                         (?т . ?n)
                         (?ь . ?m)
                         (?б . ?,)
                         (?ю . ?.)

                         (?Й . ?Q)
                         (?Ц . ?W)
                         (?У . ?E)
                         (?К . ?R)
                         (?Е . ?T)
                         (?Н . ?Y)
                         (?Г . ?U)
                         (?Ш . ?I)
                         (?Щ . ?O)
                         (?З . ?P)
                         (?Х . ?{)
                         (?Ъ . ?})
                         (?Ф . ?A)
                         (?Ы . ?S)
                         (?В . ?D)
                         (?А . ?F)
                         (?П . ?G)
                         (?Р . ?H)
                         (?О . ?J)
                         (?Л . ?K)
                         (?Д . ?L)
                         (?Ж . ?:)
                         (?Э . ?\")
                         (?Я . ?Z)
                         (?Ч . ?X)
                         (?С . ?C)
                         (?М . ?V)
                         (?И . ?B)
                         (?Т . ?N)
                         (?Ь . ?M)
                         (?Б . ?<)
                         (?Ю . ?>)

                         (?Ё . ?~)
                         (?ё . ?`)
                         ))

(setq russian-symbols-full (append russian-symbols
                             '((?. . ?/)
                             (?, . ??)
                             (?\" . ?@)
                             (?№ . ?#)
                             (?\; . ?$)
                             (?: . ?^)
                             (?\? . ?&))))
(defun cm-ru-to-en-string(string)
  (apply 'concat (mapcar (lambda (arg) (setq arg (format "%c" (or (cdr (assoc arg russian-symbols-full)) arg)))) string)))

(defun cm-en-to-ru-string(string)
  (apply 'concat (mapcar (lambda (arg) (setq arg (format "%c" (or (car (rassoc arg russian-symbols-full)) arg)))) string)))

(defun cm-ru-to-en-region()
  (interactive)
  (let ((text (buffer-substring-no-properties (mark) (point))))
    (delete-region (mark) (point))
    (insert (cm-ru-to-en-string text))))

(defun cm-en-to-tu-region()
  (interactive)
  (let ((text (buffer-substring-no-properties (mark) (point))))
    (delete-region (mark) (point))
    (insert (cm-en-to-ru-string text))))

;; DO NOT USE vvv SINCE YOU WILL NOT BE ABLE TO INPUT THROUGH C-\

;; (let ((symbols russian-symbols))
;;   (while symbols
;;     (global-set-key (vector (car (car symbols))) (vector (cdr (car symbols))))
;;     (setq symbols (cdr symbols))))

;; DO NOT USE ^^^ SINCE YOU WILL NOT BE ABLE TO INPUT THROUGH C-\

;; (- ?\C-ы ?ы) ;;russian C-
;; (- ?\C-s ?s) ;;english C-
;; (- ?\M-ы ?ы) ;;russian M-
;; (- ?\M-s ?s) ;;english M-


(setq russian-symbols-map1
  (append 
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\C-ы ?ы) (car arg)) (+ (- ?\C-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\M-ы ?ы) (car arg)) (+ (- ?\M-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\C-\M-ы ?ы) (car arg)) (+ (- ?\C-\M-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\H-ы ?ы) (car arg)) (+ (- ?\H-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\H-\C-ы ?ы) (car arg)) (+ (- ?\H-\C-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\H-\M-ы ?ы) (car arg)) (+ (- ?\H-\M-s ?s) (cdr arg))))) russian-symbols)
    (mapcar (lambda (arg) (setq arg (cons (+ (- ?\H-\C-\M-ы ?ы) (car arg)) (+ (- ?\H-\C-\M-s ?s) (cdr arg))))) russian-symbols)))

(setq russian-symbols-map2
  (append
    russian-symbols-map1
    russian-symbols)) ; We must not start with russian letters, but if it is element in a sequence - in should be fine.

(setq symbols2 russian-symbols-map1)    ; One-key sequence command.
(let ((symbols2 russian-symbols-map1))
    (while symbols2
      (if
        (and (symbolp (lookup-key global-map
                        (vector
                          (cdr (car symbols2))
                          )))
          (lookup-key global-map
            (vector
              (cdr (car symbols2))
              )))
        (global-set-key
          (vector
            (car (car symbols2))
            )
          (lookup-key global-map
            (vector
              (cdr (car symbols2))
              ))))
      (setq symbols2 (cdr symbols2))))



(let ((symbols1 russian-symbols-map2) (symbols2 russian-symbols-map1)) ; Two keys sequence
  (while symbols1
    (while symbols2
      (if
        (and (symbolp (lookup-key global-map
                        (vector
                          (cdr (car symbols2))
                          (cdr (car symbols1))
                          )))
          (lookup-key global-map
            (vector
              (cdr (car symbols2))
              (cdr (car symbols1))
              )))
        (global-set-key
          (vector
            (car (car symbols2))
            (car (car symbols1))
            )
          (lookup-key global-map
            (vector
              (cdr (car symbols2))
              (cdr (car symbols1))
              ))))
      (setq symbols2 (cdr symbols2)))
    (setq symbols2 russian-symbols-map1)
    (setq symbols1 (cdr symbols1))))

(provide 'shamanizm) ;russian emacs-users should lol reading this

有效。我用俄语符号将所有全球​​热键绑定到2级。

我现在没有使用它,它占用了启动时间,并且遗忘了我*Help*的可读性与It is bound to C-x b, C-x и, C-ч b, C-ч и之类的疯狂事物。明智地使用它。