我想在 Emacs 的isearch-forward
函数中有一个钩子,使它在搜索字符串时自动在输入字符之间应用正则表达式。例如,我想将此正则表达式设置为[-=<>]
. 如果我现在输入foobar
isearch,它应该匹配foo<bar
, fo=ob=>ar
,f-o-o-b-a-r
等。
这样的功能是否已经可用?我调查了 ELPA 和 MELPA,但没有成功。万一这不可用,并且由于我的 Elisp 能力非常有限:如何实现?
hexl.el
好的,经过Emacs的检查,我自己找到了解决方案。
这是代码。
(defun my-isearch-function ()
"Make isearch skip characters -=<> while searching."
(if (not isearch-regexp)
(lambda (string &optional bound noerror count)
(funcall
(if isearch-forward
're-search-forward
're-search-backward)
(mapconcat (lambda (c) (regexp-quote (string c))) string
"\\(?:[-=<>]*\\)?")
bound
noerror
count))
(isearch-search-fun-default)))
(defun toggle-my-isearch ()
"Toggle my search mode.
If activated, incremental search skips characters -=<> while
searching.
For example, searching `foobar' matches `foo-bar' or `f-o-o=b<a>r'."
(interactive)
(if (eq isearch-search-fun-function 'isearch-search-fun-default)
(progn
(setq isearch-search-fun-function 'my-isearch-function)
(message "my isearch on"))
(setq isearch-search-fun-function 'isearch-search-fun-default)
(message "my isearch off")))
(global-set-key (kbd "s-s") 'toggle-my-isearch)
我写了一个名为 的包flex-isearch
,它基本上在搜索字符串的每个字符之间插入“.*”(它比这更复杂一些)并切换到正则表达式搜索。当 isearch 失败时,它会自动执行此操作。