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

时间:2009-03-23 14:21:48

标签: c++ emacs refactoring

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

9 个答案:

答案 0 :(得分:29)

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

  1. 可能激活语义模式 M-x语义模式RET
  2. 使用 C-c,g 打开Symref缓冲区。
  3. C-c C-e 打开所有参考文献。
  4. 使用 R 重命名。

答案 1 :(得分:25)

如果你可以在elisp中编程,你可以查看来自CEDET libraries的cedet + srecode的组合 - 它为这个任务提供所有工具 - 找到函数的调用者,获得签名等等。但是你需要创建refactory使用这些工具自己动手

答案 2 :(得分: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”。

答案 3 :(得分:8)

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

答案 4 :(得分:7)

使用cclscquery,它们提供"语言服务器协议" (lsp),您可以使用:

重构名称

M-x lsp-rename

替代方案:srefactor使用emacs语义模式框架: https://github.com/tuhdo/semantic-refactor/blob/master/srefactor-demos/demos.org

您可以使用MELPA中的 M-x package-install 或在 https://github.com/tuhdo/semantic-refactor/

答案 5 :(得分:6)

我的一个朋友正在玩xrefactory并说它运作得很好。它虽然不便宜。

答案 6 :(得分:4)

构建cscope符号。

查找要重构的符号。

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

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

你现在只需要c-x c-e

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:0)

我一直在使用 cquery 进行C ++完成,它使用Microsoft LSP for 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. 将光标悬停在您要重命名的标识符(class,var,whatever)上。
  2. M-x lsp-rename
  3. 输入标识符的名称。
  4. 执行 C-x s (保存部分缓冲区),这会提示您保存 重构触及的所有缓冲区。
  5. 您可能应该浏览所有已修改的缓冲区,并检查使用任何工具/语言进行重构后所执行的操作。