Переименовать локальную переменную рефакторинга

10

Существует ли инструмент рефакторинга elisp, который может переименовывать локальные переменные и аргументы функций? Я хотел бы иметь возможность включить:

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

в:

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

используя метод, который знает, как найти ссылки на переменные. Я в порядке, если это не супергигенично.

Грачан Полак
источник
4
Несколько курсоров могут редактировать все экземпляры символа в текущем defun.
Малабарба
Также см. Иедит.
InHarmsWay
2
iedit: github.com/victorhge/iedit
Грачан Полак,
4
Не весь код наш. Какой-то код старый.
Грачан Полак
2
Я обычно regexp замену в регионе \ bSYM \ b…
BRPocock

Ответы:

2

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

Вы ищете лексически интеллектуальную функцию переименования - такую, которая переименовывает переменные по объему, а не просто ищет и заменяет. Подобные пакеты существуют для многих языков, но на момент написания (апрель 2019 г.) вариантов для Emacs Lisp практически не было. erefactorПакет только один я знаю.

erefactor-rename-symbol-in-bufferэто функция, которую вы хотите. Это интеллектуальная команда поиска и замены, которая заменит символы в текущей области (включая строки документов). Ограничением этой команды является то, что она не будет искать вне текущего буфера. Это умно, но не идеально. Он попросит вас подтвердить каждый случай, чтобы убедиться, что конечный результат является санитарным.

Другая функция переименования erefactor-rename-symbol-in-package. Это не работает так же - оно работает только с глобальными символами. Он зависит от того, правильно ли настроен ваш пакет, с системой группировки и префиксом, и ему нужна переменная, соответствующая префиксу пакета. Он не очень надежен - он потерпит неудачу, если вы не настроили все так, как ожидает эта функция. Я думаю, что если вы переименуете глобальный символ, вы также можете использовать наивный поиск и замену, поскольку глобальные символы в Elisp не имеют пространства имен. Преимущества лексического понимания минимальны. Эта команда слишком хрупкая для компромисса. Я бы предложил просто использовать projectile-replace.

Erefactor имеет ряд других команд Elisp, которые могут оказаться полезными. (Неполный) список доступен в файле readme .

Это не описано на странице GitHub, но erefactorдоступно на MELPA ( M-x package-install RET erefactor). Страницу MELPA можно найти здесь .

jcaw
источник