Как мне провести рефакторинг всего проекта в emacs (изменить имя метода везде)?

15

Я хочу переписать части проекта с открытым исходным кодом. Это включает в себя методы переименования. Как я могу сделать это эффективно в Emacs по всему проекту?

Я бы предпочел не использовать такие хаки, как поиск и замена, в каждом буфере.

Несчастный кот
источник
1
Какой язык?
Филс
Вы смотрели на ag / grep + wgrep + поиск / замена? Вы не открываете буферы индивидуально в этом. Связанный: emacs.stackexchange.com/a/243/115
Каушал Моди
Python. Я понимаю, что мой вопрос был не самым лучшим, извините.
Несчастный кот
Поскольку этот вопрос был поднят до максимума (в случае, если кто-то наткнется на это из Google), существует специальная библиотека python для рефакторинга под названием Rope. Он более интеллектуален, чем другие предлагаемые решения, поскольку учитывает контекст. Он реализован в Emacs в пакете под названием ropemacs.
jcaw
@TheUnfunCat Можете ли вы добавить больше контекста к вашему вопросу? На данный момент это довольно расплывчато, и добавление, что вы хотите сделать это в проекте Python, прояснит многое.
DoMiNeLa10

Ответы:

14

Теперь я использую, helm-agчтобы найти все экземпляры имени функции (поиск во всех файлах, включая подкаталоги, а не только в открытых буферах), а затем я использую, C-c C-eчтобы ввести буфер, в котором перечислены все совпадения, и там я изменяю имя функции. Когда я закончу, я нажимаю, C-c C-c (helm-ag--edit-commit)чтобы сохранить изменения во всех открытых файлах.

Это может показаться странным, но см. Https://github.com/ShingoFukuyama/helm-swoop.

Когда вы берете его, вы будете плакать от слез радости, что такая замечательная функциональность существует.

Несчастный кот
источник
1
Это пробежало по моей щеке.
Михай
1
у меня буквально слезы на глазах, когда я выполнял этот рабочий процесс в первый раз, без шуток
Пол
Отличное решение!
фрагмент
6

Поскольку вы не указали язык, сложно дать лучшие ответы, чем «Поиск и замена».

Использование wgrep

Если вы просто хотите (в интерактивном режиме) заменить все экземпляры символа на другой, то лучшим выбором будет wgrep. Это позволит вам интерактивно редактировать буфер результатов grep.

  1. Есть M-x package-install RET wgrep.
  2. Беги M-x rgrep. Он задаст вам несколько простых вопросов, а затем выполнит рекурсивный поиск по поисковому запросу в указанном вами каталоге.
  3. Переключитесь на буфер результатов и сделайте M-x wgrep-change-to-wgrep-mode. Этот буфер теперь редактируемый. Любые внесенные вами изменения будут отражены в самих файлах.
  4. Запустите a replace-regexpили a query-replace-regexpв этом буфере, чтобы выполнить рефакторинг.
  5. Закончите редактирование с помощью M-x wgrep-save-all-buffersи M-x wgrep-finish-edit.
Malabarba
источник
3

Некоторые общие подходы можно найти под заголовком « Заменить через файлы » на странице поиска и замены Emacs Wiki: http://www.emacswiki.org/emacs/CategorySearchAndReplace

Также смотрите ответы на следующие вопросы: Использование Emacs для рекурсивного поиска и замены в текстовых файлах, которые еще не открыты .

Phils
источник
3

Вы можете использовать с counsel-rgпоследующим, C-c C-oчтобы получить список всех кандидатов в буфере. Нажмите, wчтобы редактировать их с помощью wgrep. Я рекомендую ieditдля переименования символов. Нажмите, C-c C-cчтобы совершить.

зависимости:

  • ripgrep
  • counsel, wgrep, ieditНаходятся на MELPA
Або-або
источник