當您使用非英語(俄語)鍵盤佈局時,是否有一種使用Emacs鍵綁定的簡單方法?Emacs,Linux和國際鍵盤佈局
無論何時打開國際佈局,所有擊鍵都按字面解釋,M-ф而不是M-a。因此我不能使用命令。
如果Linux能根據國際佈局解釋非前綴和前置鍵,並保留其餘的英文,那也不錯。
當您使用非英語(俄語)鍵盤佈局時,是否有一種使用Emacs鍵綁定的簡單方法?Emacs,Linux和國際鍵盤佈局
無論何時打開國際佈局,所有擊鍵都按字面解釋,M-ф而不是M-a。因此我不能使用命令。
如果Linux能根據國際佈局解釋非前綴和前置鍵,並保留其餘的英文,那也不錯。
您可以通過鍵入
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 config(並使用C- \在鍵盤佈局之間切換)。
你的意思是將MX設爲輸入法,然後改變emacs的輸入法C- \在俄語和英語之間切換?至少這就是我的工作 – sabof
如果你想利用俄佈局在Emacs(而不是使用Emacs自己的輸入法)來保持的,我知道的,現在唯一的辦法就是添加表格的綁定:
(define-key function-key-map [?\M-ф] [?\M-a])
這將告訴Emacs,如果M-ф沒有綁定,它應該嘗試查找Ma。可悲的是,你需要很多這些綁定。如果有人寫了一個可以自動提供所有這些綁定的補丁/軟件包,我很樂意將它包含在Emacs中。
我做了一個粗略的計算,最終得到了1500億個組合,假設4個修改鍵,一個4長和絃和40個鍵。即時翻譯功能可能更好 – sabof
我寫了一個處理綁定的代碼片段。它是半熟的 - 它可以從騾子的地圖爲所有鍵盤提供綁定。它也與重寫自插入命令的模式相沖突,例如cua-rectangle。 – sabof
@sabof:儘管覆蓋所有情況所需的組合數量很大,但它並不像你想象的那麼大,因爲這種重映射在*鍵序列中被應用。因此,我展示的單個示例已經涵蓋了例如「C-x M-ф」或「M-фM-ф」。但是,是的,40鍵與4個修飾符相結合可以爲你提供480個綁定,並且在程序中清楚地執行它會更好。 – Stefan
不確定,sabof在哪裏有1500億。我跑這個代碼(感謝尤里·汗,來自EmacsWiki拍攝):
(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組合。不幸的是,與單個字母組合如C-x b不起作用。我仍然在努力尋找更好的解決方案。
這意味着你不瞭解我的評論。我已經添加了一個改進版作爲一個答案,萬一有人需要它 – sabof
這似乎可以讓CX b組合的東西,如 '(循環 從跨越「йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖ\ЭЯЧСМИТЬБЮ№」 的跨越「QWERTYUIOP [] asdfghjkl;'zxcvbnm,.QWERTYUIOP {} ASDFGHJKL:\「ZXCVBNM <>#」 do (global-set-key(kbd(concat「Cx」(string from)))(key-binding(kbd(concat 「Cx」(string to)))t)) )' ' –
這是另一種使用OS語言的解決方案,它基於syndikat的答案。
一些關鍵翻譯缺失,但應該很容易添加它們。
;; 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))
的方法之一是使用英語的佈局,而你在Emacs的..如果你想編寫俄羅斯在Emacs按'C- \' – kindahero