La recherche et le remplacement, par M-%et !, se fait de la position actuelle à la fin du tampon. Comment puis-je le faire pour l'ensemble du tampon? Merci.
:%s/foo/bar
La recherche et le remplacement, par M-%et !, se fait de la position actuelle à la fin du tampon. Comment puis-je le faire pour l'ensemble du tampon? Merci.
:%s/foo/bar
Réponses:
Je ne vois pas cela soutenu tout en conservant votre position de départ. (Je ne vois pas de moyen de revenir au début du tampon lorsque la recherche arrive à sa fin.)
Votre meilleur pari est d'utiliser M-<pour aller au début du tampon, puis faites le query-replace
, lorsque vous avez terminé, appuyez sur C-uC-spaceC-uC-spacepour revenir à votre point de départ.
transient-mark-mode
est allumé. Sinon, il C-SPC C-SPC
sera temporairement activétransient-mark-mode
Vous pouvez ajouter la commande suivante à votre fichier d'initialisation emacs et la lier à la frappe de votre choix.
(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))))
Vous pouvez suivre les étapes suivantes:
C-x h
- Sélectionnez tout le tampon ou M-<
- Allez en haut du tamponM-%
- Lancer query-replace
!
- Forcer tout remplacerC-u C-SPC C-u C-SPC
- Revenez à votre position de départVous pouvez l'ajouter à votre init.el
fichier pour mettre à jour le comportement de M-%
to pour remplacer le mot dans le tampon entier par défaut:
(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)
Et pour obtenir le même comportement de 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)
Si vous utilisez Icicles, vous pouvez rechercher et remplacer l'ensemble du tampon (ou plusieurs tampons ou fichiers ou cibles de signets).
Et contrairement query-replace
(par exemple C-x h M-%
):
Vous pouvez parcourir les matchs dans n'importe quel ordre .
Le remplacement est à la demande: vous n'avez pas besoin de visiter chaque match et de répondre s'il faut ou non le remplacer.
C'est la solution que j'utilise actuellement, elle commence au début du tampon et reviendra à l'ancien point après le remplacement.
(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)