![emacs lisp에서 커서의 문자를 바꾸는 방법](https://linux55.com/image/40181/emacs%20lisp%EC%97%90%EC%84%9C%20%EC%BB%A4%EC%84%9C%EC%9D%98%20%EB%AC%B8%EC%9E%90%EB%A5%BC%20%EB%B0%94%EA%BE%B8%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
태국어 문자를 입력하는 데 도움이 되는 작은 모달을 만들고 싶습니다. 이것이 내가 쓴 것입니다:
(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
답변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 용어에서는 편집이 이루어지는 "커서"를 "커서"라고 합니다.보다. 이 단어커서화면에 점 위치를 표시하는 데 사용되는 시각적 아티팩트를 유지합니다.