覆盖自插入命令或输入解码映射

时间:2011-12-16 10:36:06

标签: emacs elisp

我正在寻找覆盖一堆键绑定的示例,以便我可以按 Sz h 并且打印的实际结果将是“Ж”(这是西里尔语大写字母Zhe) ,但是以 Sz 开头的任何其他序列都会插入“З”(西里尔语资本Ze),并且下一个字符就像它正在以专用模式开始一个新序列一样输入。

到目前为止,我发现了这个:http://www.gnu.org/software/emacs/elisp/html_node/Translation-Keymaps.html(页面的最底部),但我不能让它做任何事情/不能真正理解这个例子试图显示的内容:(

如果你花时间写一个覆盖self-insert-command的简单例子或任何其他方式来完成上述工作,我真的很感激!

编辑: (这是我到目前为止所尝试的)

(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 :(得分:0)

您可以查看其他键盘的定义,例如捷克键盘使用 = 在某些字符上插入重音(例如á),但是在遵循时通过一个无法重音的字符,它可以打印它们(例如= f)。例如,请看这里:

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

答案 1 :(得分:0)

免责声明:我没有在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)]以执行您想要的操作。我的键盘上没有超级映射。享受。