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.

StackExchange pour tous
la source
2
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.

Jordon Biondo
la source
1
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))))
Sue D. Nymme
la source
9

Vous pouvez suivre les étapes suivantes:

  • C-x h- Sélectionnez tout le tampon ou M-< - Allez en haut du tampon
  • M-% - Lancer query-replace
  • ! - Forcer tout remplacer
  • C-u C-SPC C-u C-SPC - Revenez à votre position de départ
Kaushal Modi
la source
Cela devrait attirer davantage l'attention.
Indra
3

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)
nispio
la source
Très utile. Merci.
NVaughan
2

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.

A dessiné
la source
0

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)
CodyChan
la source