定義済みの正規表現を使用してisearch-forward-regexp
を開始するコマンドを定義したいとします。プログラムによる対話式正規表現検索の開始
「aaa」または「bbb」のすべての出現を検索したいとします。私がisearch-forward-regexp
と対話的に入力できる正規表現は、\\(aaa\\|bbb\\)
です。対話的にregexpを入力しないと、これを行う方法はありますか?私はこのようなものを試してみた:
(defun my-search()
(interactive)
(isearch-mode t t)
(isearch-yank-string "\\(aaa\\|bbb\\)"))
しかしisearch
にヤンクとき\\(aaa\\|bbb\\)
に評価emacsの中の文字列を定義するためにどのような方法があるようには思えないので、このアプローチは動作するようには思えません。
たとえば、は、(aaa
と評価されますが、"\\\\(aaa"
は、\\\\(aaa
と評価されます。単一のバックスラッシュを評価する方法はないようです。
私がしたいことをする方法はありますか?例えば
(defun foo (regexp)
(interactive (list (read-regexp "Regexp: ")))
(isearch-mode t t)
(let ((isearch-regexp nil))
(isearch-yank-string regexp)))
:M-x foo RET
、その後、\(aaa\|bbb\) RET
を入力
それは私のために働いていないようです。私が実行すると(foo "\\\(aaa \\ | bbb \\\)")、regexpの意味ではなく、正規表現の文字列を検索します。たとえば、 "aaa"は一致しませんが、関数のコードに現れるregexp文字列は一致します。あなたのemacsで動作しますか? –
はい、私のEmacsでは正常に動作します - すべてのEmacsがEmacs 20からリリースし、最新のEmacs 26.1をテストします。 'isearch-regexp'のlet-bindingを必ず含めてください。そうしないと、あなたが記述したものになります。それは 'isearch-yank-string'が正規表現の検索をしていると思うならば、正規表現の特殊文字を引用符で囲むからです。 'emacs -Q'(初期化ファイルなし)を使ってテストしてください。一度起動すると、検索を繰り返すのに 'C-s'を使う必要があります。 – Drew
わかりやすく、私は.emacsを読み込んでいても、emacsを再起動した後に動作を開始しました。おそらく、私は誤ってその機能に手を加えながら、独特の状態になってしまいました。ありがとう。 –