Emacs で「真に」インタラクティブなコマンドを使用するにはどうすればよいでしょうか?

Emacs で「真に」インタラクティブなコマンドを使用するにはどうすればよいでしょうか?

どのように実装するか最低限のisearchキーが押されるたびに「再評価」する関数ですか? キーが押されるという意味は大まかですが、やその仲間の動作をエミュレートしたいと考えています。

私はこれを使用して、バッファの縮小と同様のものを使用して、開いている nxml モード バッファに対して XPath 式を対話的にテストします。ただし、この質問の目的としては、messageミニバッファにあるものを呼び出す関数だけでも十分です。

答え1

目的に応じて、 をチートして使用できますisearch-mode。3 番目の引数 ( OP-FUN) は、各入力が処理された後に呼び出される関数であり、5 番目の引数 ( WORD) は、isearch に入力された文字列をバッファー内で検索する正規表現に変換する任意の関数にすることができます。

例:

(defun my-op-fun (string &optional lax)
  (let ((words (split-string string ":")))
    (mapconcat '(lambda (word) 
                  (concat "\\<" (regexp-quote word)))
               words "\\>.*")))

(defun my-isearch-beggining-of-line ()
  (interactive)
  (isearch-mode t t nil t 'my-op-fun))

「foo」と入力すると、「foo」で始まる単語が検索され、「foo:bar」と入力すると、「foo」という単語の後に他の文字が続き、単語の先頭として「bar」が検索されます。

これを機能させるには、正規表現の熟練度が必要になるかもしれません。

isearch のソースを見て、それがどのように行われるかを確認することもできます。

関連情報