linux emacs internationalization keyboard

Emacs, Linux y distribuciones de teclado internacionales.



internationalization keyboard (5)

Aquí hay una solución alternativa que usa el lenguaje del sistema operativo, basado en la respuesta de syndikat.

Faltan algunas traducciones clave, pero debería ser fácil agregarlas.

;; 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))

¿Hay una manera fácil de usar los enlaces de teclas de Emacs cuando está usando una distribución de teclado que no es el inglés (ruso)?

Cada vez que se activa un diseño internacional, todas las pulsaciones se interpretan literalmente, M-ф en lugar de Ma. Como resultado no puedo usar comandos.

También sería bueno si Linux pudiera interpretar las teclas sin prefijo y con cambio de acuerdo con un diseño internacional, manteniendo el resto en inglés.


No estoy seguro, de donde consiguió 150 mil millones. Corrí este código (gracias a Yuri Khan, tomado de 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))))))

Son solo 128 combinaciones. Desafortunadamente, las combinaciones con letras simples como Cx b no funcionan. Todavía estoy tratando de encontrar una mejor solución.


Puede configurar el método de entrada (kudos ir a kindahero ) escribiendo

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

o

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

Para almacenarlo permanentemente, agregue

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

a ~ / .emacs config (y use C- / para cambiar entre las distribuciones de teclado).


Si desea seguir utilizando el diseño ruso en Emacs (en lugar de utilizar los propios métodos de entrada de Emacs), la única forma que conozco por ahora es agregar enlaces del formulario:

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

Esto le dirá a Emacs que en caso de que M-ф no esté vinculado, debería intentar buscar a Ma en su lugar. Lamentablemente, necesitarás muchos de estos enlaces. Si alguien escribe un parche / paquete que pueda proporcionar automáticamente todos estos enlaces, me complacería incluirlo en Emacs.


Uso el siguiente fragmento de código para el teclado cirílico y funciona bien para mí:

(defun reverse-input-method (input-method) "Build the reverse mapping of single letters from INPUT-METHOD." (interactive (list (read-input-method-name "Use input method (default current): "))) (if (and input-method (symbolp input-method)) (setq input-method (symbol-name input-method))) (let ((current current-input-method) (modifiers ''(nil (control) (meta) (control meta)))) (when input-method (activate-input-method input-method)) (when (and current-input-method quail-keyboard-layout) (dolist (map (cdr (quail-map))) (let* ((to (car map)) (from (quail-get-translation (cadr map) (char-to-string to) 1))) (when (and (characterp from) (characterp to)) (dolist (mod modifiers) (define-key local-function-key-map (vector (append mod (list from))) (vector (append mod (list to))))))))) (when input-method (activate-input-method current)))) (reverse-input-method ''russian-computer)

Excepto:

El único problema que conozco es que el recálculo de las fórmulas de OrgTable no funciona en el diseño ruso porque está asignado a Cc- * y * cambia su ubicación.

source