Ah ja. Isearch liest die von Ihnen eingegebenen Schlüssel, schlägt sie nach isearch-mode-map
und 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 delete
Zeichen, 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-suspended
Suche nach der letzten Suchzeichenfolge fortgesetzt , anstatt mit einer leeren Suchzeichenfolge zu beginnen.
Dies ist ein " Merkmal " von with-isearch-suspended
im Allgemeinen. Aber weil Sie manchmal wirklich die Suchzeichenfolge für die Wiederaufnahme leeren möchten, habe ich in der Version von with-isearch-suspended
in isearch + .el eine Variable hinzugefügt isearchp-if-empty-prefer-resuming-with-last
, um dies zu steuern. Wenn Sie dies binden nil
und 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 DEL
in isearch-mode-map
nicht 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 DEL
wird (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 DEL
zu 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-g
Beachten Sie auch, dass in Isearch bei Nichtübereinstimmung auch der nicht übereinstimmende Text entfernt wird. (Wirkt sich aber C-g
auch bei erfolgreicher Suche aus.)
Ich hätte erwähnen sollen, dass Isearch + seit einiger Zeit auch ein optionales Verhalten in ähnlicher Richtung aufweist. M-k
Wä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.