Sebagai tindak lanjut dari pertanyaan ini , ia berusaha mencari tahu bagaimana melakukan sesuatu seperti ini yang seharusnya mudah, yang terutama membuat saya berhenti terbiasa dengan menggunakan Emacs dan bukannya memulai editor yang sudah saya kenal. Saya menggunakan contoh di sini cukup sering dalam mengedit banyak file.
Di Ultraedit saya akan melakukan Alt + s lalu p untuk menampilkan kotak dialog dengan opsi: Cari (termasuk menggunakan ekspresi reguler di beberapa baris), Ganti dengan, Dalam File / Jenis, Direktori, Cocokkan Kasus, Cocokkan Hanya Kata Utuh Saja, Daftar File dan Sub Direktori Pencarian yang Diubah. Biasanya saya pertama-tama akan menggunakan mouse untuk mengklik-seret pilih teks yang ingin saya ganti.
Hanya menggunakan Emacs sendiri (pada Windows XP), tanpa memanggil utilitas eksternal apa pun, cara mengganti semua foo \ nbar dengan bilah \ nbaz di dalam *.c
dan *.h
file di beberapa folder dan semua folder di bawahnya. Mungkin Emacs bukan alat terbaik untuk melakukan ini, tetapi bagaimana itu bisa dilakukan dengan mudah dengan perintah minimal?
C-x s !
untuk menyimpan semua file sekaligus.M-,
untuk melanjutkan mencari dan mengganti (misalnya setelah permintaan "kembalikan file" jika file berubah pada disk).M-x find-name-dired RET
M->
) hinggafind finished
muncul " " untuk memastikan mereka semua telah memuatt
untuk "toggle mark" untuk semua file yang ditemukanQ
untuk "Query-Replace in Files ...": Anda akan dimintai kueri / substitusi regexps.y
untuk mengganti dan pindah ke pertandingan berikutnya, n untuk melewatkan pertandingan, dll.N
untuk melewati semua kemungkinan penggantian untuk sisa file saat ini. (N
hanya emacs 23+)Y
.C-x C-b
jika terikat dengan ibuffer, atauM-x ibuffer RET
) untuk mendaftar semua file yang dibuka.* u
untuk menandai semua file yang belum disimpan, ketikS
untuk menyimpan semua file yang ditandai* * RET
untuk menghapus tanda semua tanda, atau ketikD
untuk menutup semua file yang ditandaiJawaban ini digabungkan dari jawaban ini , dari situs ini , dan dari catatan saya sendiri. Menggunakan Emacs 23+.
sumber
ibuffer
tidak terikatC-x C-b
secara default.C-x C-b
untukibuffer
, karena itu jauh lebih baik daripada standar mengikat. Cukup tambahkan(global-set-key (kbd "C-x C-b") 'ibuffer)
ke file .emacs Anda. Jika gagal, gunakanM-x ibuffer RET
petunjuk di atas.bla-bla-bla
dikunjungi hanya-baca dan berhenti untuk mencari. Bagaimana cara menghindari / mengabaikannya dan terus mengganti? Terima kasih.ibuffer
ketika Anda bisaC-x s
(save-some-buffers
) dan mengetik!
? Saya tidak ingin menjadi kata-kata kasar, hanya ingin tahu. PS plus untuk menggambarkan!
,N
danY
.Jawaban yang diberikan sangat bagus, namun saya pikir saya akan menambahkan pendekatan yang sedikit berbeda.
Ini metode yang lebih interaktif, dan membutuhkan
wgrep
,rgrep
daniedit
. Keduanyaiedit
danwgrep
harus diinstal melalui MELPA atau Marmalade (menggunakanM-x package-list-packages
)Pertama jalankan
M-x rgrep
untuk menemukan string yang Anda cari.Anda dapat menentukan jenis / pola file dan folder yang akan diulang.
Selanjutnya Anda harus menjalankan
wgrep
mulai denganC-s C-p
.Wgrep akan membiarkan Anda mengedit
rgrep
hasilnya, jadi atur suatu wilayah pada string untuk mencocokkan dan mulaiiedit-mode
denganC-;
(tergantung pada terminal Anda, Anda mungkin perlu mengikat kembali ini)Semua kejadian akan dapat diedit sekaligus.
C-x C-s
untuk berkomitmenwgrep
. KemudianC-x s !
untuk menyimpan file yang diubah.Manfaat utama dari metode ini adalah Anda dapat menggunakannya
iedit-mode
untuk menonaktifkan pertandingan tertentuM-;
. Anda juga dapat menggunakan hasilrgrep
untuk melompat ke file, misalnya jika Anda memiliki kecocokan yang tidak terduga.Saya merasa sangat berguna untuk melakukan pengeditan sumber dan penggantian nama simbol (variabel, nama fungsi dll.) Di seluruh proyek.
Jika Anda belum tahu / menggunakan mode iedit itu alat yang sangat berguna, saya sangat menyarankan Anda melihatnya.
sumber
wgrep
adalahC-c C-p
btw.Proyektil sangat bagus: Cc pr menjalankan perintah proyektil-ganti
sumber
Saya biasanya menggunakan alat lain untuk melakukan tugas ini, dan sepertinya banyak pendekatan yang disebutkan di shell entri Find and Replace Across Files dari EmacsWiki , tetapi Paket Findr terlihat sangat menjanjikan.
Mencuri bagian dari file sumber :
sumber
Sumber informasi: 1
Untuk pengguna pro emacs:
Panduan Langkah-demi-Langkah untuk Pemula Emacs
Pilih File Target
Mulai emacs dengan mengetikkan "emacs" di prompt antarmuka baris perintah. (Atau, klik dua kali ikon Emacs jika Anda berada di lingkungan Graphics User Interface)
Memilih File dalam Direktori
Pertama, Anda perlu memilih file yang ingin Anda ganti. Gunakan menu grafis 〖File ▸ Open Directory〗. Emacs akan meminta Anda untuk jalur direktori. Ketikkan jalur direktori, lalu tekan Enter.
Sekarang, Anda akan diperlihatkan daftar file, dan sekarang Anda harus menandai file yang Anda ingin regex temukan / ganti untuk bekerja. Anda menandai file dengan memindahkan kursor ke file yang Anda inginkan, lalu tekan m. Hapus tanda dengan menekan u. (Untuk daftar subdirektori, pindahkan kursor ke direktori dan tekan i. Konten sub-direktori akan terdaftar di bagian bawah.) Untuk menandai semua file dengan regex, ketik 【% m】, lalu ketik pola regex Anda. Misalnya, jika Anda ingin menandai semua file HTML, ketikkan 【% m】 lalu .html $. (Anda dapat menemukan daftar perintah tanda di menu grafis "Tandai" (menu ini muncul ketika Anda berada dalam mode dired).)
Memilih File dalam Direktori dan Semua Sub-Direktorinya
Jika Anda ingin mencari / mengganti file di dalam direktori, termasuk ratusan subdirektori, berikut adalah metode untuk memilih semua file ini.
Hubungi find-dired. (Anda memanggil perintah dengan menekan 【Alt + x】) Kemudian, ketikkan nama direktori, ⁖ / Users / mary / myfiles
Catatan: jika Anda menggunakan emacs pada terminal teks non-grafis unix, dan jika 【Alt + x】 tidak berfungsi, stroke key yang setara adalah 【Esc x】.
Emacs akan meminta Anda dengan prompt “Run find (with args):”. Jika Anda perlu melakukan penggantian pada semua file HTML, maka ketik -name "* html". Jika Anda tidak peduli tentang jenis file apa tetapi hanya semua file di bawah dir itu, maka berikan "-type f".
Sekarang, tandai file seperti dijelaskan di atas.
Cari / Ganti Interaktif
Sekarang, Anda siap melakukan penggantian pencarian interaktif. Untuk kesederhanaan, katakanlah Anda hanya ingin mengganti kata "cepat" dengan "super". Sekarang, panggil dired-do-query-replace-regexp. Ini akan meminta Anda untuk string regex dan string pengganti. Ketik "cepat", masukkan, lalu "super".
Sekarang, emacs akan menggunakan pola Anda dan memeriksa file, dan berhenti dan menunjukkan kepada Anda setiap kali terjadi kecocokan. Ketika ini terjadi, emacs akan meminta Anda, dan Anda memiliki pilihan untuk melakukan perubahan atau melewatkan perubahan. Untuk melakukan perubahan, ketik y. Untuk melewati, ketik n. Jika Anda hanya ingin emacs melanjutkan dan membuat semua perubahan pada file saat ini, ketik!
Jika Anda ingin membatalkan seluruh operasi tanpa menyimpan perubahan yang Anda buat, ketik 【Ctrl + g】, lalu keluar emacs menggunakan menu 〖File ▸ Keluar Emacs〗.
Menyimpan File yang Diubah
Sekarang, setelah Anda melewati cobaan di atas, ada satu langkah lagi yang perlu Anda lakukan, dan itu menyimpan file yang diubah.
Jika Anda menggunakan emacs versi 22 atau lebih baru, panggil ibuffer untuk masuk ke mode daftar buffer, lalu ketik 【* u】 untuk menandai semua file yang belum disimpan, kemudian ketik S untuk menyimpan semuanya. (itu shift-s)
Jika Anda menggunakan emacs versi 21, maka Anda dapat melakukan ini: panggil daftar-buffer, kemudian pindahkan kursor ke file yang ingin Anda simpan dan ketik s. Ini akan menandai file untuk tindakan penyimpanan nanti. Ketik u untuk menghapus tanda. Setelah selesai, ketik x untuk menjalankan penyimpanan semua file yang ditandai untuk disimpan. (dalam emacs, file yang dibuka disebut "buffer". Mengabaikan hal-hal lain di sana.)
Alternatif untuk opsi di atas, Anda juga dapat memanggil save-some-buffer 【Ctrl + xs】. Kemudian emacs akan menampilkan setiap file yang belum disimpan dan bertanya apakah Anda ingin menyimpannya.
Catatan: regex emacs tidak sama dengan Perl atau Python, tetapi serupa. Untuk ringkasan dan pola umum, lihat: Emacs Regex.
sumber
Menggunakan dired untuk mengulang pohon direktori yang dalam akan menjadi agak lambat untuk tugas ini. Anda mungkin mempertimbangkan untuk menggunakan tag-query-replace . Ini berarti keluar untuk membuat tabel tag, tetapi itu sering berguna, dan ini cepat.
sumber
Untuk buffer terbuka, inilah yang saya lakukan:
sumber
M-X Dired
, dan t untuk menandai semua file, danQ
untuk meminta ganti teks pada semuanya. Anda dapat memperluas sub direktori dengan menggunakani
perintah sebelum query-replace. Mereka info kunci yang saya tambahkan adalah bahwa jika Anda memberikan awalan (control-u) ke perintah i, itu akan meminta Anda untuk arg, dan argumen -R akan secara rekursif memperluas semuasubdirs
kedired
buffer. Jadi sekarang Anda dapat mencari-cari setiap file di seluruh direktori.sumber
Pilihan lain adalah menggunakan pencarian Icicles . Ini adalah jenis pencarian inkremental yang berbeda yang menggunakan penyelesaian input minibuffer Anda terhadap hit pencarian. Saat Anda memodifikasi input Anda saat ini, set hits yang cocok diperbarui dalam buffer
*Completions*
.Anda dapat mencari sejumlah file, buffer, atau lokasi yang ditandai, yang dapat Anda pilih menggunakan pola minibuffer (mis. Regexp).
Ketika Anda mengunjungi hit pencarian, Anda dapat mengganti berdasarkan permintaan baik seluruh hit atau hanya bagian yang sesuai dengan input minibuffer Anda saat ini. Penggantian atas permintaan berarti Anda tidak ditanya tentang setiap klik pencarian pada gilirannya; Anda mengakses hit yang Anda inginkan secara langsung, dalam urutan apa pun. Pendekatan ini bisa lebih efektif daripada penggantian-kueri jika Anda memiliki sejumlah pengganti untuk dilakukan: Anda melewatkan petunjuk lengkap
y/n
.Pencarian melebihi konteks pencarian yang Anda tetapkan - Anda tidak terbatas pada pencarian semua teks dalam file target (misalnya, Anda dapat melewatkan komentar atau jenis bagian program tertentu). Contoh sederhana dari konteks pencarian adalah baris, seperti pada
grep
, tetapi konteks dapat berupa blok teks yang cocok dengan pola yang Anda suka. Biasanya Anda menentukan konteks pencarian menggunakan regexp, tetapi Anda bisa menggunakan fungsi. Selain menentukan sendiri, ada perintah pencarian Icicles yang telah ditentukan untuk berbagai jenis konteks: blok properti teks atau properti overlay, hal-hal pada titik, dll.Anda juga dapat mengurutkan hit pencarian dalam berbagai urutan sortir untuk akses / navigasi yang lebih mudah.
sumber
find-name-dired
tidak apa-apa, tetapi:find-dired
lebih fleksibel dalam hal itu, tetapi juga dibuat untuk menggunakan aturan umum (bahkan jika mereka bisa rumit). Dan tentu sajafind
memiliki bahasanya sendiri yang kompleks.find(-name)-dired
buffer, Anda harus menandai atau menghapus / menghilangkan baris yang tidak ingin Anda tindak lanjuti.Alternatifnya adalah dengan menggunakan perintah Dired + yang bekerja pada (a) file yang ditandai dan (b) semua file yang ditandai (atau semua file, jika tidak ada yang ditandai) di subdirektori yang ditandai ... ditemukan secara rekursif . Ini memberi Anda keumuman dan kontrol yang mudah atas pilihan file. Semua perintah "di sini dan di bawah" ini semuanya berada pada kunci awalan
M-+
dalam mode Dired.Misalnya,
M-+ Q
sama denganQ
--- ganti-permintaan, tetapi file target semuanya ditandai di direktori saat ini dan di setiap subdir yang ditandai, turun, turun, turun ...Ya, alternatif untuk menggunakan perintah di sini dan di bawah ini adalah dengan memasukkan semua subdir dan subdirnya, secara rekursif, dan kemudian menggunakan perintah tingkat atas seperti
Q
. Tetapi seringkali lebih mudah untuk tidak repot-repot dengan subdir yang dimasukkan.Dan untuk melakukan itu Anda tetap memerlukan cara cepat untuk memasukkan semua subdirs seperti itu secara rekursif . Di sini juga, Dired + dapat membantu.
M-+ M-i
menyisipkan semua subdir yang ditandai dan subdirr yang ditandai sendiri, secara rekursif. Yaitu, sepertiM-i
(yang menyisipkan subdir yang ditandai di Dired + ), tetapi berfungsi secara rekursif pada subdir.(Semua perintah Dired + "here-and-below" ada pada menu Multiple > Marked Here and Below .)
Anda juga dapat melakukan operasi dired pada Emacs fileset , yang merupakan satu set disimpan dari nama-nama file yang berada di mana saja. Dan jika Anda menggunakan Icicles maka Anda dapat membuka buffer Dired hanya untuk file dalam fileset atau jenis lain dari daftar file yang disimpan.
Anda juga dapat mem - bookmark buffer Dired apa pun, termasuk yang Anda buat menggunakan
find(-name)-dired
. Ini memberi Anda cara cepat untuk kembali ke set tersebut (misalnya set proyek) nanti. Dan jika Anda menggunakan Penanda + lalu mem-bookmark catatan Buffer Dired (a)ls
sakelar, (b) file mana yang ditandai, (c) subdirektori mana yang dimasukkan, dan (d) direktori (sub) mana yang disembunyikan. Semua itu dipulihkan saat Anda "melompat" ke bookmark. Bookmark + juga memungkinkan Anda menandai seluruh pohon buffer Dired --- melompat ke bookmark mengembalikan semua buffer di pohon.sumber
Saya ingin menyarankan satu alat hebat lagi yang belum disebutkan, yaitu Helm .
Ini adalah pengganti yang bagus untuk banyak operasi standar Emacs yang melibatkan penyelesaian, pencarian dll. Secara khusus,
helm-find-files
memungkinkan untuk melakukan penggantian permintaan (termasuk regexp) dalam beberapa file yang dipilih.Cukup buka
helm-find-files
, tandai file yang relevan denganM-SPC
dan kemudian gunakanF6
atauF7
untuk menjalankan permintaan ganti atau permintaan ganti regexp di file yang dipilih.sumber
helm-find-files
menandai dengan regexp, bukanM-SPC
?Ini bukan Emacs, tetapi xxdiff dilengkapi dengan alat bernama xx-rename yang akan melakukan itu untuk beberapa string sekaligus (mis. Dari Dari ke dari KEPADA), dengan dorongan interaktif, simpan cadangan semua file yang dimodifikasi, dan buat pendek log perubahan yang dibuat dengan konteks. Itulah yang cenderung saya gunakan ketika saya melakukan renaming besar / global.
sumber