Wie kann man im gesamten Puffer suchen und ersetzen?

17

Suchen und Ersetzen durch M-%und !erfolgt von der aktuellen Position bis zum Ende des Puffers. Wie kann ich es für den gesamten Puffer tun? Vielen Dank.

Tim
quelle
2
Ich schlage vor, den Titel in "Gesamten Puffer suchen und ersetzen" zu ändern. Global könnte sich auch auf ganze Projekte beziehen.
Malabarba
1
Dies ist ein Bereich, in dem Vim / Evil schwer zu schlagen ist::%s/foo/bar
Shosti
@shosti: Eigentlich denke ich, dass Ihre Methode mehr Tastenanschläge erfordert. Sag es einfach ;-)
nispio

Antworten:

14

Ich sehe das nicht unterstützt, während ich deine Ausgangsposition beibehalte. (Ich sehe keine Möglichkeit, an den Anfang des Puffers zu springen, wenn die Suche das Ende erreicht.)

Ihre beste Wette ist M-<es, zum Anfang des Puffers zu springen. query-replaceWenn Sie fertig sind, drücken Sie C-uC-spaceC-uC-space, um zum Startpunkt zurückzukehren.

Jordon Biondo
quelle
1
Dies funktioniert, wenn eingeschaltet transient-mark-modeist. Ansonsten C-SPC C-SPCwird vorübergehend aktivierttransient-mark-mode
nispio
5
Die Markierung muss nicht manuell mit C-SPC gesetzt werden. M- <(und viele andere Befehle, die möglicherweise "einen langen Weg zurücklegen") erledigen dies für Sie.
Mathias Dahl
9

Sie können der emacs-Initialisierungsdatei den folgenden Befehl hinzufügen und ihn an einen Tastendruck Ihrer Wahl binden.

(defun replace-regexp-entire-buffer (pattern replacement)
  "Perform regular-expression replacement throughout buffer."
  (interactive
   (let ((args (query-replace-read-args "Replace" t)))
     (setcdr (cdr args) nil)    ; remove third value returned from query---args
     args))
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward pattern nil t)
      (replace-match replacement))))
Sue D. Nymme
quelle
9

Sie können die folgenden Schritte ausführen:

  • C-x h- Wählen Sie den gesamten Puffer aus oder M-< - Gehen Sie zum oberen Rand des Puffers
  • M-% - Initiieren query-replace
  • ! - Alle erzwingen
  • C-u C-SPC C-u C-SPC - Fahren Sie zurück in Ihre Ausgangsposition
Kaushal Modi
quelle
Dies sollte mehr Aufmerksamkeit bekommen.
Indra
3

Sie können dies zu Ihrer init.elDatei hinzufügen , um das Verhalten von zu aktualisieren M-%und das Wort standardmäßig im gesamten Puffer zu ersetzen:

(defun my/query-replace (from-string to-string &optional delimited start end)
  "Replace some occurrences of FROM-STRING with TO-STRING.  As each match is
found, the user must type a character saying what to do with it. This is a
modified version of the standard `query-replace' function in `replace.el',
This modified version defaults to operating on the entire buffer instead of
working only from POINT to the end of the buffer. For more information, see
the documentation of `query-replace'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           (if (and transient-mark-mode mark-active) " in region" ""))
       nil)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace from-string to-string t nil delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map "%" 'my/query-replace)

Und um dasselbe Verhalten zu erzielen von query-replace-regexp:

(defun my/query-replace-regexp (regexp to-string &optional delimited start end)
  "Replace some things after point matching REGEXP with TO-STRING.  As each
match is found, the user must type a character saying what to do with
it. This is a modified version of the standard `query-replace-regexp'
function in `replace.el', This modified version defaults to operating on the
entire buffer instead of working only from POINT to the end of the
buffer. For more information, see the documentation of `query-replace-regexp'"
  (interactive
   (let ((common
      (query-replace-read-args
       (concat "Query replace"
           (if current-prefix-arg " word" "")
           " regexp"
           (if (and transient-mark-mode mark-active) " in region" ""))
       t)))
     (list (nth 0 common) (nth 1 common) (nth 2 common)
       (if (and transient-mark-mode mark-active)
           (region-beginning)
         (buffer-end -1))
       (if (and transient-mark-mode mark-active)
           (region-end)
         (buffer-end 1)))))
  (perform-replace regexp to-string t t delimited nil nil start end))
;; Replace the default key mapping
(define-key esc-map [?\C-%] 'my/query-replace-regexp)
Nispio
quelle
Sehr hilfreich. Vielen Dank.
NVaughan
2

Wenn Sie Eiszapfen verwenden , können Sie den gesamten Puffer (oder mehrere Puffer, Dateien oder Lesezeichen) durchsuchen und ersetzen .

Und im Gegensatz zu query-replace(zB C-x h M-%):

  • Sie können in beliebiger Reihenfolge durch die Übereinstimmungen navigieren .

  • Ersatz ist auf Anfrage: Sie müssen nicht jedes Spiel besuchen und entscheiden, ob Sie es ersetzen möchten oder nicht.

Drew
quelle
0

Dies ist die Lösung, die ich derzeit verwende. Sie beginnt am Anfang des Puffers und kehrt nach dem Ersetzen zum alten Punkt zurück.

(defun query-replace-from-top ()
  (interactive)
  (let ((orig-point (point)))
    (save-excursion
      (goto-char (point-min))
      (call-interactively 'query-replace))
    (message "Back to old point.")
    (goto-char orig-point)))
(bind-key* "M-%" 'query-replace-from-top)
CodyChan
quelle