GNU/Linux >> Belajar Linux >  >> Linux

Emacs, Linux, dan tata letak keyboard internasional

Anda dapat menyetel metode masukan (kudos buka kindahero ) dengan mengetik

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

atau

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

Untuk menyimpannya secara permanen, tambahkan

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

ke ~/.emacs config (dan gunakan C-\ untuk beralih di antara tata letak keyboard).


Saya menggunakan cuplikan berikut untuk keyboard Cyrillic dan berfungsi dengan baik untuk saya:

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

Kecuali:

Satu-satunya masalah yang saya tahu adalah penghitungan ulang rumus OrgTable tidak berfungsi dalam tata letak Rusia karena dipetakan ke C-c-* dan * mengubah lokasinya.

sumber


Berikut adalah solusi alternatif yang menggunakan bahasa OS, berdasarkan jawaban syndikat.

Beberapa terjemahan kunci tidak ada, tetapi seharusnya mudah untuk menambahkannya.

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

Entah dari mana sabof mendapat 150 miliar. Saya menjalankan kode ini (terima kasih kepada Yuri Khan, diambil dari 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))))))

Ini hanya 128 kombinasi. Sayangnya, kombinasi dengan satu huruf seperti C-x b tidak bekerja. Saya masih mencoba mencari solusi yang lebih baik.


Linux
  1. Bagikan Keyboard dan Mouse Anda Antara Linux dan Raspberry Pi

  2. Linux – Mode Keyboard Mentah?

  3. Linux – Direktori Standar Dan/atau Umum Pada OS Unix/linux?

  1. Perintah Linux:pekerjaan, bg, dan fg

  2. Remap tombol Win, Ctrl dan Alt di Linux

  3. nonaktifkan sementara touchpad dan keyboad, yaitu babyproofing laptop linux saya

  1. Terminal Linux saya yang kaya fitur dan minimal

  2. Cara Menggunakan sed untuk Menemukan dan Mengganti String di File

  3. Linux – Sysfs dan Devtmpfs?