我的代码块看起来像这样:
ICar car = new Car<int>(10);
var result = car.Start(100);
Assert.IsTrue(result.IsValid);我想转换成这个:
Assert.IsTrue((new Car<int>(10).Start(100)).IsValid);我有大约20个格式完全相同的这些类型的代码片段,这可以在vim中自动执行吗?
发布于 2011-10-27 04:56:48
宏速成班:
然后,您可以键入@q来执行Q宏并重新格式化一个代码段。如果它像预期的那样工作,那么输入20@q执行20次。
发布于 2011-10-27 05:10:17
:%s:^.* = \([^;]\+\);\_.[^.]\+\([^;]\+\);\n\n\+\([^(]\+\)(.*\.\(.*$\):\3((\1\2).\4将使用完全相同的格式(.和=的位置等在原始模式中很重要)。
HTH
发布于 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开头的,那么您将不得不修改正则表达式。
https://stackoverflow.com/questions/7908752
复制相似问题