Emacs

如何在emacs lisp中替換游標處的字元

  • July 22, 2014

我想創建一個有助於輸入泰語字元的次要模式。這是我寫的:

(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其次,我不知道如何只替換游標處的字元。

我該如何編寫來實現這種功能?

編輯

按照 Gilles 的建議,我這樣寫:

(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.

(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-\除了原始碼之外,似乎沒有任何英文文件。

¹在 Emacs 術語中,位於進行編輯的位置的“游標”稱為point游標一詞是為螢幕上標記點位置的視覺工件保留的。

引用自:https://unix.stackexchange.com/questions/145516