Инициирование интерактивного поиска по регулярному выражению программно
Я хотел бы определить команду, которая инициирует isearch-forward-regexp
с предопределенным регулярным выражением.
Скажем, я хочу найти все случаи "aaa" или "bbb". Регулярное выражение, с которым я могу войти в интерактивном режиме isearch-forward-regexp
является \\(aaa\\|bbb\\)
Есть ли способ сделать это, не вводя регулярное выражение в интерактивном режиме? Я пробовал такие вещи:
(defun my-search ()
(interactive)
(isearch-mode t t)
(isearch-yank-string "\\(aaa\\|bbb\\)"))
но этот подход, похоже, не работает, потому что, кажется, нет никакого способа определить строку в Emacs, которая оценивает \\(aaa\\|bbb\\)
когда дернул в isearch
,
Например "\\(aaa"
оценивает (aaa
, но "\\\\(aaa"
оценивает \\\\(aaa
, Кажется, нет способа оценить один обратный слеш.
Есть ли способ делать то, что я хочу?
1 ответ
Эта команда должна делать то, что я думаю, что вы просите:
(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
,
Если вы вызываете его из Lisp, а не в интерактивном режиме, просто предоставьте регулярное выражение в виде строки. Например:
(foo "\\(aaa\\|bbb\\)")
Обратите внимание, что isearch-yank-string
Является ли это:
(if isearch-regexp (setq string (regexp-quote string)))
Вот почему foo
связывает isearch-regexp
в nil
вокруг вызова isearch-yank-string
: чтобы запретить регулярное выражение специальных символов в строке.