如何在 emacs lisp 中替换光标处的字符

如何在 emacs lisp 中替换光标处的字符

我想创建一个小模式来帮助输入泰语字符。这是我写的:

(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 术语中,进行编辑的位置的“光标”称为观点。这个单词光标保留用于在屏幕上标记点位置的视觉工件。

相关内容