O tak. Isearch odczytuje wpisane klucze, przegląda je isearch-mode-mapi wywołuje w bieżącym buforze .
Isearch czy nie , wbrew pozorom, użyj minibufor. Wykorzystuje obszar echa. Oznacza to, że to, co widzisz, to w rzeczywistości komunikaty wyjściowe , w tym echa wpisywanych znaków.
To powinno zrobić to, o co prosisz:
(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)
(BTW, twoje pytanie mówi o deleteznaku, ale napisałeś DEL, który jest znakiem cofania).
Jak wskazuje @Malabarba w komentarzu, po ustawieniu nowego ciągu wyszukiwania na ""(pusty ciąg), with-isearch-suspendedwznawia się, szukając ostatniego ciągu, zamiast zaczynać go.
Jest to ogólnie „ cecha ” with-isearch-suspended. Ale ponieważ czasami możesz naprawdę chcieć opróżnić szukany ciąg znaków do wznowienia, w wersji with-isearch-suspendedw isearch + .el dodałem zmienną isearchp-if-empty-prefer-resuming-with-last, aby to kontrolować. Jeśli to powiążesz nili ustawisz isearch-new-stringna, ""wyszukiwanie zostanie wznowione z pustym ciągiem wyszukiwania.
Dzięki Isearch + możesz robić, co chcesz dzięki tej definicji:
(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 "")))))
Zauważyłem też, że teraz Emacs 24.4 wprowadzono regresji, co mam złożone Emacs Bug # 20466 do, co oznacza, że wiązanie DELsię isearch-mode-mapnie jest wystarczające. Dodali osobne powiązanie dla <backspace>, oprócz jednego dla DEL. Oznacza to, że <backspace>nie zostanie przetłumaczony na DEL, na iSearch (ale to wciąż nie tak przetłumaczone na Emacsa ogólnie).
Jeśli więc chcesz, aby klawisz Backspace zrobił to, o co prosiłeś w Emacsie 24.4 lub nowszym, nie możesz po prostu się DELz nim powiązać mydelete. Trzeba związać <backspace>się mydelete. Dumb, AFAICT, mais on n'arrete pas le progres ...
Dodałem podobne polecenie do Isearch + i powiązałem je z C-M-l(ten sam klucz, który został użyty do usunięcia niedopasowania ukończenia w Icicles ).
Pamiętaj też, że C-gw Isearch również w przypadku niedopasowania usunie niedopasowany tekst. (Ale C-gdziała również, gdy wyszukiwanie się powiedzie.)
Powinienem wspomnieć, że Isearch + już od dłuższego czasu zachowuje się opcjonalnie podobnie. M-kpodczas Isearch przełącza między 3 zachowaniami, które są kontrolowane przez wartość opcji isearchp-drop-mismatch:
replace-last- Bieżące dane wejściowe zastępują ostatni niedopasowany tekst. Zawsze możesz zobaczyć swoje ostatnie wejście, nawet jeśli jest to niezgodność. I jest dostępny do edycji za pomocą M-e.
nil - Bieżące wejście jest dołączane, nawet jeśli poprzednie wejście ma niedopasowaną część.
cokolwiek innego - Bieżące dane wejściowe są ignorowane (usuwane), jeśli powodują niezgodność. Wyszukiwany ciąg zawsze ma udane dopasowania.