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-list2thai-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-methodC-x RET C-\)を使用して、2つのタイ語入力方法のいずれかを選択できます。とは別にソースコード

1Emacs用語では、編集が行われる「カーソル」を「カーソル」と呼びます。より。この言葉カーソル画面上の点の位置を表示するために使用される視覚的アーティファクトを維持します。

おすすめ記事