is it possible to preprocess the input string befo

2019-07-31 23:55发布

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.

标签: emacs elisp
2条回答
Luminary・发光体
2楼-- · 2019-08-01 00:40

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.

查看更多
在下西门庆
3楼-- · 2019-08-01 00:42

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.

查看更多
登录 后发表回答