Подтвердить что ты не робот

Как я могу реорганизовать исходный код на С++ с помощью emacs?

Меня интересуют главным образом автоматические изменения имени и имени файла/имени файла С++ и метода/класса.

4b9b3361

Ответ 1

Я делаю это много, поэтому я тоже жду других ответов.

Единственные трюки, которые я знаю, действительно базовые. Вот мои лучшие друзья в Emacs при рефакторинге кода:

M-x query-replace

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

C-x 3

Это дает вам дисплей с двумя буферами бок о бок. Затем вы можете загружать в них разные файлы и перемещать курсор от одного к другому с помощью C-x o. Это довольно простой материал, но я упоминаю об этом из-за того, насколько мощный он делает следующий...

C-x (
(type any amount of stuff and/or emacs commands here)
C-x )

Вот как вы определяете макрос в emacs. Каждый раз, когда вам приходится делать то же самое снова и снова в кучу кода (и это слишком сложно для замены запроса), это спасатель. Если вы испортились, вы можете нажать C-g, чтобы остановить определение макроса, а затем отменить (C-_), пока не вернетесь туда, где вы начали. Ключи для вызова макроса C-x e. Если вы хотите сделать это несколько раз, вы можете нажать Esc и сначала ввести число. Например: Esc 100 C-x e попытается вызвать ваш макрос 100 раз.

(Примечание. В Windows вы можете получить "Мета", нажав клавишу Esc или нажав Alt).

Ответ 2

В последних версиях Emacs (24) Semantic может это сделать.

  • Возможно активировать семантический режим M-x semantic-mode RET.
  • Поднимите буфер Symref с помощью C-c , g.
  • Нажмите C-c C-e, чтобы открыть все ссылки.
  • Переименовать с помощью R.

Ответ 3

Если вы можете запрограммировать в elisp, вы можете посмотреть на комбинацию cedet + srecode из библиотек CEDET - она ​​предоставляет все инструменты для этой задачи - найти вызывающих функций, получить подпись и т.д. Но вам нужно создать инструмент refactory самостоятельно, используя эти инструменты

Ответ 4

Для где-то между инструментами рефакторинга и простым регулярным выражением, поскольку Emacs 22 вы можете вставлять произвольные выражения elisp в ваш текст замены, что позволяет делать невероятно мощные манипуляции с текстом. Стив Йегге написал об этом хорошую статью.

Ответ 5

С помощью ccls или cquery, которые предоставляют "протокол языкового сервера" (lsp), вы можете рефакторировать имена с помощью:

M-x lsp-rename

Альтернатива: srefactor использует srefactor семантического режима emacs: https://github.com/tuhdo/semantic-refactor/blob/master/srefactor-demos/demos.org

Вы можете получить его с помощью M-x package-install из MELPA или по адресу https://github.com/tuhdo/semantic-refactor/.

Ответ 6

Мой друг играл с xrefactory и сказал, что он работает очень хорошо. Это не дешево, хотя.

Ответ 7

Создайте символы cscope.

найдите символ, который вы хотите реорганизовать.

войдите в окно cscope и запустите макрос после размещения курсора при первом входе

  • RET
  • c-f начало вашего символа
  • перейти к началу вашего символа
  • изменить слово
  • c-x o (назад к cscope)
  • n (для следующего символа cscope)

вам нужно просто c-x c-e now

Ответ 8

Я полностью согласен с тем, что find-and-replace работает нормально. Однако очень приятной особенностью cedet является "семантический-symref-list".

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

Вы можете использовать трюки find-and-replace, и это подтвердит, что вы изменили все ссылки.

Ответ 9

Я использовал cquery для своего завершения C++, в котором для взаимодействия с IDE <-> Tool используется Microsoft LSP. Сервер cquery удовлетворяет запросы протокола LSP с помощью бэкэнда clang.

lsp-emacs - это пакет, который находится между emacs и бэкэндом cquery (cquery-emacs), который предоставляет функцию lsp-rename. В качестве системы завершения, cquery был очень надежным и быстрым, кстати, очень рекомендуется.

Попробуйте, следуйте руководству по началу работы на gitHub cquery: https://github.com/cquery-project/cquery/wiki/Emacs

После того, как вы установили cquery:

  1. Наведите курсор на идентификатор (класс, var, что угодно), который вы хотите переименовать.
  2. Mx lsp-rename
  3. Введите новое имя для идентификатора.
  4. Выполните Cx s (сохраните несколько буферов), который предложит вам сохранить все буферы, которые были затронуты рефакторингом.

Вы, вероятно, должны пройти через все измененные буферы и проверить, что было сделано после рефакторинга любым инструментом/языком.