我有一个文件使用过时的宏来读取 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* 以处理 , 和第二个变量之间的空白问题。
现在只是尝试处理样式 class.variable.subvariable 的 c++ 样式变量
编辑 2:替换\w
为[a-zA-Z0-9_.]
以捕获我的变量命名的所有方式。
我会再次使用宏样式:点击*“突出显示”搜索READ32
.
现在,我们要录制一个宏(q.. qq):
readUint32
Esc ,
)=
Esc =
前面readUint32
附加的结果变量);
到行尾)现在您可以重复宏 ( 1000@q
)。
这应该做你想做的,或者至少让你开始:
%s-READ32(\s*\(\i\+\)\s*,\s*\(\i\+\)\s*)-\1 = readUint32(\&\2);-g