О да. Isearch считывает введенные вами ключи, просматривает их isearch-mode-map
и вызывает их в текущем буфере .
ISearch делает не , несмотря на выступления, используйте минибуфер. Он использует область эха. То есть то, что вы видите, на самом деле выводит сообщения, включая отголоски введенных вами символов.
Это должно сделать то, что вы просите:
(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 я добавил переменную 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 # 20466 , что означает, что привязки DEL
в ней isearch-mode-map
недостаточно. Они добавили отдельную привязку для <backspace>
, в дополнение к одной для DEL
. Это означает, что <backspace>
больше не переводится DEL
для Isearch (но все равно переводится для Emacs в целом).
Поэтому, если вы хотите, чтобы клавиша Backspace выполняла то, что вы просили в Emacs 24.4 или новее, вы не можете просто DEL
выполнить привязку mydelete
. Вам нужно привязать <backspace>
к mydelete
. Тупой, AFAICT, mais on n'arrete pas le progres ...
Я добавил аналогичную команду в Isearch + и привязал ее к C-M-l
(тот же ключ, который использовался для удаления несоответствия завершения в Icicles ).
Помните также, что C-g
в Isearch также, при наличии несоответствия, удалит несоответствующий текст. (Но C-g
также имеет эффект при успешном поиске.)
Я должен был упомянуть, что Isearch + также имел необязательное поведение в том же духе уже довольно давно. M-k
во время Isearch переключается между 3 поведениями, которые контролируются значением option isearchp-drop-mismatch
:
replace-last
- Ваш текущий ввод заменяет последний несоответствующий текст. Вы всегда можете увидеть свой последний ввод, даже если это несоответствие. И это доступно для редактирования с помощью M-e
.
nil
- Ваш текущий ввод добавляется, даже если предыдущий ввод содержит несоответствующую часть.
что-нибудь еще - ваш текущий ввод игнорируется (удаляется), если он вызывает несоответствие. Строка поиска всегда имеет успешные совпадения.
isearch+.el
. Он (а) исправляет автоматическое удаление несоответствия, так что перенос работает нормально. И добавляет опцию,isearchp-ring-bell-function
которую вы можете использовать для подавления звонка во время поиска.isearch-del-char
и ответа Дрю, но, похоже, он работает как задумано.with-isearch-suspended
Макрос был виновником.