Как мне провести рефакторинг всего проекта в 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.

3

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

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


3

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

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

  • ripgrep
  • counsel, wgrep, ieditНаходятся на MELPA
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.