我想创建一个小模式来帮助输入泰语字符。这是我写的:
(defvar thai-input-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "2" (lambda () (interactive)
(replace-string "o" "ô")
))
map)
"Keymap used by `thai-input-mode'.")
(easy-mmode-define-minor-mode thai-input-mode
"Input mode for Thai"
nil " TH" thai-input-mode-map)
(global-set-key "\C-x\C-t" 'thai-input-mode)
当然,我必须实施更多细节,但我已经遇到了问题。首先,即使缓冲区中replace-string
有,该函数也不起作用。o
其次,我不知道如何仅替换光标处的字符。
我该如何编写来实现这种功能呢?
编辑
按照吉尔斯的建议,我这样写:
(defvar thai-tone-conversion-list
'(("o" . "ô") ("u" . "û")))
(defun thai-add-tone ()
(interactive "*")
(when (let ((case-fold-search t))
(looking-back "[ou]"))
(replace-match (assoc (match-string 0) (thai-tone-conversion-list)))))
(defvar thai-input-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "2" 'thai-add-tone)
map)
"Keymap used by `thai-input-mode'.")
(easy-mmode-define-minor-mode thai-input-mode
"Input mode for Thai"
nil " TH" thai-input-mode-map)
(global-set-key "\C-x\C-t" 'thai-input-mode)
但是assoc: Symbol's function definition is void: thai-tone-conversion-list
当我2
输入thai-input-mode
.
答案1
(replace-string "o" "ô")
替换光标之后的下一个出现的位置o
,除非在瞬态标记模式下使用活动标记,在这种情况下,它将替换标记区域中的第一个出现位置。
这可以替换光标后的字符,但当然,如果不是,o
那么它可以进一步替换字符。您可以使用 START 和 END 参数来replace-string
限制替换的范围,但这不会扩展。使用char-after
检索光标后的字符,以及char-before
检索光标之前的字符。该函数看起来应该在输入 an 后使用o
,所以我认为char-before
这就是您正在寻找的。
(require 'cl)
(defun thai-add-tone ()
(interactive "*")
(case (char-before)
((?o)
(delete-backward-char 1)
(insert "ô"))
((?u)
(delete-backward-char 1)
(insert "û"))))
另一种方法是进行测试(或一系列测试)looking-at
(对于从光标开始的文本)或looking-back
(对于以光标结尾的文本)。然后你可以打电话replace-match
替换文本;这允许一些自动化,例如 Emacs 可以负责用小写字母替换小写字母,用大写字母替换大写字母。
(defvar thai-tone-conversion-list
'(("o" . "ô") ("u" . "û")))
(defun thai-add-tone ()
(interactive "*")
(when (let ((case-fold-search t))
(looking-back "[ou]"))
(replace-match (cdr (assoc (match-string 0) thai-tone-conversion-list)))))
请注意,Emacs 已经支持泰语,在此基础上进行开发可能比重新发明轮子更容易。您可以使用set-input-method
( C-x RET C-\
) 选择两种泰语输入法之一。除了源代码。
1在 Emacs 术语中,进行编辑的位置的“光标”称为观点。这个单词光标保留用于在屏幕上标记点位置的视觉工件。