For example, if I type "foo spam
" after the prompt of isearch-forward
, how can I advice some functions in isearch.el
to convert the string to "foo[.?:,!]?[ \n]spam
" before search? Basically I want to search for the two adjacent words in the text. I know I can use isearch-forward-regexp
to do that, but it's painful and error-prone to type out the regexp directly and I have many strings of that kind to search. I tried to understand code in isearch.el
but failed. hope some Emacs gurus could help me out. Thanks.
1
votes
2 Answers
4
votes
You may be interested in isearch-toggle-word
(M-s w) during your incremental search.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Word-Search.html
This will search for individual words ignoring punctuation, spaces and line ends.
1
votes
Here's a rough crack at it:
(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)
I think you have to bind it to a key in isearch-mode-map
; I don't think M-x works quite right in isearch-mode
.
If you require more power, there is a variable isearch-search-fun-function
, which you can set to a function that returns a function. The returned function is used to find the next match.