Bagaimana cara mencari dan mengganti di seluruh buffer?


17

Mencari dan mengganti, oleh M-%dan !, dilakukan dari posisi saat ini sampai akhir buffer. Bagaimana saya bisa melakukannya untuk seluruh buffer? Terima kasih.


2
Saya sarankan mengubah judul menjadi "cari dan ganti seluruh buffer". Secara global juga bisa merujuk ke seluruh proyek.
Malabarba

1
Ini adalah salah satu area di mana Vim / Evil sulit dikalahkan::%s/foo/bar
shosti

@shosti: Sebenarnya, saya pikir metode Anda memerlukan lebih banyak penekanan tombol. Katakan saja ;-)
nispio

Jawaban:


14

Saya tidak melihat itu didukung sementara masih mempertahankan posisi awal Anda. (Saya tidak melihat cara untuk membungkus ke awal buffer ketika pencarian mencapai akhir.)

Taruhan terbaik Anda adalah menggunakan M-<untuk pergi ke awal buffer, lalu lakukan query-replace, ketika Anda selesai tekan C-uC-spaceC-uC-spaceuntuk melompat kembali ke titik awal Anda.


1
Ini berfungsi saat transient-mark-modeaktif. Jika tidak, C-SPC C-SPCuntuk sementara akan mengaktifkantransient-mark-mode
nispio

5
Tidak perlu mengatur tanda secara manual dengan C-SPC. M- <(dan banyak perintah lain yang berpotensi "memindahkan titik jauh") melakukannya untuk Anda.
Mathias Dahl

9

Anda dapat menambahkan perintah berikut ke file inisialisasi emacs Anda, dan ikat ke tombol pilihan Anda.

(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

Anda dapat mengikuti langkah-langkah berikut:

  • C-x h- Pilih seluruh buffer atau M-< - Pergi ke atas buffer
  • M-% - Memulai query-replace
  • ! - Paksa ganti semua
  • C-u C-SPC C-u C-SPC - Pindah kembali ke posisi awal Anda

Ini harus mendapat perhatian lebih.
Indra

3

Anda dapat menambahkan ini ke init.elfile Anda untuk memperbarui perilaku M-%untuk mengganti kata di seluruh buffer secara default:

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

Dan untuk mendapatkan perilaku yang sama dari 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)

Sangat berguna. Terima kasih.
NVaughan

2

Jika Anda menggunakan Icicles maka Anda dapat mencari dan mengganti seluruh buffer (atau beberapa buffer atau file atau target bookmark).

Dan tidak seperti query-replace(misalnya C-x h M-%):

  • Anda dapat menavigasi pertandingan dalam urutan apa pun .

  • Penggantian atas permintaan: Anda tidak perlu mengunjungi setiap pertandingan dan menjawab apakah akan menggantinya atau tidak.


0

Ini adalah solusi yang saya gunakan saat ini, mulai dari awal buffer dan akan kembali ke titik lama setelah diganti.

(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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.