2011-10-18 15 views
9

क्या Emacs को वर्तमान कीबोर्ड लेआउट का पता लगाने का कोई तरीका है?एमेक्स कीबोर्ड लेआउट का निर्धारण

मैं अक्सर अंग्रेजी और जर्मन में ग्रंथ लिखता हूं, (विन ओएस) कीबोर्ड लेआउट स्विच करता हूं। हालांकि, कुछ कार्यों (सी-वाई उदा) हमेशा एक ही शारीरिक कुंजी पर होना चाहिए, कोई बात नहीं क्या भाषा इम वर्तमान में टाइप।

धन्यवाद

उत्तर

3

M-x set-input-method और M-x toggle-input-method उपयोग पर विचार करें। टॉगल C-\ तक बाध्य है, सेट 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 
          '((?. . ?/) 
          (?, . ??) 
          (?\" . [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 ग्लोबल हॉटकी को 2 स्तर तक बांध दिया है।

मैं अब इसका उपयोग नहीं कर रहा हूं, यह स्टार्टअप समय खाता है, और यह It is bound to C-x b, C-x и, C-ч b, C-ч и जैसे पागल चीजों के साथ मेरे *Help* की पठनीयता को खंडित करता है। इसे बुद्धिमानी से उपयोग करो।

+2

मुझे आपके कोड की पूरी तरह से समझ नहीं है, लेकिन मैं कहूंगा कि यह मेरी समस्या पर लागू नहीं है। रूसी के लिए, आपके पास पात्रों का एक बिल्कुल अलग सेट है। - एक जर्मन कीबोर्ड के लिए, ज़ेड और वाई स्वैप हो जाते हैं, हमेशा मेरी खिड़की को छुपाते हैं, जब मैं सी-वाई के साथ यंक करने की कोशिश करता हूं। (मुझे लगता है कि सबसे आसान तरीका यंक को सीज़ और सी में बांधना होगा, लेकिन यह अच्छा होगा अगर Emacs कीबोर्ड स्कैनकोड या वर्तमान लेआउट देख सके।) – user1001991

+1

ग्लोबल-सेट-की/लुकअप-कुंजी का उपयोग न करें लेकिन इसके बजाय 'फ़ंक्शन-की-मैप' पर रीमेपिंग जोड़ें। इससे आपकी * सहायता * समस्या हल होनी चाहिए (सिवाय इसके कि Emacs केवल आपको 'सी-एक्स बी' के बारे में बताएगा और 'सी-एक्स और' नहीं) और स्वचालित रूप से बाइंडिंग की किसी भी गहराई को संभालेगा। – Stefan

संबंधित मुद्दे