Ah ja. Isearch liest die von Ihnen eingegebenen Schlüssel, schlägt sie nach isearch-mode-mapund ruft sie im aktuellen Puffer auf .
Isearch tut nicht , trotz der Erscheinungen, verwenden Sie den Minipuffer. Es verwendet den Echo-Bereich. Das heißt, was Sie dort sehen, sind tatsächlich ausgegebene Nachrichten, einschließlich Echos der von Ihnen eingegebenen Zeichen.
Dies sollte tun, was Sie fragen:
(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)
(Übrigens, Ihre Frage sagt das deleteZeichen, aber Sie haben geschrieben DEL, welches das Rücktastezeichen ist.)
Wie @Malabarba in einem Kommentar hervorhebt, wird beim Setzen der neuen Suchzeichenfolge auf ""(leere Zeichenfolge) die with-isearch-suspendedSuche nach der letzten Suchzeichenfolge fortgesetzt , anstatt mit einer leeren Suchzeichenfolge zu beginnen.
Dies ist ein " Merkmal " von with-isearch-suspendedim Allgemeinen. Aber weil Sie manchmal wirklich die Suchzeichenfolge für die Wiederaufnahme leeren möchten, habe ich in der Version von with-isearch-suspendedin isearch + .el eine Variable hinzugefügt isearchp-if-empty-prefer-resuming-with-last, um dies zu steuern. Wenn Sie dies binden nilund festlegen isearch-new-string, ""wird die Suche mit einer leeren Suchzeichenfolge fortgesetzt.
Mit Isearch + können Sie also mit dieser Definition tun, was Sie wollen:
(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 "")))))
Ich stelle fest , auch jetzt , dass Emacs 24.4 eine Regression eingeführt, die ich eingereicht habe Emacs Bug # 20466 für, was bedeutet , dass die Bindung DELin isearch-mode-mapnicht ausreichend. Sie fügten <backspace>zusätzlich zu einer für eine separate Bindung für hinzu DEL. Das bedeutet, dass für Isearch <backspace>nicht mehr übersetzt DELwird (aber für Emacs wird es im Allgemeinen immer noch so übersetzt).
Also , wenn Sie die Rücktaste tun wollen , was Sie in Emacs gefragt 24.4 oder später , dann können Sie nicht nur binden DELzu mydelete. Sie müssen sich binden <backspace>zu mydelete. Dumm, AFAICT, mais auf n'arrete pas le Progres ...
Ich habe Isearch + einen ähnlichen Befehl hinzugefügt und an ihn gebunden C-M-l(denselben Schlüssel, mit dem eine Nichtübereinstimmung der Fertigstellung in Eiszapfen entfernt wurde ).
C-gBeachten Sie auch, dass in Isearch bei Nichtübereinstimmung auch der nicht übereinstimmende Text entfernt wird. (Wirkt sich aber C-gauch bei erfolgreicher Suche aus.)
Ich hätte erwähnen sollen, dass Isearch + seit einiger Zeit auch ein optionales Verhalten in ähnlicher Richtung aufweist. M-kWährend der Suche wird zwischen drei Verhaltensweisen umgeschaltet, die durch den Wert der Option gesteuert werden isearchp-drop-mismatch:
replace-last- Ihre aktuelle Eingabe ersetzt den letzten nicht übereinstimmenden Text. Sie können Ihre letzte Eingabe immer sehen, auch wenn es sich um eine Nichtübereinstimmung handelt. Und es steht zur Bearbeitung mit zur Verfügung M-e.
nil - Ihre aktuelle Eingabe wird angehängt, auch wenn die vorherige Eingabe nicht übereinstimmt.
alles andere - Ihre aktuelle Eingabe wird ignoriert (entfernt), wenn sie zu einer Nichtübereinstimmung führt. Die Suchzeichenfolge hat immer erfolgreiche Übereinstimmungen.