Как я могу реорганизовать исходный код C ++, используя emacs? - PullRequest
43 голосов
/ 23 марта 2009

Меня больше всего интересуют автоматические изменения C ++ и имени метода / класса / подписи.

Ответы [ 9 ]

29 голосов
/ 13 февраля 2014

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

  1. Возможно активировать семантический режим M-x семантический режим RET .
  2. Создайте буфер Symref с помощью C-c, g .
  3. Нажмите C-c C-e , чтобы открыть все ссылки.
  4. Переименовать с помощью R .
25 голосов
/ 24 марта 2009

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

13 голосов
/ 23 марта 2009

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

Единственные трюки, которые я знаю, действительно простые. Вот мои лучшие друзья в 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 вы можете получить «Meta», нажав клавишу Esc или удерживая Alt).

8 голосов
/ 01 апреля 2009

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

7 голосов
/ 23 февраля 2015

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

M-x lsp-переименовать

Альтернатива: 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 голосов
/ 23 марта 2009

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

4 голосов
/ 24 августа 2012

Построить символы cscope.

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

попасть в окно cscope и запустить макрос после первого наведения курсора

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

Вы должны просто c-x c-e сейчас

2 голосов
/ 13 декабря 2011

Я полностью согласен, что поиск и замена работают нормально. Тем не менее, действительно приятной особенностью cedet является 'semantic-symref-list'.

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

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

0 голосов
/ 29 марта 2018

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

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

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

После получения cquery setup:

  1. Наведите курсор на идентификатор (класс, переменную и т. Д.), Который вы хотите переименовать.
  2. М-х lsp-rename
  3. Введите новое имя для идентификатора.
  4. Do C-x s (сохранить некоторые буферы), который предложит вам сохранить все буферы, которые были затронуты рефакторингом.

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

...