@Malabarba menyebutkan penggunaan wgrep
paket untuk mengedit hasil grep / ack / ag.
Saya ingin menulis walk-through terperinci tentang bagaimana saya menggunakan ag
paket dan wgrep-ag
paket untuk mencapai pengeditan hasil 'menggunakan multiple-cursors
paket menggunakan .
Paket-paket ini tersedia melalui Melpa. Anda juga harus memasang ag
alias the_silver_searcher di sistem Anda.
Walk-through ini berlaku untuk kasus-kasus di mana Anda mencari cara untuk melakukan pengeditan satu baris di semua / lokasi terpilih yang ag
ditemukan.
Instal ag
pada sistem Anda dan paket emacs yang disebutkan di atas.
ag
mendukung pencarian file dengan konten yang cocok dengan regex yang Anda tentukan. Cara paling sederhana untuk mengetahui di ag
mana root proyek adalah meletakkan .git
folder kosong di sana. Kemudian lakukan pencarian menggunakan M-x ag-project-regexp
.
Buffer hasil pencarian ag tidak dapat diedit secara default. Untuk membuatnya dapat diedit, lakukan M-x wgrep-change-to-wgrep-mode
atau gunakan wgrep
pengikatan -default C-c C-p
.
Sekarang jika Anda perlu mengubah 'abcdef' menjadi 'ghijkl' di semua file Anda, Anda akan mencari 'abcdef' dan buffer hasil ag akan menampilkan semua baris yang berisi string itu. Kemudian Anda membuat buffer itu dapat diedit dan mengubah string-string itu secara manual dan perubahan-perubahan itu akan tercermin dalam buffer file aktual untuk melakukan M-x wgrep-finish-edit
atau menggunakan pengikatan default C-c C-e
. Anda juga dapat menggunakan query-replace-regexp
untuk melakukan penggantian pencarian itu.
Saya lebih suka menggunakan multiple-cursors
untuk refactoring cepat sehingga saya bisa melihat umpan balik waktu nyata di mana beberapa pengeditan saya terjadi secara bersamaan. Sorot string yang ingin Anda ganti di buffer hasil dan panggilan ag M-x mc/mark-all-like-this
lalu edit dengan kagum saat Anda melihat hal-hal yang diedit di beberapa titik pada saat yang sama.
Setelah Anda puas dengan pengeditan, seperti yang saya sebutkan di atas, lakukan C-c C-e
untuk "mencerminkan" perubahan dalam buffer yang sebenarnya. Buffer belum disimpan.
Untuk menyimpan semua buffer, saya biasanya melakukannya sekaligus, menggunakan C-x s !
pengikatan default emacs .
Berikut adalah contoh kasus penggunaan dengan tangkapan layar:
Ini menunjukkan proses mengganti semua contoh bind-to-modi-map
ke bind-to-my-map
dalam ~/.emacs.d/
.
Ketika saya mencari bind-to-modi-map
di folder pengaturan emacs saya, saya mendapatkan hasil 'di bawah ini:
Buffer ini hanya baca.
Setelah M-x wgrep-change-to-wgrep-mode
, saya sorot,, -modi-map
pilih semua contoh pilihan itu menggunakan M-x mc/mark-all-like-this
dan setelah mengedit pilihan -my-map
itu, terlihat seperti di bawah ini:
Sorotan biru menunjukkan garis mana yang akan dimodifikasi ketika saya menekan C-c C-e
.
Saat memukul C-c C-e
, Anda dapat melihat perubahan yang tercermin dalam file aktual di tangkapan layar ini:
Saya kemudian akan menyimpan semua file yang dimodifikasi menggunakan C-x s !
.
Anda tidak perlu mengubah buffer hasil grep menjadi apa pun, sudah ada mode khusus untuk mengedit output grep (dan tentu saja mencerminkan perubahan pada file).
(require 'wgrep)
dalam file init Anda.C-c C-p
dan edit pergi!C-c C-e
Ia bahkan bekerja dengan ACK dan AG juga.
sumber
Fungsi ini ada dalam proyektil (
projectile-replace
). Ini akan menggunakan ag / ack / git grep / grep jika tersedia (dalam urutan itu) untuk menemukan kejadian, dantags-query-replace
untuk menjalankan query-replace.sumber
M-g n C-x e
(yaitu, gunakannext-error
untuk menelusuri kejadian-kejadian).Berikut adalah pendekatan lain, menggunakan Icicles .
Di
*grep*
buffer output Emacs Anda , tekan Cc `(itu backquote Cc), yang dalam mode Icicle terikat dalam buffer*grep*
to commandicicle-compilation-search
. Ini memungkinkan Anda dengan cepat menavigasi di antara setiap pencarian pencarian (grep
hits) yang Anda pilih, dalam urutan apa pun.Input yang Anda ketik di minibuffer secara dinamis menyaring (mempersempit) himpunan hasil pencarian, dan Anda dapat menggunakan pelengkapan progresif untuk mempersempit dengan mencocokkan beberapa pola secara berurutan (mis. Substring, regexps).
Saat menavigasi di antara pencarian hit Anda dapat menggantinya dengan permintaan - baik seluruh hit (baris) atau hanya bagian yang cocok dengan input minibuffer Anda saat ini.
Lihat Pencarian Icicles - Kompilasi atau Grep . Intro untuk pencarian Icicles ada di sini , dan info tentang mengganti kecocokan selama pencarian Icicles ada di sini .
sumber
Saya menggunakan util ini saya menulis xah_find.el
Saya menulisnya karena:
Utilitas elisp ini mungkin 5 hingga 10 kali lebih lambat daripada memanggil unix grep di emacs, tetapi bekerja dengan baik untuk saya.
sumber