如何在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
其次,我不知道如何只替換游標處的字元。我該如何編寫來實現這種功能?
編輯
按照 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。游標一詞是為螢幕上標記點位置的視覺工件保留的。