我正在寻找覆盖一堆键绑定的示例,以便我可以按 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我可以得到预期的效果,但代码非常难看:(所以,建议仍然受到欢迎!
答案 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)]
以执行您想要的操作。我的键盘上没有超级映射。享受。