Можно ли предварительно обработать входную строку перед isearch-forward в Emacs?

Например, если я наберу "foo spam"после подсказки isearch-forwardКак я могу посоветовать некоторые функции в isearch.el преобразовать строку в "foo[.?:,!]?[ \n]spam"перед поиском? В основном я хочу найти два смежных слова в тексте. Я знаю, что могу использовать isearch-forward-regexp чтобы сделать это, но это болезненно и подвержено ошибкам набирать регулярное выражение непосредственно, и у меня есть много строк такого рода для поиска. Я пытался понять код в isearch.el но не удалось. надеюсь, что некоторые гуру Emacs могут помочь мне. Благодарю.

2 ответа

Решение

Вот грубая трещина в этом:

(defun isearch-transform-string ()
  (interactive)
  (let* ((string (replace-regexp-in-string
                  "foo" "bar" isearch-string)))
    (setq isearch-string string
          isearch-message (mapconcat 'isearch-text-char-description string ""))
    (isearch-search-and-update)))

(define-key isearch-mode-map (kbd "C-c C-t") 'isearch-transform-string)

Я думаю, что вы должны связать его с ключом в isearch-mode-map; Я не думаю, что Mx работает правильно isearch-mode,

Если вам требуется больше энергии, есть переменная isearch-search-fun-function, который вы можете установить на функцию, которая возвращает функцию. Возвращенная функция используется для поиска следующего соответствия.

Вы можете быть заинтересованы в isearch-toggle-word (Ms w) во время вашего дополнительного поиска.

http://www.gnu.org/software/emacs/manual/html_node/emacs/Word-Search.html

Это будет искать отдельные слова, игнорируя знаки препинания, пробелы и концы строк.

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