Переопределить self-insert-command или input-decode-map - PullRequest
1 голос
/ 16 декабря 2011

Я искал пример переопределения связки клавиш, чтобы я мог нажать Sz h , и фактическим результатом будет «Ж» (это заглавная буква кириллицы Zhe),но любая другая последовательность, начинающаяся с Sz , будет вставлять «З» (кириллическая заглавная буква Ze) и следующий символ, напечатанный так, как если бы он начинал новую последовательность, в выделенном режиме, конечно.

До сих пор я нашел это: http://www.gnu.org/software/emacs/elisp/html_node/Translation-Keymaps.html (в самом низу страницы), но я не могу заставить его что-либо делать / не совсем понимаю, что пытается показать этот пример: (

Если вы потратите время на написание простого примера переопределения команды самостоятельной вставки или любого другого способа выполнения вышеизложенного, я был бы очень признателен за это!

РЕДАКТИРОВАТЬ: (вотчто я пытался до сих пор)

(defun transliterate ()
  (interactive)
  (insert (upcase last-input-char)))

(define-key (current-global-map)
  [remap self-insert-command]
  'transliterate)

EDIT2: http://pastebin.com/uBFmspmf Я мог бы получить желаемый эффект, но код очень уродлив :( Так что, предложения все еще приветствуются!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2011

Отказ от ответственности: я не использую многоязычные функции в Emacs, так что, возможно, это не лучший подход, и я, возможно, даже заново изобрел колесо, но:

(defvar zhe-mode-mapping
  '((?h . ?Ж)))

(defvar zhe-mode-prefix-key [(meta i)])

(defun zhe-mode-insert (n)
  (interactive "p")
  (let ((mapping (assq last-input-event zhe-mode-mapping)))
    (if mapping
        (apply 'insert (make-list n (string (cdr mapping))))
      (if (eq (lookup-key (current-global-map) (single-key-description last-input-event))
              'self-insert-command)
          (progn
            (insert "З")
            (self-insert-command n))
        (error "%s does not self-insert" (single-key-description last-input-event) )))))

(defvar zhe-mode-override-map
  (let ((map (make-sparse-keymap)))
    (map-keymap (lambda (key def)
                  (when (eq def 'self-insert-command)
                    (nconc map (list (cons key 'zhe-mode-insert)))))
                (current-global-map))
    (keymap-canonicalize map)))

(define-minor-mode zhe-mode
  "blah blah"
  nil
  "zhe"
  (let ((map (make-sparse-keymap)))
    (define-key map zhe-mode-prefix-key zhe-mode-override-map)
    map))

Активируйте вспомогательный режим командой zhe-mode. Настройте zhe-mode-key на [(super z)], чтобы сделать то, что вы хотели. У меня нет суперкарты на моей клавиатуре. Наслаждайтесь.

0 голосов
/ 16 декабря 2011

Вы можете взглянуть на определение других клавиатур, например, чешская клавиатура использует = , чтобы вставить акцент на некоторые символы (например, á ), но когда следуетсимвол, который не может быть акцентирован, он печатает их обоих (например, = f).Например, см. Здесь:

http://stuff.mit.edu/afs/athena/astaff/source/src-8.4/third/emacs/leim/quail/czech.el

...