Меня больше всего интересуют автоматические изменения С++ и имени метода/класса/подписи.
Как я могу реорганизовать исходный код C++ с помощью emacs?
Ответы (9)
Я делаю это много, поэтому я с нетерпением жду и других ответов.
Единственные трюки, которые я знаю, очень просты. Вот мои лучшие друзья в 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).
В последних версиях Emacs (24) Semantic это умеет.
- Возможно активировать семантический режим M-x semantic-mode RET.
- Поднимите буфер Symref с помощью C-c , g.
- Нажмите C-c C-e, чтобы открыть все ссылки.
- Переименуйте с помощью R.
C-c , g вместо того, что у вас есть.
- person lfxgroove; 09.03.2014
C-c , g
- person Jakub Narębski; 29.06.2015
Если вы умеете программировать на elisp, вы можете посмотреть на комбинацию cedet + srecode из библиотек CEDET - она предоставляет все инструменты для этой задачи - найти вызывающие функции, получить сигнатуру и т.д. Но вам нужно создать инструмент рефакторинга самостоятельно, используя эти инструменты
Что-то среднее между инструментами рефакторинга и простыми регулярными выражениями, начиная с Emacs 22, вы можете вставлять произвольные выражения elisp в замещающий текст, что позволяет выполнять невероятно мощные манипуляции с текстом. Стив Йегге написал хорошую статью о это некоторое время назад.
Текущее (2021 г.) состояние искусства, я бы сказал, использует emacs lsp-mode с подходящим языковым сервером.
С помощью clangd или ccls, которые предоставляют протокол языкового сервера (lsp) и подключаются к lsp-mode, вы можете реорганизовать имена с помощью:
M-x lsp-переименовать
Чтобы упростить эту настройку, я бы рекомендовал использовать Spacemacs со слоями c-c++ и lsp (и использовать clangd).
Мой друг играл с xrefactory и сказал, что это работает очень хорошо. Хотя это недешево.
Создайте символы cscope.
найдите символ, который вы хотите реорганизовать.
войдите в окно cscope и запустите макрос после помещения курсора в первое вхождение
- рет
- c-f начало вашего символа
- перейти к началу вашего символа
- изменить слово
- c-x o (назад к cscope)
- n (для следующего символа cscope)
Вы должны просто c-x c-e сейчас
Я полностью согласен с тем, что поиск и замена работают нормально. Тем не менее, действительно приятной особенностью cedet является 'semantic-symref-list'.
С курсором на методе запустите эту команду, и вам будет представлен буфер, в котором перечислены все места в вашем коде, которые ссылаются на этот тег.
Вы по-прежнему можете использовать трюки с поиском и заменой, и это подтвердит, что вы изменили все ссылки.
Я использовал cquery для завершения C++, в котором используется Microsoft LSP для IDE ‹-> Инструментальная связь. Сервер cquery удовлетворяет запросы протокола LSP с помощью бэкэнда clang.
lsp-emacs — это пакет, который находится между emacs и бэкендом cquery (cquery-emacs), который предоставляет функцию lsp-rename. Между прочим, как система завершения, cquery очень надежна и быстра, настоятельно рекомендуется.
Попробуйте, следуйте руководству по началу работы на cquery github: https://github.com/cquery-project/cquery/wiki/Emacs
После настройки cquery:
- Наведите курсор на идентификатор (класс, переменную, что угодно), который вы хотите переименовать.
- M-x
lsp-rename - Введите новое имя идентификатора.
- Выполните C-x s (сохраните некоторые буферы), после чего вам будет предложено сохранить все буферы, затронутые рефакторингом.
Вероятно, вам следует пройтись по всем измененным буферам и проверить, что было сделано после рефакторинга с помощью любого инструмента/языка.