O tak. Isearch odczytuje wpisane klucze, przegląda je isearch-mode-map
i 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 delete
znaku, 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-suspended
wznawia 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-suspended
w isearch + .el dodałem zmienną isearchp-if-empty-prefer-resuming-with-last
, aby to kontrolować. Jeśli to powiążesz nil
i ustawisz isearch-new-string
na, ""
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 DEL
się isearch-mode-map
nie 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ę DEL
z 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-g
w Isearch również w przypadku niedopasowania usunie niedopasowany tekst. (Ale C-g
działa również, gdy wyszukiwanie się powiedzie.)
Powinienem wspomnieć, że Isearch + już od dłuższego czasu zachowuje się opcjonalnie podobnie. M-k
podczas 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.
isearch+.el
. To (a) naprawia automatyczne usuwanie niezgodności, dzięki czemu zawijanie działa OK. I dodaje opcję,isearchp-ring-bell-function
której można użyć, aby stłumić dzwonek podczas wyszukiwania.isearch-del-char
i odpowiedź Drew, ale wydaje się, że działa zgodnie z przeznaczeniem.with-isearch-suspended
Makro był winowajcą.