Auswählen (dh als Region) der aktuellen Übereinstimmung bei der inkrementellen Suche

9

Bei der Suche nach einer Zeichenfolge mit C-smöchte ich in der Lage sein, eine Taste zu drücken, um den Suchmodus zu verlassen, aber dennoch die Auswahl der Übereinstimmung beizubehalten. Auf diese Weise kann ich sofort mit der Eingabe beginnen und die letzte Übereinstimmung ersetzen.

Angenommen, ich habe das folgende Dokument:

The quick brown fox jumps over the lazy dog.

Wenn ich nach "faul" suche, wählen Emacs dieses Wort wie folgt aus (eckige Klammern sind Auswahl, Pipe ist Cursor):

The quick brown fox jumps over the [lazy|] dog.

Wenn ich jetzt drücke return, behält emacs meine Cursorposition bei, deaktiviert jedoch "faul":

The quick brown fox jumps over the lazy| dog.

Stattdessen möchte ich eine Verknüpfung, die den Suchmodus beendet, aber die aktuelle Übereinstimmungsauswahl beibehält, wie im zweiten Status oben.

Ben
quelle
Ist das nicht M-x query-replacewas du suchst?
Nsukami _
1
@Nsukami_ Ich weiß nicht immer, wie meine Abfrage aussehen soll oder durch was ich sie ersetzen möchte, bevor ich suche. Es ist viel einfacher, einfach zu drücken C-sund einzugeben, wonach ich suchen möchte, und dann die Abfrage mit Rücktaste auf Null zu ändern, um das zu ändern, was ich ändern möchte. Dann spiele ich mit dem herum, durch was ich es ersetzen möchte. M-%ist zu "formal".
Ben
Die Lösung ist praktisch für mich, wenn ich nach einem Wort suche, um es zu töten, und es dann an einen anderen Ort ziehe. query-replacelöst das nicht.
GergelyPolonkai

Antworten:

7

Hier ist ein Ansatz:

(defun isearch-exit-mark-match ()
  "Exit isearch and mark the current match."
  (interactive)
  (isearch-exit)
  (push-mark isearch-other-end)
  (activate-mark))

(define-key isearch-mode-map (kbd "<C-return>") #'isearch-exit-mark-match)

Dies bindet einen anderen Schlüssel (C-Return), um die aktuelle Suche zu beenden und auch die zuletzt ausgewählte Übereinstimmung zu belassen. Dies funktioniert isearch-forward-regexpauch, was praktisch ist.

Glucas
quelle
1
Ich erhalte "Die Funktionsdefinition des Symbols ist ungültig: Bindeschlüssel." Woher kommt bind-keydas?
Ben
1
Sorry, bind-keykommt aus einer anderen Bibliothek. Ich habe die Antwort geändert, um define-keystattdessen die integrierte Funktion zu verwenden.
Glucas
4

Mit Library Isearch + können Sie dies ganz einfach tun und sogar im laufenden Betrieb ein- und ausschalten.

  • Die Option Nicht-Null isearchp-set-region-flaglegt automatisch die Region (Auswahl) um das letzte Suchziel fest, wenn Sie die Suche beenden.

  • Befehl isearchp-toggle-set-region, gebunden an M-s M-SPCwährend der Suche schaltet die Option um isearchp-set-region-flag.

  • Der Befehl set-region-around-search-targetlegt die Region um das letzte Suchziel manuell fest. (Auch wenn die Option nicht festgelegt ist und Sie keine automatische Auswahl erhalten, können Sie dies manuell tun.)


Mit Library Replace + können Sie dasselbe für query-replaceusw. tun . Dadurch wird die Region um das letzte Ersetzungsereignis herum angeordnet (dh ausgewählt). Es verwendet dieselbe Option, isearchp-set-region-flagum dies zu steuern, und der Befehl set-region-around-search-targethat den gleichen Effekt.

Drew
quelle