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