英語以外 (ロシア語) のキーボード レイアウトを使用している場合に、Emacs のキー バインドを使用する簡単な方法はありますか?
インターナショナル レイアウトがオンの場合、すべてのキーストロークは、Ma ではなく M-ф として文字どおりに解釈されます。その結果、コマンドを使用できません。
また、Linux がプレフィックスなしおよびシフトプレフィックス付きのキーを国際的なレイアウトに従って解釈し、残りを英語のままにできるとよいでしょう。
英語以外 (ロシア語) のキーボード レイアウトを使用している場合に、Emacs のキー バインドを使用する簡単な方法はありますか?
インターナショナル レイアウトがオンの場合、すべてのキーストロークは、Ma ではなく M-ф として文字どおりに解釈されます。その結果、コマンドを使用できません。
また、Linux がプレフィックスなしおよびシフトプレフィックス付きのキーを国際的なレイアウトに従って解釈し、残りを英語のままにできるとよいでしょう。
入力方法を設定できます(称賛はkindaheroに行きます) 。
M-x set-input-method RET cyrillic-yawerty RET
また
M-x set-input-method RET cyrillic-jcuken RET
永続的に保存するには、追加します
(setq default-input-method "cyrillic-yawerty")
~ /.emacs config に追加します (C-\キーボード レイアウトの切り替えに使用します)。
syndikat の回答に基づいて、OS 言語を使用する代替ソリューションを次に示します。
一部の重要な翻訳が欠落していますが、簡単に追加できるはずです。
;; 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))
サボフが 1500 億をどこで手に入れたのかはわかりません。このコードを実行しました ( EmacsWikiから取得した Yuri Khan に感謝します):
(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機能しません。私はまだより良い解決策を見つけようとしています。
(Emacs 独自の入力メソッドを使用するのではなく) Emacs でロシア語のレイアウトを使用し続けたい場合、今のところ私が知っている唯一の方法は、次の形式のバインドを追加することです。
(define-key function-key-map [?\M-ф] [?\M-a])
これは、M-ф がバインドされていない場合、代わりに Ma を検索しようとすることを Emacs に伝えます。残念ながら、これらのバインディングがたくさん必要になります。これらすべてのバインディングを自動的に提供できるパッチ/パッケージを誰かが書いたら、喜んで Emacs に含めます。