Cerca e sostituisci, con M-%e !, viene eseguito dalla posizione corrente alla fine del buffer. Come posso farlo per l'intero buffer? Grazie.
:%s/foo/bar
Cerca e sostituisci, con M-%e !, viene eseguito dalla posizione corrente alla fine del buffer. Come posso farlo per l'intero buffer? Grazie.
:%s/foo/bar
Risposte:
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.
transient-mark-mode
è acceso. Altrimenti C-SPC C-SPC
abiliterà temporaneamentetransient-mark-mode
È 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))))
Puoi seguire i seguenti passi:
C-x h
- Seleziona l'intero buffer o M-<
- Vai all'inizio del bufferM-%
- Inizia query-replace
!
- Forza sostituire tuttoC-u C-SPC C-u C-SPC
- Torna alla posizione inizialeÈ possibile aggiungere questo al init.el
file 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)
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.
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)