Bagaimana cara mencari dan mengganti lebih dari satu set file?

9

Saya ingin mendefinisikan satu set file di mana saya dapat mencari dan mengganti teks.

Untuk memperjelas:

Saya ingin dapat mencari, misalnya, dalam semua file xk * .tex dalam direktori yang diberikan (dan tidak termasuk file cadangan). Saya juga ingin dapat mengubah ekspresi, misalnya, "ketidakpastian", ke "ketidakpastian" di semua file dd * .sh dan ee * .cls.

Apa cara standar untuk melakukan ini?

Claudio
sumber
@Claudio Anda mungkin ingin melihatnya direduntuk mencari dan mengganti lebih dari sekumpulan file dalam direktori yang diberikan.
Squidly
Berikut adalah contoh melakukan "pencarian / ganti" di beberapa file dalam direktori / proyek menggunakan ag, wgrepdan multiple-cursors.
Kaushal Modi

Jawaban:

4

Jika Anda bekerja pada proyek yang terdefinisi dengan baik, Anda dapat menggunakan occurdan grepfasilitas dalam proyek melalui projectile. Menjiplak dari deskripsi github-nya, di antara berbagai bit fungsionalitas yang ditawarkan oleh projectile, dapat dilakukan:

  • ganti dalam proyek
  • multi-terjadi di buffer proyek
  • grep dalam proyek
  • kunjungi proyek di dired
Dan
sumber
4

Jika semua file berada di direktori yang sama, Anda bisa mengikuti langkah-langkah ini. Saya akan mendasarkan ini pada contoh kedua yang diberikan dalam komentar:

  1. M-xdireduntuk membuka direktori yang relevan dalam diredmode.
  2. %muntuk berjalan dired-mark-files-regexpdi direktori itu.
  3. Masukkan ^dd.*\.sh$, yang setara dengan regexp untuk dd*.sh. File-file itu sekarang akan ditandai dengan a *, dan mungkin juga muncul disorot dalam warna yang berbeda tergantung pada skema warna Anda.
  4. Ulangi langkah # 3 sebanyak yang diperlukan, dengan regexp apa pun yang Anda inginkan (mis. ^ee.*\.cls$) Sampai semua file yang ingin Anda edit ditandai.
  5. Quntuk dijalankan dired-do-query-replace-regexppada file yang Anda tandai.
  6. Masukkan uncertaintydan indeterminacysebagai string kueri. (Saya pikir ini akan peka terhadap huruf besar-kecil. Jika Anda ingin huruf besar-kecil, mungkin memerlukan regexp, tapi saya tidak yakin.)

Dan itu idenya. Jika Anda perlu mengulangi ini beberapa kali di folder yang berbeda, Anda dapat merekam langkah 2-6 sebagai makro (tekan C-x (setelah langkah # 1, dan C-x )setelah langkah # 6). Dan bahkan jika Anda tidak terlalu nyaman dengan elisp, Anda bisa menerjemahkan makro itu ke menggunakan elisp insert-kbd-macrodan mencoba meretasnya menjadi fungsi yang bermanfaat.

Brian Z
sumber
1
Harap dicatat bahwa di Emacsland, S-qtidak berarti shift+q, artinya super+q. Anda hanya harus menulis Qjika Anda maksudkan shift+q. Saya mengedit komentar Anda untuk mencerminkan ini.
pengasuh
2
Sebenarnya tidak, S-qartinya shift+q; super+qakan ditulis s-q.
Sue D. Nymme
3

Anda dapat menggunakan M-x find-name-direduntuk mendapatkan buffer dired yang berisi tautan ke semua file yang cocok dengan pola nama yang diberikan.

Gunakan M-x find-grep-direduntuk mendapatkan buffer dired yang berisi file-file yang isinya cocok dengan pola grep yang disediakan.

Ada banyak lagi perintah semacam itu; mana yang paling tepat tergantung pada kebutuhan Anda, jadi harap pertimbangkan memperbarui pertanyaan Anda.

Kemudian Anda dapat melintasi daftar file menggunakan makro. Lihatlah jawaban Brian sebagai contoh: https://emacs.stackexchange.com/a/9497/2005

rekado
sumber
1

Gunakan rgrep dan wgrep.

Dengan rgrep Anda dapat mencari semua file regexp di dalam file yang nama filenya cocok dengan regexp dan di dalam direktori (dan subdirernya)

dengan wgrep Anda dapat mengedit buffer yang berisi hasil pencarian rgrep Anda.

PuercoPop
sumber