is it possible to preprocess the input string before isearch-forward in Emacs

岁酱吖の 提交于 2019-12-11 05:31:48

问题


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:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/16305794/is-it-possible-to-preprocess-the-input-string-before-isearch-forward-in-emacs

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!