【问题标题】:Emacs determining keyboard layoutEmacs 确定键盘布局
【发布时间】:2011-12-10 10:46:53
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: emacs


    【解决方案1】:

    考虑使用M-x set-input-methodM-x toggle-input-method。 Toggle 绑定到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-ч и 这样的疯狂东西。明智地使用它。

    【讨论】:

    • 我对您的代码没有透彻的了解,但我想说这不适用于我的问题。对于俄语,您有一组完全不同的字符。 - 对于德语键盘,Z 和 Y 交换,当我尝试用 C-y 拉动时,总是隐藏我的窗口。 (我猜最简单的方法是将 yank 绑定到 C-z 和 C-y,但如果 Emacs 可以看到键盘扫描码或当前布局,那就太好了。)
    • 不要使用 global-set-key/lookup-key,而是将重映射添加到 function-key-map。这应该可以解决你的 Help 问题(除了 Emacs 只会告诉你C-x b 而不是C-x и)并且会自动处理任何深度的绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2017-12-04
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多