Инициирование интерактивного поиска по регулярному выражению программно

Я хотел бы определить команду, которая инициирует 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: чтобы запретить регулярное выражение специальных символов в строке.

Другие вопросы по тегам