Bagaimana cara refactor di seluruh proyek di emacs (ubah nama metode di mana saja)?

15

Saya ingin menulis ulang bagian dari proyek opensource. Ini termasuk metode penggantian nama. Bagaimana saya bisa melakukan itu secara efisien di emacs di seluruh proyek?

Saya lebih suka tidak menggunakan peretasan seperti pencarian dan ganti di setiap buffer.

Kucing Unfun
sumber
1
Bahasa apa?
phils
Sudahkah Anda melihat ag / grep + wgrep + search / replace? Anda tidak membuka buffer secara individual dalam hal itu. Terkait: emacs.stackexchange.com/a/243/115
Kaushal Modi
Python. Saya menyadari pertanyaan saya bukan yang terbaik, maaf.
The Unfun Cat
Karena pertanyaan ini telah ditabrak ke atas (jika ada yang menemukan ini dari Google), ada perpustakaan python khusus untuk refactoring yang disebut Rope. Ini lebih cerdas daripada solusi lain yang ditawarkan karena memperhitungkan konteks akun. Ini diimplementasikan dalam Emacs dalam sebuah paket bernama ropemacs.
jcaw
@TheUnfunCat dapatkah Anda menambahkan lebih banyak konteks ke pertanyaan Anda? Sampai sekarang ini cukup kabur, dan menambahkan bahwa Anda ingin melakukan ini dalam proyek python akan menjernihkan banyak hal.
DoMiNeLa10

Jawaban:

14

Sekarang saya gunakan helm-aguntuk menemukan semua instance dari nama fungsi (mencari di semua file, termasuk subdir, tidak hanya di buffer terbuka), dan kemudian saya gunakan C-c C-euntuk memasukkan buffer yang mencantumkan semua pertandingan dan di sana saya mengubah nama fungsi. Ketika saya selesai saya menekan C-c C-c (helm-ag--edit-commit)untuk menyimpan perubahan ke semua file yang dibuka.

Ini mungkin terdengar membingungkan tetapi silakan lihat https://github.com/ShingoFukuyama/helm-swoop

Ketika Anda mengocoknya, Anda akan menangis karena kegembiraan bahwa fungsi yang begitu bagus itu ada.

Kucing Unfun
sumber
1
Itu mengalir air mata di pipiku.
mihai
1
benar-benar memiliki air mata di mata saya ketika menjalankan alur kerja ini untuk pertama kalinya, tanpa bercanda
Paul
Solusi hebat!
Kelemahan
6

Karena Anda tidak menentukan bahasanya, sulit untuk memberikan jawaban yang lebih baik daripada "Cari dan Ganti".

Menggunakan wgrep

Jika Anda hanya ingin (secara interaktif) mengganti semua instance dari simbol dengan yang lain, wgrep adalah taruhan terbaik Anda. Ini memungkinkan Anda mengedit buffer hasil grep secara interaktif.

  1. Lakukan M-x package-install RET wgrep.
  2. Lari M-x rgrep. Ini akan menanyakan beberapa pertanyaan mudah dan kemudian melakukan pencarian berulang untuk istilah pencarian di dalam direktori yang Anda spefisikan.
  3. Beralih ke buffer hasil dan lakukan M-x wgrep-change-to-wgrep-mode. Buffer ini sekarang dapat diedit. Setiap perubahan yang Anda lakukan di sini akan tercermin dalam file itu sendiri.
  4. Jalankan a replace-regexpatau a query-replace-regexpdi buffer ini, untuk melakukan refactoring.
  5. Akhiri pengeditan Anda dengan M-x wgrep-save-all-buffersdan M-x wgrep-finish-edit.
Malabarba
sumber
3

Anda dapat menggunakan counsel-rgdiikuti oleh C-c C-ountuk mendapatkan daftar semua kandidat di buffer. Tekan wuntuk mengeditnya wgrep. Saya merekomendasikan iedituntuk mengganti nama simbol. Tekan C-c C-cuntuk komit.

Ketergantungan:

abo-abo
sumber