Benennen Sie das Refactoring lokaler Variablen um

10

Gibt es ein elisp Refactoring-Tool, mit dem lokale Variablen und Funktionsargumente umbenannt werden können? Ich möchte mich wenden können:

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

in:

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

Verwenden einer Methode, die weiß, wie Variablenreferenzen gefunden werden. Ich bin okay, wenn es nicht superhygienisch ist.

Gracjan Polak
quelle
4
Mehrere Cursor können alle Instanzen eines Symbols in der aktuellen Definition bearbeiten.
Malabarba
Siehe auch iedit.
InHarmsWay
2
iedit: github.com/victorhge/iedit
Gracjan Polak
4
Nicht jeder Code gehört uns. Ein Code ist alt.
Gracjan Polak
2
Normalerweise ersetze ich Regexp in Region \ bSYM \ b…
BRPocock

Antworten:

2

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

Sie suchen nach einer lexikalisch intelligenten Umbenennungsfunktion, die Variablen nach ihrem Umfang umbenennt und nicht nur dummes Suchen und Ersetzen. Pakete wie dieses gibt es für viele Sprachen, aber zum Zeitpunkt des Schreibens (April 2019) gibt es für Emacs Lisp nicht viele Optionen. Das erefactorPaket ist das einzige, das ich kenne.

erefactor-rename-symbol-in-bufferist die gewünschte Funktion. Es ist ein intelligenter Befehl zum Suchen und Ersetzen, der Symbole im aktuellen Bereich (einschließlich Dokumentzeichenfolgen) ersetzt. Die Einschränkung dieses Befehls besteht darin, dass nicht außerhalb des aktuellen Puffers gesucht wird. Es ist klug, aber nicht perfekt. Sie werden aufgefordert, jedes Vorkommen zu bestätigen, um sicherzustellen, dass das Endergebnis hygienisch ist.

Die andere Umbenennungsfunktion ist erefactor-rename-symbol-in-package. Dies funktioniert nicht auf die gleiche Weise - es funktioniert nur bei globalen Symbolen. Es setzt voraus, dass Ihr Paket korrekt eingerichtet ist, mit einem Gruppierungssystem und einem Präfix, und die Variable muss mit dem Präfix des Pakets übereinstimmen. Es ist nicht sehr robust - es schlägt fehl, wenn Sie die Einstellungen nicht so vorgenommen haben, wie es diese Funktion erwartet. Ich denke, wenn Sie ein globales Symbol umbenennen, können Sie auch ein naives Suchen und Ersetzen verwenden, da globale Symbole in Elisp keinen Namespace haben. Die Vorteile des lexikalischen Verständnisses sind minimal. Dieser Befehl ist zu zerbrechlich für den Kompromiss. Ich würde vorschlagen, nur zu verwenden projectile-replace.

Erefactor verfügt über eine Reihe weiterer Elisp-Befehle, die Sie möglicherweise nützlich finden. Eine (unvollständige) Liste finden Sie in der Readme-Datei .

Es wird nicht auf der GitHub-Seite beschrieben, erefactorist aber auf MELPA ( M-x package-install RET erefactor) verfügbar . Die MELPA-Seite finden Sie hier .

jcaw
quelle