是的。Isearch会读取您键入的键,在其中查找它们isearch-mode-map
,然后在当前缓冲区中调用它们。
尽管有外观,但Isearch 并未使用minibuffer。它使用回声区域。也就是说,您看到的实际上是输出消息,包括您键入的字符的回声。
这应该按照您的要求进行:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string ""))))
(define-key isearch-mode-map (kbd "DEL") 'mydelete)
(顺便说一句,您的问题是delete
字符,但您写了DEL
,这是退格字符。)
正如@Malabarba在注释中指出的那样,当您将新的搜索字符串设置为""
(空字符串)时,with-isearch-suspended
将通过搜索最后一个搜索字符串来恢复,而不是从一个空的搜索字符串开始。
通常,这是的“ 功能 ” with-isearch-suspended
。但是因为有时您可能真的想清空搜索字符串以恢复,所以with-isearch-suspended
在isearch + .el的版本中,我添加了variable isearchp-if-empty-prefer-resuming-with-last
来控制它。如果将其绑定到nil
并且设置isearch-new-string
为,""
则搜索将以空的搜索字符串继续。
因此,使用Isearch +,您可以使用以下定义执行所需的操作:
(defun mydelete ()
"Delete the failed portion of the search string, or the last char if successful."
(interactive)
(let ((isearchp-if-empty-prefer-resuming-with-last nil))
(with-isearch-suspended
(setq isearch-new-string
(substring
isearch-string 0 (or (isearch-fail-pos) (1- (length isearch-string))))
isearch-new-message
(mapconcat 'isearch-text-char-description isearch-new-string "")))))
我也注意到现在的Emacs 24.4引入了回归,我已经提交的Emacs的bug#20466对,这意味着绑定DEL
在isearch-mode-map
是不够的。他们增加了一个单独的结合<backspace>
,除了一个DEL
。也就是说,对于Isearch,<backspace>
不再将其翻译为DEL
,(但对于Emacs来说,仍然确实如此)。
因此,如果您希望Backspace键执行您在Emacs 24.4或更高版本中所要求的操作,则不能仅绑定DEL
到mydelete
。您需要绑定<backspace>
到mydelete
。哑巴,AFAICT,n'arrete pas le progres上的舞者 ...
我已经添加了一个类似的命令,以ISEARCH +和它绑定到C-M-l
(用于去除在完成失配相同的密钥冰柱)。
C-g
还要注意的是,在Isearch中,如果存在不匹配的情况,也将删除不匹配的文本。(但C-g
在搜索成功时也会起作用。)
我应该提到,Isearch +在相当长的一段时间内也具有类似行为的可选行为。M-k
在Isearch期间,在3个行为之间切换,这些行为由option的值控制isearchp-drop-mismatch
:
replace-last
-您当前的输入将替换最后一个不匹配的文本。即使输入不匹配,您也始终可以看到您的最后输入。并且可以使用进行编辑M-e
。
nil
-即使先前输入的部分不匹配,也会附加当前的输入。
其他-您当前输入的内容如果不匹配,将被忽略(删除)。搜索字符串始终具有成功的匹配项。