如何使用 emacs 重构 C++ 源代码?

问题描述 投票:0回答:9

我主要对 C++ 和方法/类名/签名自动更改感兴趣。

c++ emacs refactoring
9个回答
35
投票

在最近的 Emacs 版本 (24) 中,Semantic 能够做到这一点。

  1. 可能激活语义模式M-x语义模式RET
  2. 使用 C-c 、 g 调出 Symref 缓冲区。
  3. C-c C-e 打开所有参考文献。
  4. R 重命名。
  5. 使用 C-x s 保存所有编辑过的缓冲区!

26
投票

如果你可以在 elisp 中编程,你可以从 CEDET 库中寻找 cedet + srecode 的组合 - 它提供了用于此任务的所有工具 - 查找函数的调用者,获取签名等。但是你需要自己创建重构工具,使用这些仪器


13
投票

我经常这样做,所以我也在焦急地等待其他回复。

我所知道的唯一技巧非常基本。以下是我在 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 键来获取“Meta”)。


9
投票

我想说,当前(2022 年)最先进的技术是使用 emacs

lsp-mode
和合适的语言服务器。

使用

clangd
ccls
(提供“语言服务器协议”(lsp)并连接到
lsp-mode
),您可以使用以下方式重构名称:

M-x lsp-重命名

为了简化此设置,我建议将 Spacemacs

c-c++
lsp
层一起使用(并使用
clangd
)。


8
投票

对于介于重构工具和简单正则表达式之间的某个地方,从 Emacs 22 开始,您可以在替换文本中嵌入任意 elisp 表达式,这使您可以进行极其强大的文本操作。 Steve Yegge 不久前就此写了一篇好文章


7
投票

我的一个朋友正在玩 xrefactory 并说它效果很好。不过价格并不便宜。


4
投票

构建 cscope 符号。

查找您要重构的符号。

进入 cscope 窗口,将光标放在第一次出现的位置后启动宏

  • ret
  • c-f 你的符号开始
  • 导航到符号的开头
  • 修改单词
  • c-x o(返回 cscope)
  • n(用于下一个 cscope 符号)

你现在必须 c-x c-e


3
投票

我完全同意查找和替换工作正常。然而,cedet 的一个非常好的功能是“semantic-symref-list”。

将光标放在方法上,运行此命令,您将看到一个缓冲区,其中列出了代码中引用此标记的所有位置。

您仍然可以使用查找和替换技巧,这将确认您已更改所有引用。


2
投票

我一直在使用 cquery 来完成 C++,它使用 Microsoft LSP 进行 IDE <-> 工具通信。 cquery服务器使用 clang 后端满足 LSP 协议的请求。

lsp-emacs 是位于 emacs 和 cquery 后端 (cquery-emacs) 之间的包,它公开了

lsp-rename
函数。作为一个补全系统,cquery 非常可靠且快速,强烈推荐。

尝试一下,按照 cquery github 上的入门指南进行操作: https://github.com/cquery-project/cquery/wiki/Emacs

完成 cquery 设置后:

  1. 将光标悬停在您要重命名的标识符(类、var 等)上。
  2. M-x
    lsp-rename
  3. 输入标识符的名称。
  4. 执行 C-x s(保存 some 缓冲区),这将提示您保存 重构涉及的所有缓冲区。

您可能应该检查所有修改过的缓冲区,并检查使用任何工具/语言重构后做了什么。

© www.soinside.com 2019 - 2024. All rights reserved.