在Vim中重构C/C++代码(例如像Eclipse一样的方法提取)

31

Vim 中是否有用于对 C 或 C++ 代码进行重构的插件或内置方法,类似于 Eclipse 中的重构工具?

我特别关注 Eclipse 中的提取方法重构工具,它可以从新方法中确定参数,通常还会猜测一个变量作为返回值。


你看过这里链接的脚本吗:http://stackoverflow.com/questions/2445760/vim-plugin-for-updating-c-function-definition? - Randy Morris
@Randy Morris - 我尝试了那个帖子中提到的refactor.vim脚本。但它似乎很老旧且有bug,只是给我抛出了很多错误。 :( - Bjarke Freund-Hansen
3个回答

19
不,尽管Vim是一个很好的编辑环境,并且可以以多种方式进行定制(代码折叠、语法着色、宏扩展等),但大部分都是在语法级别上完成的,而非语义级别上。即使代码折叠也只是匹配对应的括号。

要进行适当的重构,你必须对AST有很多语义知识,了解哪些变量在哪个作用域中声明等。像Eclipse这样的IDE会建立每个词法作用域中定义的变量的缓存,以便能够快速地查找它们在哪里使用,从而确定重命名和位置。

这并不是说你不能通过语法做一些事情;毕竟,你可以轻松地将一段代码块取出并放入单独的函数中。你甚至可能能够猜测一些参数(例如找到变量列表,找出哪些变量具有局部声明,删除它们,剩下的就是你的参数)。但Eclipse还做其他事情——比如找出函数中是否修改了任何变量,并确保它们通过返回值传回。它还检查是否有抛出的异常,并将其添加到列表中。

总的来说,虽然你可能能够在Vim中近似实现其中的一些功能,但你真的无法在仅使用Vim的环境中实现这些功能。你可以在Eclipse中使用类似于Vim的按键绑定,或者看看eclim。从主页上可以了解到:

eclim的主要目标是将Eclipse的功能带到Vim编辑器中。最初的目标是在vim中提供Eclipse的java功能,但已经添加了对各种其他语言(c/c++、php、python、ruby、css、html、xml等)的支持,并计划添加更多语言的支持。 eclim不太像一个应用程序,而更像是两个伟大项目的集成。第一个是Vim,可以说是现存最好的文本编辑器之一。第二个是Eclipse,在各种语言的开发中提供了许多优秀的工具。每个都提供了许多功能,可以增加开发人员的生产力,但两者仍然有所欠缺。 Vim没有本地Java支持和Eclipse中可用的许多高级功能。另一方面,与Vim相比,Eclipse仍需要使用鼠标进行许多操作,并且在编辑文本方面提供了不理想的界面。这就是eclim发挥作用的地方。 eclim不是试图在Vim中编写一个IDE或在Eclipse中编写一个Vim编辑器,而是提供了一个Eclipse插件,通过服务器接口公开Eclipse功能,并与Eclipse通信的一组Vim插件。这不仅提供了类似Eclipse的环境,而且就像Eclipse一样。但是您仍然可以获得vim的导航和文本编辑功能。看起来这可能适合您的需求,尽管重构支持的文档并未表明它提供提取方法功能。

19

我写了一个通用的重构插件(refactoring plugin)。C++是主要处理的语言之一(因为它是我在工作中使用的主要语言)。支持方法提取。

对于C ++,该插件能够(由于ctags)推断出被提取函数中大多数(但不总是全部--由于ctags..)进出变量。我仍然需要编写一个小对话框来选择如何交换输入/输出变量(const ref, rvalue ref, copy, pointer, tuples, struct等)(顺便说一句,欢迎帮助GUIs,因为这不是我的强项^^')


基于clang的解决方案应该更加强大。许多重构选项可以得到支持(例如,已经存在clang-rename,更多命令将允许许多功能)。我没有找到任何与vim集成的允许提取方法的工具,但是这是可行的:https://github.com/iZotope/cpp-tools/blob/master/extract-method/ - Colin Pitrat
@Colin Pitrat。我完全同意。如果我没记错的话,自从我的回答之后,已经开始了一些新的事情。 - Luc Hermitte

1

在寻找适用于C++的vim重构工具时,这是我找到的最佳解决方案。

  • Visual Studio 2013及以上版本 - 适用于C++开发和调试的优秀IDE,但缺乏足够的重构或vim功能
  • 安装vsvim插件 - 现在,您拥有了所有的vim导航、搜索、字符串替换等功能。(一些高级功能不受支持)
  • 安装Resharp C++ - 在速度上牺牲一些性能,但非常适合重构。它使得操作有些繁琐,但如果您想要推断自动生成方法/变量、重命名本地/全局/方法变量或函数、在解决方案中搜索用法等功能,那么它就非常值得安装。

这是我为C++开发、调试和重构找到的最佳组合。至少使我快3倍-5倍。希望对您也有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接