首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vim能自动重构这个代码片段吗?这就是宏的作用吗?

vim能自动重构这个代码片段吗?这就是宏的作用吗?
EN

Stack Overflow用户
提问于 2011-10-27 04:47:41
回答 3查看 160关注 0票数 1

我的代码块看起来像这样:

代码语言:javascript
复制
ICar car = new Car<int>(10);
var result = car.Start(100);

Assert.IsTrue(result.IsValid);

我想转换成这个:

代码语言:javascript
复制
Assert.IsTrue((new Car<int>(10).Start(100)).IsValid);

我有大约20个格式完全相同的这些类型的代码片段,这可以在vim中自动执行吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-27 04:56:48

宏速成班:

  • 在正常模式下转到ICar。
  • 按qq启动宏。
  • 修改代码。尝试使用基于单词的移动,而不是左/右箭头。
  • 转到下一个代码段,如使用/ICar。
  • 在正常模式下再次按Q停止录制。

然后,您可以键入@q来执行Q宏并重新格式化一个代码段。如果它像预期的那样工作,那么输入20@q执行20次。

票数 5
EN

Stack Overflow用户

发布于 2011-10-27 05:10:17

代码语言:javascript
复制
:%s:^.* = \([^;]\+\);\_.[^.]\+\([^;]\+\);\n\n\+\([^(]\+\)(.*\.\(.*$\):\3((\1\2).\4

将使用完全相同的格式(.=的位置等在原始模式中很重要)。

HTH

票数 3
EN

Stack Overflow用户

发布于 2011-10-27 08:17:05

宏是最简单的,但另一种方法是使用全局命令-:g/正则表达式/Ex命令。例如(not your example ),你可以使用:g/^\s*ICar/delete删除所有以ICar开头的行(^表示行的开始,\s*表示跳过用于缩进的制表符和空格)。

与宏相比,这种方法的优点是您可以在一个范围内使用它:进入可视模式,标记要重构的部分,然后使用全局命令。只有标记的块中的匹配项才会受到影响。如果使用宏,则需要一次又一次地按@@键,直到清除该块,计算您希望宏运行的确切次数,或者设置一个较大的数字并使不匹配错误停止宏。虽然第三种选择很容易执行,但它也很危险-您需要确保模式在您要重构的部分中只显示为-这样它就不会影响代码的不相关部分-并且重构会删除它-否则宏将在相同的行上反复运行。

宏的优点是它们更容易记录。在像您这样的复杂重构中,您需要运行的全局命令可能非常长且复杂。执行相同操作的宏与全局命令一样长且复杂-但您可以在录制时看到它是如何工作的-比在设计全局命令时在头脑中计算结果要容易得多。

幸运的是,你可以同时享受这两个世界!

首先,你像cdleonard在他的回答中解释的那样记录你的宏,有两个主要的区别。

第一个是宏中的第一次击键应该是^_ -转到行中的第一个非空格字符(这意味着您从qq_开始,然后像往常一样记录)。这将保证宏每次都从行中的正确位置开始。

第二个区别是,您不需要转到宏末尾的下一个代码片段。全局命令将为您处理此问题。

在你录制了宏之后(我假设你把它录制成了q),使用视觉模式标记所有的代码片段,然后输入:g/^\s*ICar/norm @q -这将在标记的范围内搜索所有以ICar开头的行(可能在它们之前有缩进),并对它们执行宏。这里假设范围内以ICar开头的所有内容--只有那些地方--是您想要重构的片段。如果您有以ICar开头的行并且不想重构,或者如果您有想要应用宏的行,但它们不是以ICar开头的,那么您将不得不修改正则表达式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7908752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档