Ah sì. Isearch legge le chiavi digitate, le cerca isearch-mode-map
e le invoca nel buffer corrente .
Isearch fa non , a dispetto delle apparenze, utilizzare il minibuffer. Utilizza l'area dell'eco. Cioè, quello che vedi in realtà sono messaggi di output , inclusi echi dei caratteri digitati.
Questo dovrebbe fare quello che chiedi:
(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)
(A proposito, la tua domanda dice il delete
personaggio, ma hai scritto DEL
, che è il personaggio backspace.)
Come sottolinea @Malabarba in un commento, quando si imposta la nuova stringa di ricerca su ""
(stringa vuota), si with-isearch-suspended
riprende cercando l'ultima stringa di ricerca, iniziando invece con una stringa di ricerca vuota.
Questa è una " caratteristica " di with-isearch-suspended
, in generale. Ma poiché a volte potresti davvero voler svuotare la stringa di ricerca per riprenderla, nella versione di with-isearch-suspended
in isearch + .el ho aggiunto una variabile isearchp-if-empty-prefer-resuming-with-last
, per controllare questo. Se lo associ a nil
e hai impostato isearch-new-string
su, la ""
ricerca riprende con una stringa di ricerca vuota.
Quindi con Isearch + puoi fare quello che vuoi con questa definizione:
(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 "")))))
Ho notato anche ora che Emacs 24.4 ha introdotto una regressione, che ho archiviato Emacs bug # 20466 per, il che significa che il legame DEL
in isearch-mode-map
non è sufficiente. Hanno aggiunto un'associazione separata per <backspace>
, oltre a una per DEL
. Ciò significa che <backspace>
non viene più tradotto in DEL
, per Isearch (ma in genere viene comunque tradotto per Emacs).
Quindi, se si desidera che il tasto Backspace per fare quello che hai chiesto in Emacs 24.4 o successivo, allora non si può semplicemente legare DEL
a mydelete
. Hai bisogno di legarsi <backspace>
a mydelete
. Dumb, AFAICT, mais on n'arrete pas le progres ...
Ho aggiunto un comando simile a Isearch + e lo ho associato C-M-l
(la stessa chiave utilizzata per rimuovere una mancata corrispondenza del completamento in Icicles ).
C-g
Ricorda anche che in Isearch anche, in caso di mancata corrispondenza, verrà rimosso il testo non corrispondente. (Ma C-g
ha anche un effetto quando la ricerca ha esito positivo.)
Avrei dovuto menzionare che Isearch + ha anche avuto un comportamento facoltativo lungo linee simili per un bel po 'di tempo. M-k
durante Isearch commuta tra 3 comportamenti, che sono controllati dal valore dell'opzione isearchp-drop-mismatch
:
replace-last
- L'input corrente sostituisce l'ultimo testo non corrispondente. Puoi sempre vedere il tuo ultimo input, anche se si tratta di una mancata corrispondenza. Ed è disponibile per la modifica utilizzando M-e
.
nil
- L'input corrente viene aggiunto, anche se l'input precedente ha una parte non corrispondente.
qualsiasi altra cosa: il tuo input corrente viene ignorato (rimosso) se causa una mancata corrispondenza. La stringa di ricerca ha sempre corrispondenze riuscite.