Renommer le refactoring de variable locale

10

Existe-t-il un outil de refactorisation elisp qui peut renommer les variables locales et les arguments de fonction? Je voudrais pouvoir tourner:

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

dans:

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

en utilisant une méthode qui sait comment trouver des références de variables. Je vais bien si ce n'est pas super hygiénique.

Gracjan Polak
la source
4
Plusieurs curseurs peuvent modifier toutes les instances d'un symbole dans le defun actuel.
Malabarba
Voir également iedit.
InHarmsWay
2
iedit: github.com/victorhge/iedit
Gracjan Polak
4
Tout le code n'est pas le nôtre. Certains codes sont anciens.
Gracjan Polak
2
Je remplace habituellement regexp dans la région \ bSYM \ b…
BRPocock

Réponses:

2

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

Vous recherchez une fonction de renommage lexicalement intelligente - une fonction qui renomme les variables par leur portée, et pas seulement une recherche et un remplacement stupides. Des packages comme celui-ci existent pour de nombreuses langues mais au moment de l'écriture (avril 2019), il n'y a en fait pas beaucoup d'options pour Emacs Lisp. Le erefactorpackage est le seul que je connaisse.

erefactor-rename-symbol-in-bufferest la fonction que vous souhaitez. Il s'agit d'une commande de recherche et de remplacement intelligente qui remplacera les symboles dans la portée actuelle (y compris les docstrings). La limitation de cette commande est qu'elle ne recherchera pas en dehors du tampon actuel. C'est intelligent, mais pas parfait. Il vous demandera de confirmer chaque occurrence pour vous assurer que le résultat final est sanitaire.

L'autre fonction de renommage est erefactor-rename-symbol-in-package. Cela ne fonctionne pas de la même manière - cela fonctionne uniquement sur les symboles globaux. Il repose sur la configuration correcte de votre package, avec un système de regroupement et un préfixe, et il a besoin de la variable pour correspondre au préfixe du package. Ce n'est pas très robuste - il échouera si vous n'avez pas configuré les choses comme le prévoit cette fonction. Je pense que si vous renommez un symbole global, vous pouvez aussi utiliser une recherche et un remplacement naïfs car les symboles globaux dans Elisp n'ont pas d'espace de noms. Les avantages de la compréhension lexicale sont minimes. Cette commande est trop fragile pour le compromis. Je suggérerais simplement d'utiliser projectile-replace.

Erefactor dispose d'un certain nombre d'autres commandes Elisp qui pourraient vous être utiles. Une liste (incomplète) est disponible dans le fichier Lisez - moi .

Il n'est pas décrit sur la page GitHub mais erefactorest disponible sur MELPA ( M-x package-install RET erefactor). La page MELPA se trouve ici .

jcaw
la source