GNU/Linux >> Tutoriales Linux >  >> Linux

Emacs, Linux y distribuciones de teclado internacionales

Puede establecer el método de entrada (felicitaciones vaya 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 distribuciones de teclado).


Uso el siguiente fragmento 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 la tabla organizativa no funciona en el diseño ruso porque está asignado a C-c-* y * cambia su ubicación.

fuente


Aquí hay una solución alternativa que usa el lenguaje del sistema operativo, basada 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))

No estoy seguro, ¿de dónde sacó Sabof 150 mil millones? Ejecuté 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 individuales como C-x b no trabajes Todavía estoy tratando de encontrar una mejor solución.


Linux
  1. Comandos de Linux:trabajos, bg y fg

  2. Comparta su teclado y mouse entre Linux y Raspberry Pi

  3. Linux – ¿Modo de teclado sin formato?

  4. Linux:¿Sysfs y Devtmpfs?

  5. Linux:¿directorios estándar y/o comunes en sistemas operativos Unix/linux?

Instalación y configuración de Jenkins en Linux

Secretos de plasma:idiomas adicionales y diseños de teclado

Linux busca cadenas en carpetas y archivos con ack

Cómo instalar y ejecutar emacs Editor en Debian/Ubuntu Linux

Cómo instalar y usar GNU Emacs en distribuciones de Linux

Cedilla bajo C (ç) en el diseño de teclado 'US international with dead keys' en Linux