我主要对 C++ 和方法/类名/签名自动更改感兴趣。
在最近的 Emacs 版本 (24) 中,Semantic 能够做到这一点。
如果你可以在 elisp 中编程,你可以从 CEDET 库中寻找 cedet + srecode 的组合 - 它提供了用于此任务的所有工具 - 查找函数的调用者,获取签名等。但是你需要自己创建重构工具,使用这些仪器
我经常这样做,所以我也在焦急地等待其他回复。
我所知道的唯一技巧非常基本。以下是我在 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”)。
对于介于重构工具和简单正则表达式之间的某个地方,从 Emacs 22 开始,您可以在替换文本中嵌入任意 elisp 表达式,这使您可以进行极其强大的文本操作。 Steve Yegge 不久前就此写了一篇好文章。
我的一个朋友正在玩 xrefactory 并说它效果很好。不过价格并不便宜。
构建 cscope 符号。
查找您要重构的符号。
进入 cscope 窗口,将光标放在第一次出现的位置后启动宏
你现在必须 c-x c-e
我完全同意查找和替换工作正常。然而,cedet 的一个非常好的功能是“semantic-symref-list”。
将光标放在方法上,运行此命令,您将看到一个缓冲区,其中列出了代码中引用此标记的所有位置。
您仍然可以使用查找和替换技巧,这将确认您已更改所有引用。
我一直在使用 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 设置后:
lsp-rename
您可能应该检查所有修改过的缓冲区,并检查使用任何工具/语言重构后做了什么。