2012-05-17 12 views
14

क्या आप एक अंग्रेजी (रूसी) कीबोर्ड लेआउट का उपयोग करते समय Emacs कुंजी-बाइंडिंग का उपयोग करने का कोई आसान तरीका है?Emacs, Linux और अंतरराष्ट्रीय कीबोर्ड लेआउट

जब भी कोई अंतरराष्ट्रीय लेआउट चालू होता है, तो सभी कीस्ट्रोक का अर्थ शाब्दिक रूप से किया जाता है, एम-ए के बजाय एम-एफ। नतीजतन मैं कमांड का उपयोग नहीं कर सकता।

यह भी अच्छा होगा अगर लिनक्स एक अंतरराष्ट्रीय लेआउट के अनुसार, गैर-प्रीफिक्स्ड और शिफ्ट-प्रीफिक्स्ड चाबियों की व्याख्या कर सकता है, जबकि बाकी अंग्रेजी रखता है।

+2

एक तरह से अंग्रेजी लेआउट का उपयोग करने, जबकि आप Emacs पर हैं .. यदि आप लिखना रूस Emacs दबाने 'सी \' – kindahero

उत्तर

11

आप

M-x set-input-method RET cyrillic-yawerty RET 

या

M-x set-input-method RET cyrillic-jcuken RET 

टाइपिंग यह स्थायी रूप से स्टोर करने के लिए द्वारा इनपुट पद्धति (प्रशंसा kindahero करने के लिए जाना) सेट कर सकते हैं, जोड़ने

(setq default-input-method "cyrillic-yawerty") 

से ~/.emacs कॉन्फ़िगरेशन (और कीबोर्ड लेआउट के बीच स्विच करने के लिए सी- \ का उपयोग करें)।

+0

तुम्हारा मतलब MX को निर्धारित इनपुट-विधि, और फिर से Emacs बदलने में इनपुट विधि चाहते है रूसी और अंग्रेजी के बीच स्विच करने के लिए सी- \? कम से कम यही मेरे लिए काम करता है – sabof

0

आप Emacs (बजाय का उपयोग Emacs के स्वयं के इनपुट विधि) में रूसी लेआउट का उपयोग कर रखना चाहते हैं, तो एक ही रास्ता मैं अब के लिए के बारे में पता फार्म की बाइंडिंग को जोड़ने के लिए है:

(define-key function-key-map [?\M-ф] [?\M-a]) 

हो जाएगा ताकि Emacs को बताएं कि यदि एम-एफ बाध्य नहीं है, तो उसे इसके बजाय मा को देखने का प्रयास करना चाहिए। अफसोस की बात है, आपको इन बाईंडिंग्स की बहुत आवश्यकता होगी। अगर कोई पैच/पैकेज लिखता है जो स्वचालित रूप से इन सभी बाइंडिंग प्रदान कर सकता है, तो मुझे इसे Emacs में शामिल करने में खुशी होगी।

+0

मैंने एक मोटा गणना की और 150 संशोधित कुंजी, 4 संशोधक कुंजी, एक 4-लंबी तार, और 40 कुंजी मानते हुए समाप्त किया। एक ऑन-द-फ्लाई अनुवादक फ़ंक्शन अच्छा हो सकता है – sabof

+0

मैंने एक स्निपेट लिखा है जो बाइंडिंग का ख्याल रखता है। यह आधा पकाया जाता है - यह सभी कीबोर्ड के लिए बाइंडिंग प्रदान करने के लिए खंभे से मानचित्र ले सकता है। यह उन तरीकों से भी संघर्ष करता है जो स्वयं-सम्मिलित कमांड को ओवरराइड करते हैं, जैसे कि क्यू-आयत। – sabof

+0

@sabof: सभी मामलों को कवर करने के लिए आवश्यक संयोजनों की संख्या बड़ी है, यह उतना बड़ा नहीं है जितना आप सोचते हैं क्योंकि यह रीमेपिंग * कुंजी अनुक्रमों के भीतर लागू होती है।तो मैंने जो एकल उदाहरण दिखाया है, वह पहले से ही 'सी-एक्स एम-एफ' या 'एम-एफ एम-एफ' को कवर करेगा। लेकिन हां, 4 संशोधक के साथ संयुक्त 40-चाबियां आपको 480 बाइंडिंग देती हैं और स्पष्ट रूप से इसे प्रोग्रामेटिक रूप से ऑन-द-फ्लाई कर रही हैं। – Stefan

2

सुनिश्चित नहीं है, sabof को 150 बिलियन मिले।

(loop 
for from across "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЯЧСМИТЬБЮ№" 
for to across "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#" 
do 
(eval `(define-key key-translation-map (kbd ,(concat "C-" (string from))) (kbd ,(concat  "C-" (string to))))) 
(eval `(define-key key-translation-map (kbd ,(concat "M-" (string from))) (kbd ,(concat  "M-" (string to)))))) 

यह केवल 128 संयोजन है: मैं इस कोड (धन्यवाद यूरी खान को, EmacsWiki से लिया गया) भाग गया। दुर्भाग्य से, सी-एक्स बी जैसे एकल अक्षरों के साथ संयोजन काम नहीं करते हैं। मैं अभी भी एक बेहतर समाधान खोजने की कोशिश कर रहा हूँ।

+1

इसका मतलब है कि आप मेरी टिप्पणी को समझ नहीं पाए। मैं एक जवाब के रूप एक उन्नत संस्करण जोड़ दिया है, इस मामले में किसी को यह पाश के लिए भर में "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ \ ЭЯЧСМИТЬБЮ№" से करने के लिए "qwertyuiop भर की जरूरत है – sabof

+0

यह आप तरह Cx ख कुछ के साथ संयोजन कर सकते हैं लगता है' ([] asdfghjkl; 'zxcvbnm, .QWERTYUIOP {} ASDFGHJKL: \ "ZXCVBNM <> #" (वैश्विक-सेट-कुंजी (kbd (concat "cx" (स्ट्रिंग से)) (कुंजी-बाध्यकारी (kbd (concat "सीएक्स" (स्ट्रिंग)) टी)) ) ' ' –

4

यहां एक वैकल्पिक समाधान है जो सिंडिकैट के उत्तर के आधार पर ओएस भाषा का उपयोग करता है।

कुछ प्रमुख अनुवाद गायब हैं, लेकिन उन्हें जोड़ना आसान होना चाहिए।

;; USAGE: 
;; Put in your .emacs: 
;; 
;; (translate-keystrokes-ru->en) 
;; (add-hook 'text-mode-hook 
;;   (lambda() (literal-insert-mode 1))) 
;; 
;; Only buffers with literal-insert-mode active will be sensitive to the 
;; environment language. Prefixed keybindings will still be usable. 

(defun translate-keystrokes-ru->en() 
    "Make emacs output english characters, regardless whether 
the OS keyboard is english or russian" 
    (flet ((make-key-stroke (prefix char) 
      (eval `(kbd ,(if (and (string-match "^C-" prefix) 
           (string-match "[A-Z]" (string char))) 
          (concat "S-" prefix (string (downcase char))) 
          (concat prefix (string char))))))) 
    (let ((case-fold-search nil) 
      (keys-pairs (mapcar* 'cons 
           "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЯЧСМИТЬБЮ№" 
           "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#")) 
      (prefixes '("" "s-" "M-" "M-s-" 
         "C-" "C-s-" "C-M-" "C-M-s-"))) 
     (mapc (lambda (prefix) 
       (mapc (lambda (pair) 
         (define-key key-translation-map 
          (make-key-stroke prefix (car pair)) 
         (make-key-stroke prefix (cdr pair)))) 
        keys-pairs)) 
      prefixes)))) 

(defun literal-insert() 
    (interactive) 
    (insert-char last-input-event 1)) 

(define-minor-mode literal-insert-mode 
    "Make emacs output characters corresponging to the OS keyboard, 
ignoring the key-translation-map" 
    :keymap (let ((new-map (make-sparse-keymap)) 
       (english-chars "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>#")) 
      (mapc (lambda (char) 
        (define-key new-map (string char) 
         'literal-insert)) 
        english-chars) 
      new-map)) 
संबंधित मुद्दे