1

我有一个文件使用过时的宏来读取 32 位整数,

READ32(dest, src)

我需要用

dest = readUint32(&src);

我正在尝试编写 SED 风格的 Vim 搜索和替换命令,但没有运气。

READ32([a-z]\+, cmd)我可以使用搜索提示匹配第一部分/,但它似乎在:s语法上不匹配。

4

3 回答 3

1

这是我最终想出的工作:

:%s/READ32(\(\a\+\),\(\a\+\)/\1 = readUint32(\&\2);

诀窍是将要存储在\1& \2in 中\(的值包装起来,\) 另一个技巧是您必须转义&运算符,因为 vim 替换中的 & 是“整个匹配”。

编辑:在我完善它时进一步改进:
:%s/READ32(\(\w\+\),\s*\(\w\+\)/\1 = readUint32(\&\2);

更改\a为,\w因为我在其中有带有 _ 的变量。
添加了 \s* 以处理 , 和第二个变量之间的空白问题。
现在只是尝试处理样式 class.variable.subvariable 的 c++ 样式变量

编辑 2:替换\w[a-zA-Z0-9_.]以捕获我的变量命名的所有方式。

于 2013-09-17T17:19:22.747 回答
0

我会再次使用宏样式:点击*“突出显示”搜索READ32.

现在,我们要录制一个宏(q.. qq):

  • n
                 (移动到下一场比赛

  • cwreadUint32Esc
                 (更改函数名称

  • wwdt,
                 (删除第一个参数

  • "_dw
                 (去掉多余的,

  • bbPa=Esc
                 (插入=前面readUint32附加的结果变量)

  • A;
                 (附加;到行尾

现在您可以重复宏 ( 1000@q)。

于 2013-09-17T18:50:04.327 回答
0

这应该做你想做的,或者至少让你开始:

%s-READ32(\s*\(\i\+\)\s*,\s*\(\i\+\)\s*)-\1 = readUint32(\&\2);-g
于 2013-09-17T17:19:31.217 回答