Ah oui. Isearch lit les clés que vous tapez, les recherche isearch-mode-map
et les appelle dans le tampon actuel .
Isearch n'utilise pas , malgré les apparences, le mini-tampon . Il utilise la zone d'écho. Autrement dit, ce que vous voyez là est en fait des messages de sortie , y compris des échos des caractères que vous tapez.
Cela devrait faire ce que vous demandez:
(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, votre question dit le delete
caractère, mais vous avez écrit DEL
, qui est le caractère de retour arrière.)
Comme @Malabarba le fait remarquer dans un commentaire, lorsque vous définissez la nouvelle chaîne de recherche sur ""
(chaîne vide), with-isearch-suspended
reprend en recherchant la dernière chaîne de recherche, en commençant plutôt par une chaîne de recherche vide.
C'est une " caractéristique " de with-isearch-suspended
, en général. Mais parce que vous voudrez parfois vraiment vider la chaîne de recherche pour la reprise, dans la version de with-isearch-suspended
dans isearch + .el, j'ai ajouté une variable isearchp-if-empty-prefer-resuming-with-last
, pour contrôler cela. Si vous liez cela à nil
et que vous définissez isearch-new-string
sur, la ""
recherche reprend avec une chaîne de recherche vide.
Donc avec Isearch + vous pouvez faire ce que vous voulez avec cette définition:
(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 "")))))
Je remarque aussi maintenant que Emacs 24.4 introduit une régression, que j'ai déposé bug Emacs # 20466 pour, ce qui signifie que la liaison DEL
en isearch-mode-map
ne suffit pas. Ils ont ajouté une liaison distincte pour <backspace>
, en plus d'une pour DEL
. Cela signifie que <backspace>
n'est plus traduit en DEL
, pour Isearch (mais il est toujours aussi traduit pour Emacs en général).
Donc, si vous voulez que la touche Retour arrière fasse ce que vous avez demandé dans Emacs 24.4 ou version ultérieure, vous ne pouvez pas simplement vous lier DEL
à mydelete
. Vous devez vous lier <backspace>
à mydelete
. Dumb, AFAICT, mais on n'arrete pas le progres ...
J'ai ajouté une commande similaire à Isearch + et je l'ai liée à C-M-l
(la même clé utilisée pour supprimer un décalage d'achèvement dans Icicles ).
Sachez également que C-g
dans Isearch, en cas de non-concordance, supprimera également le texte non-concordant. (Mais a C-g
également un effet lorsque la recherche est réussie.)
J'aurais dû mentionner que Isearch + a également eu un comportement facultatif dans le même sens depuis un bon moment maintenant. M-k
pendant Isearch bascule entre 3 comportements, qui sont contrôlés par la valeur de l'option isearchp-drop-mismatch
:
replace-last
- Votre entrée actuelle remplace le dernier texte incompatible. Vous pouvez toujours voir votre dernière entrée, même s'il s'agit d'un décalage. Et il est disponible pour l'édition en utilisant M-e
.
nil
- Votre entrée actuelle est ajoutée, même si l'entrée précédente a une partie non appariée.
toute autre chose - Votre entrée actuelle est ignorée (supprimée) si elle provoque une incompatibilité. La chaîne de recherche a toujours des correspondances réussies.