Comment rechercher et remplacer dans tout le tampon?
17
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.
Je suggère de changer le titre pour "rechercher et remplacer tout le tampon". Globalement, il pourrait également s'agir de projets entiers.
Malabarba
1
C'est un domaine où Vim / Evil est difficile à battre::%s/foo/bar
shosti
@shosti: En fait, je pense que votre méthode nécessite plus de frappes. Just sayin ';-)
nispio
Réponses:
14
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.
Cela fonctionne quand transient-mark-modeest allumé. Sinon, il C-SPC C-SPCsera temporairement activétransient-mark-mode
nispio
5
Pas besoin de définir la marque manuellement avec C-SPC. M- <(et de nombreuses autres commandes susceptibles de "déplacer le point sur une longue distance") le fait pour vous.
Mathias Dahl du
9
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 l'ajouter à votre init.elfichier 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)
:%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.la source
transient-mark-mode
est allumé. Sinon, ilC-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.
la source
Vous pouvez suivre les étapes suivantes:
C-x h
- Sélectionnez tout le tampon ouM-<
- Allez en haut du tamponM-%
- Lancerquery-replace
!
- Forcer tout remplacerC-u C-SPC C-u C-SPC
- Revenez à votre position de départla source
Vous pouvez l'ajouter à votre
init.el
fichier pour mettre à jour le comportement deM-%
to pour remplacer le mot dans le tampon entier par défaut:Et pour obtenir le même comportement de
query-replace-regexp
:la source
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 exempleC-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.
la source
C'est la solution que j'utilise actuellement, elle commence au début du tampon et reviendra à l'ancien point après le remplacement.
la source