
タイ語の文字を入力するのに役立つ小さなモーダルを作成したいと思います。これが私が書いたものです:
(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-\
)を使用して、2つのタイ語入力方法のいずれかを選択できます。とは別にソースコード。
1Emacs用語では、編集が行われる「カーソル」を「カーソル」と呼びます。より。この言葉カーソル画面上の点の位置を表示するために使用される視覚的アーティファクトを維持します。