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.
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.
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))))
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)
:%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.sumber
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.
sumber
Anda dapat mengikuti langkah-langkah berikut:
C-x h
- Pilih seluruh buffer atauM-<
- Pergi ke atas bufferM-%
- Memulaiquery-replace
!
- Paksa ganti semuaC-u C-SPC C-u C-SPC
- Pindah kembali ke posisi awal Andasumber
Anda dapat menambahkan ini ke
init.el
file Anda untuk memperbarui perilakuM-%
untuk mengganti kata di seluruh buffer secara default:Dan untuk mendapatkan perilaku yang sama dari
query-replace-regexp
:sumber
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
(misalnyaC-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.
sumber
Ini adalah solusi yang saya gunakan saat ini, mulai dari awal buffer dan akan kembali ke titik lama setelah diganti.
sumber