2011-10-18 23 views
9

¿Hay alguna forma de que Emacs detecte el diseño del teclado actual?Emacs que determina el diseño del teclado

A menudo escribo textos en inglés y alemán, cambiando el diseño del teclado (Win OS). Sin embargo, algunas funciones (por ejemplo, C-Y) siempre deben estar a la misma tecla física, sin importar el idioma Im escribiendo actualmente.

Gracias

Respuesta

3

considerar el uso de M-x set-input-method y M-x toggle-input-method. Toggle está limitado a C-\, el conjunto está vinculado a C-x RET C-\. Recomiendo este enlace, if you have hyper key:

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

Si no le pregunta cómo escribir en un idioma diferente, pero cómo hacer que varios comandos funcionen cuando utiliza diferentes idiomas en su sistema operativo, intente solo vincularlos. Funcionó bien en símbolos rusos. Una noche negro-negra incluso escribí

(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 
          '((?. . ?/) 
          (?, . ??) 
          (?\" . [email protected]) 
          (?№ . ?#) 
          (?\; . ?$) 
          (?: . ?^) 
          (?\? . ?&)))) 
(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 

Funciona. He enlazado todas las teclas rápidas globales hasta 2 niveles con símbolos rusos.

No lo estoy usando ahora, come el tiempo de inicio, y arruina la legibilidad de mi *Help* con cosas locas como It is bound to C-x b, C-x и, C-ч b, C-ч и. Úsalo con sabiduría.

+2

No entiendo completamente su código, pero diría que esto no se aplica a mi problema. Para Rusia, tienes un conjunto de personajes completamente diferente. - Para un teclado alemán, Z e Y son intercambiados, siempre ocultando mi ventana, cuando trato de tirar con C-y. (Supongo que la forma más sencilla sería vincular tirón a Cz y Cy, pero sería bueno si Emacs pudiera ver el scancode del teclado o el diseño actual.) – user1001991

+1

No use global-set-key/lookup-key pero en cambio, agregue remapeos a 'function-key-map'. Esto debería resolver su problema * Ayuda * (excepto que Emacs solo le informará sobre 'C-x b' y no' C-x и') y manejará automáticamente cualquier profundidad de enlaces. – Stefan

Cuestiones relacionadas