Ага так. 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-suspendedin 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>більше не перекладається на DELIsearch (але він все ще так перекладається для Emacs).
Так що якщо ви хочете, щоб клавіша Backspace , щоб робити те , що ви просили в Emacs 24.4 або більш пізньої версії , то ви не можете просто зв'язати DELз mydelete. Ви повинні зв'язати <backspace>з mydelete. Тупий, АФАКТИЧНИЙ, маїс на Наррет-па-про-прогресі ...
Я додав подібну команду до Isearch + і зв'язав її C-M-l(той самий ключ, який використовується для видалення невідповідності завершення в Icicles ).
Також пам’ятайте, що C-gв Isearch також буде видалено невідповідний текст у випадку невідповідності. (Але це C-gтакож впливає на успішний пошук.)
Я мав би зазначити, що Isearch + вже досить довго мав необов'язкову поведінку у подібних напрямках. M-kпід час Isearch перемикається серед 3 поведінок, які контролюються значенням параметра isearchp-drop-mismatch:
replace-last- Ваш поточний текст замінює останній невідповідний текст. Ви завжди можете бачити свій останній внесок, навіть якщо це невідповідність. І він доступний для редагування за допомогою M-e.
nil - Ваш поточний вхід додається, навіть якщо попередній вхід має невідповідну частину.
що-небудь інше - Ваш поточний вклад ігнорується (видаляється), якщо він викликає невідповідність. У рядку пошуку завжди є збіги.