2011-10-18 5 views
9

Emacsが現在のキーボードレイアウトを検出する方法はありますか?Emacsがキーボードレイアウトを決定する

(Win OS)キーボードレイアウトを切り替えると、英語とドイツ語でテキストを書き込むことがよくあります。ただし、一部の機能(C-Yなど​​)は、常に関係なく、イムは、現在で入力してどのような言語、同じ物理キーであってはならない。

おかげ

答えて

3

M-x set-input-methodM-x toggle-input-methodを使用することを検討してください。トグルはC-\にバインドされ、セットはC-x RET C-\にバインドされます。このバインディングは、if you have hyper key

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

異なる言語での入力方法を尋ねるのではなく、OSで異なる言語を使用しているときに複数のコマンドを動作させる方法を尋ねる場合は、それらをバインドしてください。それはロシアのシンボルにうまくいきました。ワン黒黒夜私もそれが動作する

(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 

を書きました。私はすべてのグローバルホットキーをロシアのシンボルで2レベルまでバインドしました。

私は今それを使用していません。起動時に食べてしまい、*Help*の読みやすさが残っています.It is bound to C-x b, C-x и, C-ч b, C-ч иのような狂気のものがあります。それを賢明に使う。

+2

私はあなたのコードを完全に理解していませんが、これは私の問題には当てはまりません。ロシア語の場合、あなたはまったく異なる文字セットを持っています。 - ドイツのキーボードの場合、ZとYはスワップされ、C-yでヤンクしようとすると常にウィンドウが隠れてしまいます。 (私はCzとCyにヤンクをバインドするのが最も簡単な方法だと思いますが、Emacsがキーボードスキャンコードまたは現在のレイアウトを見ることができればうれしいでしょう) – user1001991

+1

グローバルセットキー/ルックアップキー'function-key-map'に再マッピングを追加します。これはあなたの*ヘルプ*の問題を解決するはずです(ただし、Emacsは 'C-x b'だけではなく' C-xи'を教えてくれます)、自動的に束縛の深さを処理します。 – Stefan