Zmień nazwę refaktoryzacji zmiennej lokalnej

10

Czy istnieje narzędzie refaktoryzujące Elisp, które może zmieniać nazwy zmiennych lokalnych i argumentów funkcji? Chciałbym móc włączyć:

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

w:

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

za pomocą metody, która wie, jak znaleźć odwołania do zmiennych. Nic mi nie jest, jeśli to nie jest superhigieniczne.

Gracjan Polak
źródło
4
Wiele kursorów może edytować wszystkie wystąpienia symbolu w bieżącym odrzuceniu.
Malabarba,
Zobacz także iedit.
InHarmsWay
2
iedit: github.com/victorhge/iedit
Gracjan Polak
4
Nie cały kod jest nasz. Niektóre kody są stare.
Gracjan Polak,
2
Zwykle regexp zamień w regionie \ bSYM \ b…
BRPocock

Odpowiedzi:

2

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

Szukasz leksykalnie inteligentnej funkcji zmiany nazwy - takiej, która zmienia nazwy zmiennych według ich zakresu, a nie tylko głupiego znajdowania i zastępowania. Takie pakiety istnieją w wielu językach, ale od momentu pisania (kwiecień 2019 r.) Emacs Lisp nie ma wielu opcji. erefactorPakiet jest jedynym, wiem.

erefactor-rename-symbol-in-bufferjest funkcją, którą chcesz. To inteligentne polecenie znajdź i zamień, które zastąpi symbole w bieżącym zakresie (w tym ciągi dokumentów). Ograniczeniem tego polecenia jest to, że nie będzie wyszukiwał poza bieżącym buforem. Jest sprytny, ale nie idealny. Poprosi Cię o potwierdzenie każdego zdarzenia, aby upewnić się, że wynik końcowy jest higieniczny.

Inną funkcją zmiany nazwy jest erefactor-rename-symbol-in-package. To nie działa w ten sam sposób - działa tylko na symbolach globalnych. Zależy to od prawidłowego skonfigurowania pakietu, z systemem grupowania i prefiksem, i potrzebuje zmiennej dopasowującej prefiks pakietu. Nie jest bardzo solidny - zawiedzie, jeśli nie skonfigurujesz rzeczy tak, jak oczekuje ta funkcja. Myślę, że jeśli zmieniasz nazwę globalnego symbolu, równie dobrze możesz użyć naiwnego wyszukiwania i zamień, ponieważ globalne symbole w Elisp nie mają przestrzeni nazw. Korzyści ze zrozumienia leksykalnego są minimalne. To polecenie jest zbyt delikatne, by można było z niego skorzystać. Proponuję po prostu użyć projectile-replace.

Erefactor ma wiele innych poleceń Elisp, które mogą ci się przydać. (Niekompletna) lista jest dostępna w pliku Readme .

Nie jest to opisane na stronie GitHub, ale erefactorjest dostępne w MELPA ( M-x package-install RET erefactor). Strona MELPA znajduje się tutaj .

jcaw
źródło