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