Mencari dan mengganti, oleh M-%dan !, dilakukan dari posisi saat ini sampai akhir buffer. Bagaimana saya bisa melakukannya untuk seluruh buffer? Terima kasih.
:%s/foo/bar
Mencari dan mengganti, oleh M-%dan !, dilakukan dari posisi saat ini sampai akhir buffer. Bagaimana saya bisa melakukannya untuk seluruh buffer? Terima kasih.
:%s/foo/bar
Jawaban:
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.
transient-mark-mode
aktif. Jika tidak, C-SPC C-SPC
untuk sementara akan mengaktifkantransient-mark-mode
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))))
Anda dapat mengikuti langkah-langkah berikut:
C-x h
- Pilih seluruh buffer atau M-<
- Pergi ke atas bufferM-%
- Memulai query-replace
!
- Paksa ganti semuaC-u C-SPC C-u C-SPC
- Pindah kembali ke posisi awal AndaAnda dapat menambahkan ini ke init.el
file 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)
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.
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)