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둘째, 커서 위치의 문자만 바꾸는 방법을 모르겠습니다.

이 기능을 구현하려면 어떻게 작성해야 합니까?

편집하다

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​​2thai-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-\)를 사용하여 두 가지 태국어 입력 방법 중 하나를 선택할 수 있습니다 . 와는 별개로소스 코드.

1Emacs 용어에서는 편집이 이루어지는 "커서"를 "커서"라고 합니다.보다. 이 단어커서화면에 점 위치를 표시하는 데 사용되는 시각적 아티팩트를 유지합니다.

관련 정보