Come cercare e sostituire nell'intero buffer?


17

Cerca e sostituisci, con M-%e !, viene eseguito dalla posizione corrente alla fine del buffer. Come posso farlo per l'intero buffer? Grazie.


2
Suggerisco di cambiare il titolo in "cerca e sostituisci l'intero buffer". A livello globale potrebbe anche riferirsi a interi progetti.
Malabarba,

1
Questa è un'area in cui Vim / Evil è difficile da battere::%s/foo/bar
shosti,

@shosti: In realtà, penso che il tuo metodo richieda più sequenze di tasti.
Dico

Risposte:


14

Non lo vedo supportato pur mantenendo la posizione di partenza. (Non vedo un modo per andare all'inizio del buffer quando la ricerca raggiunge la fine.)

La tua scommessa migliore sta usando M-<per andare all'inizio del buffer, quindi fai query-replace, quando hai finito premi C-uC-spaceC-uC-spaceper tornare al punto di partenza.


1
Funziona quando transient-mark-modeè acceso. Altrimenti C-SPC C-SPCabiliterà temporaneamentetransient-mark-mode
nispio il

5
Non è necessario impostare il segno manualmente con C-SPC. M- <(e molti altri comandi che potenzialmente "spostano il punto molto") lo fanno per te.
Mathias Dahl,

9

È possibile aggiungere il seguente comando al file di inizializzazione di emacs e associarlo alla sequenza di tasti desiderata.

(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))))

9

Puoi seguire i seguenti passi:

  • C-x h- Seleziona l'intero buffer o M-< - Vai all'inizio del buffer
  • M-% - Inizia query-replace
  • ! - Forza sostituire tutto
  • C-u C-SPC C-u C-SPC - Torna alla posizione iniziale

Questo dovrebbe attirare più attenzione.
Indra,

3

È possibile aggiungere questo al init.elfile per aggiornare il comportamento di M-%sostituire la parola nell'intero buffer per impostazione predefinita:

(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)

E per ottenere lo stesso comportamento da 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)

Molto utile. Grazie.
NVaughan,

2

Se usi Icicle , puoi cercare e sostituire l'intero buffer (o più buffer o file o destinazioni dei segnalibri).

E a differenza query-replace(ad es. C-x h M-%):

  • Puoi navigare le partite in qualsiasi ordine .

  • La sostituzione è su richiesta: non è necessario visitare ogni partita e rispondere se sostituirla o meno.


0

Questa è la soluzione che sto attualmente usando, inizia dall'inizio del buffer e tornerà al vecchio punto dopo la sostituzione.

(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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.