2017-10-27 18 views
1

定義済みの正規表現を使用して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を入力

答えて

1

このコマンドは、私はあなたが求めていると思う何をすべき。

インタラクティブではなくLispから呼び出す場合は、必要な正規表現を文字列として入力してください。たとえば、次のように文字列の正規表現の特殊文字を引用防ぐために:fooisearch-yank-stringへの呼び出しの周りnilisearch-regexpをバインドする理由です

(if isearch-regexp (setq string (regexp-quote string))) 

isearch-yank-stringがこれを行うこと

(foo "\\(aaa\\|bbb\\)") 

注意。

+0

それは私のために働いていないようです。私が実行すると(foo "\\\(aaa \\ | bbb \\\)")、regexpの意味ではなく、正規表現の文字列を検索します。たとえば、 "aaa"は一致しませんが、関数のコードに現れるregexp文字列は一致します。あなたのemacsで動作しますか? –

+0

はい、私のEmacsでは正常に動作します - すべてのEmacsがEmacs 20からリリースし、最新のEmacs 26.1をテストします。 'isearch-regexp'のlet-bindingを必ず含めてください。そうしないと、あなたが記述したものになります。それは 'isearch-yank-string'が正規表現の検索をしていると思うならば、正規表現の特殊文字を引用符で囲むからです。 'emacs -Q'(初期化ファイルなし)を使ってテストしてください。一度起動すると、検索を繰り返すのに 'C-s'を使う必要があります。 – Drew

+0

わかりやすく、私は.emacsを読み込んでいても、emacsを再起動した後に動作を開始しました。おそらく、私は誤ってその機能に手を加えながら、独特の状態になってしまいました。ありがとう。 –