2011-10-18 40 views
9

Có cách nào để Emacs phát hiện bố cục bàn phím hiện tại không?Emacs xác định bố cục bàn phím

Tôi thường viết văn bản bằng tiếng Anh và tiếng Đức, chuyển bố cục bàn phím (Win OS). Tuy nhiên, một số chức năng (C-Y ví dụ) nên luôn luôn được ở phím vật lý như nhau, không có vấn đề gì ngôn ngữ Im hiện gõ vào.

Cảm ơn

Trả lời

3

Xem xét sử dụng M-x set-input-methodM-x toggle-input-method. Chuyển đổi được gắn với C-\, bộ được đặt thành C-x RET C-\. Tôi khuyên bạn nên ràng buộc này, if you have hyper key:

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

Nếu bạn không hỏi cách nhập bằng ngôn ngữ khác, nhưng cách làm cho một số lệnh hoạt động khi bạn sử dụng các ngôn ngữ khác nhau trong hệ điều hành của mình, hãy thử kết buộc chúng. Nó làm việc tốt đẹp trên các biểu tượng Nga. Một đêm đen đen tôi thậm chí đã viết

(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 

Nó hoạt động. Tôi đã gắn tất cả các phím nóng toàn cầu lên đến 2 cấp độ với các ký hiệu tiếng Nga.

Tôi hiện không sử dụng nó, nó ăn thời gian khởi động và nó sẽ hủy hoại khả năng đọc của tôi *Help* với những điều điên rồ như It is bound to C-x b, C-x и, C-ч b, C-ч и. Sử dụng nó một cách rộng rãi.

+2

Tôi không hiểu rõ mã của bạn, nhưng tôi cho rằng điều này không áp dụng được cho sự cố của tôi. Đối với tiếng Nga, bạn có một bộ ký tự hoàn toàn khác. - Đối với một bàn phím tiếng Đức, Z và Y bị hoán đổi, luôn che giấu cửa sổ của tôi, khi tôi cố gắng giật mình với C-y. (Tôi đoán cách đơn giản nhất sẽ là ràng buộc yank với Cz và Cy, nhưng sẽ tốt hơn nếu Emacs có thể thấy scancode bàn phím hoặc bố cục hiện tại.) – user1001991

+1

Không sử dụng khóa toàn cầu/khóa tìm kiếm nhưng thay vào đó hãy thêm các bản remappings vào 'function-key-map'. Điều này sẽ giải quyết vấn đề * Help * của bạn (ngoại trừ Emacs sẽ chỉ cho bạn biết về 'C-x b' và không phải' C-x и') và sẽ tự động xử lý bất kỳ độ sâu nào của các ràng buộc. – Stefan

Các vấn đề liên quan