Ganti nama variabel lokal refactoring

10

Apakah ada alat refactoring elisp yang dapat mengubah nama variabel lokal dan argumen fungsi? Saya ingin dapat berbelok:

(defun my-func (s r)
  ...
  (use s .. r))

ke:

(defun my-func (string replacement)
  ...
  (use string .. replacement))

menggunakan metode yang tahu cara menemukan referensi variabel. Saya baik-baik saja jika tidak super-hygenic.

Gracjan Polak
sumber
4
Banyak kursor dapat mengedit semua contoh simbol dalam pembelotan saat ini.
Malabarba
Lihat juga iedit.
InHarmsWay
2
iedit: github.com/victorhge/iedit
Gracjan Polak
4
Tidak semua kode adalah milik kita. Beberapa kode sudah tua.
Gracjan Polak
2
Saya biasanya regexp ganti di wilayah \ bSYM \ b…
BRPocock

Jawaban:

2

TL; DR: erefactor-rename-symbol-in-buffer

Anda sedang mencari fungsi ganti nama cerdas secara leksikal - yang mengubah nama variabel dengan cakupannya, bukan hanya mencari dan mengganti yang bodoh. Paket seperti ini ada untuk banyak bahasa tetapi pada saat penulisan (April 2019), sebenarnya tidak ada banyak pilihan untuk Emacs Lisp. The erefactorpaket adalah satu-satunya yang saya tahu.

erefactor-rename-symbol-in-bufferadalah fungsi yang Anda inginkan. Ini adalah perintah find-and-replace yang cerdas yang akan menggantikan simbol dalam lingkup saat ini (termasuk dokumen). Batasan perintah ini adalah tidak akan mencari di luar buffer saat ini. Ini cerdas, tetapi tidak sempurna. Ini akan meminta Anda untuk mengkonfirmasi setiap kejadian untuk memastikan hasil akhirnya adalah sanitasi.

Fungsi ganti nama lainnya adalah erefactor-rename-symbol-in-package. Ini tidak bekerja dengan cara yang sama - itu hanya bekerja pada simbol global. Itu bergantung pada paket Anda yang diatur dengan benar, dengan sistem pengelompokan dan awalan, dan itu membutuhkan variabel untuk mencocokkan awalan paket. Itu tidak terlalu kuat - itu akan gagal jika Anda belum mengatur segalanya seperti yang diharapkan fungsi ini. Saya pikir jika Anda mengganti nama simbol global, Anda juga dapat menggunakan penemuan dan ganti yang naif karena simbol global di Elisp tidak memiliki namespace. Manfaat dari pemahaman leksikal sangat minim. Perintah ini terlalu rapuh untuk pertukaran. Saya sarankan hanya menggunakan projectile-replace.

Erefactor memiliki sejumlah perintah Elisp lain yang mungkin berguna bagi Anda. Daftar (tidak lengkap) tersedia di readme .

Itu tidak dijelaskan pada halaman GitHub tetapi erefactortersedia di MELPA ( M-x package-install RET erefactor). Halaman MELPA dapat ditemukan di sini .

jcaw
sumber