2

我想从以下几行中删除百分比标记:

oh_test_() ->
    [
        %{"fold", ?_test(fold(ns()))},
        %{"fold nested", ?_test(fold_nested(ns()))},
        %{"push arg empty table", ?_test(push_arg_empty_table(ns()))},
        %{"push arg table 1", ?_test(push_arg_table1(ns()))},
        %{"push arg nested table", ?_test(push_arg_nested_table(ns()))},
        %{"multicall 0", ?_test(multicall_0(ns()))},
        %{"multicall 1", ?_test(multicall_1(ns()))},
        %{"multicall 2", ?_test(multicall_2(ns()))}
    ].

光标与 first 一致%

:,/%/s/%//

或者:

:,/%/normal ^x

预期:删除所有百分比标记。结果:仅删除前两个百分比标记。

  1. 为什么?
  2. 我该怎么做
    • 不使用可视模式,并且
    • 不计算行号?
4

3 回答 3

2

问题一:

你的 range:,/%/从当前行开始大致翻译。范围的结尾将是/%/当前光标行之后匹配的下一行。这将产生 2 行。有关:h :,更多信息,请参阅。

问题2:

有很多方法可以做到这一点。您已经提出了一个normal和一个s///方法。修复命令的一种方法是调整范围。以下其中一项将起作用:

  • ,/\]\./-1匹配结尾].然后减去一行
  • ,/^\s*%\(.*\n\s*%\)\@!/使用否定前瞻来搜索不以 .​​ 开头的行%

你可以一起使用:

:,/\]\./-1s/%//
:,/^\s*%\(.*\n\s*%\)\@!/s/%//
:,/\]\./-1norm ^x
:,/^\s*%\(.*\n\s*%\)\@!/norm ^x

使用宏的替代方法。在这种情况下使用宏的好处是当发生错误时它会停止。基本上你记录一个宏来搜索%然后删除它然后移动到下一行。多次执行此宏。当%找不到 a 时,宏将停止。

qq0f%xjq999@q

在这种情况下,宏是我的首选方法,因为我不需要做任何疯狂的模式或去寻找块的结尾。

如果您允许使用可视模式,我会建议vi]k:norm ^x

有关更多信息,请参阅:

:h range
:h :,
:h /\@!
:h q
:h @q
:h i]
于 2012-07-24T23:42:23.903 回答
2

您的第一个示例基本上是在说...从我当前的位置直到下一个 % 发出命令 s/%//...

你可能想做的是

:,$ s/%//

也就是说,对于从我当前位置到文件结尾 ($) 的每一行,发出命令 s/%//

如果您不想在文件末尾执行此操作,那么您可以

:set number

这将显示您的行号,然后执行类似的操作

:2,8 s/%//

它只是为 2-8 的所有行发出命令

于 2012-07-24T20:55:09.800 回答
0

您似乎正在以应该使用:,/%/的方式使用:g/%/. 您可以这样使用您的命令::g/%/s/%//:g/%/norm f%x

有关“全局”命令的更多信息,请参阅:help :g。这基本上在与模式匹配的行上执行命令模式命令。您的版本,:,/%/从当前行开始运行,直到匹配“%”。这会删除前两个,因为当前行有一个,而您正在搜索有一个的行(下一行)。您可以在 中阅读有关此内容的更多信息:help :range。使用此选项的更好方法是使用仅位于最后一行的搜索项。例如,:,/]/s/%//:,/]/norm f%x

于 2012-07-25T05:00:12.627 回答