我有一个文件使用过时的宏来读取 32 位整数,
READ32(dest, src)
我需要将所有呼叫替换为
dest = readUint32(&src);
我正在尝试编写一个 SED 风格的 Vim 搜索和替换命令,但没有运气。
我可以使用READ32([a-z]+, cmd)
使用/
搜索提示来匹配第一部分,但它似乎在:s
语法中不匹配。
这是我最终想通的工作方法:
:%s/READ32((a+),(a+)/1 = readUint32(&2);
诀窍是将要存储在 1
2
中的值包装在 (
和 )
中 另一个技巧是你必须转义&
运算符,因为 &in vim 替换是"整个匹配"。
编辑:随着我的改进,进一步改进:
:%s/READ32((w+),s*(w+)/1 = readUint32(&2);
将a
更改为w
,因为我有带有 _ 的变量。
添加了 \s* 以处理 和第二个变量之间的空格问题。
现在只是尝试处理样式类.变量.子变量的c ++样式变量
编辑2:将w
替换为[a-zA-Z0-9_.]
,以捕获变量的所有命名方式。
这应该做你想要的,或者至少让你开始:
%s-READ32(s*(i+)s*,s*(i+)s*)-1 = readUint32(&2);-g
我会再次使用宏样式:按*以"突出显示"搜索READ32
。
现在,我们将录制一个宏(q..问 问):
-
n
(移至下一场比赛) -
c
w
readUint32
Esc
(更改函数名称)
w - w dt,
(删除第一个参数) - "_dw
(删除多余的,
) - bbPa
=
Esc
(在readUint32
之前插入附加=
的结果变量) - 一;
(将;
附加到行尾)
现在您可以重复宏(1000@q
)。