在Ex模式下指定命令的位置

时间:2012-07-24 20:44:20

标签: vim

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

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()))}
    ].

光标位于第一个%的行上。

:,/%/s/%//

或者:

:,/%/normal ^x

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

  1. 为什么?
  2. 我该怎么办?
    • 不使用可视模式,
    • 不计行行数?

3 个答案:

答案 0 :(得分:2)

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

您可能想要做的事情就像

:,$ s/%//

表示,对于从当前位置到文件末尾($)的每一行,发出命令s /%//

如果你不想在文件结束之前这样做,那么你可以

:set number

这将显示行号,然后执行类似

的操作
:2,8 s/%//

只发出2-8

所有行的命令

答案 1 :(得分:2)

问题1:

您的范围:,/%/从当前行开始粗略翻译。范围的结尾将是在当前光标线之后匹配/%/的下一行。这将产生2条线。有关详细信息,请参阅:h :,

问题2:

有很多方法可以做到这一点。您已经提供了normals///方法。修复命令的一种方法是调整范围。以下之一将起作用:

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

你们可以一起使用:

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

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

qq0f%xjq999@q

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

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

有关详细信息,请参阅:

:h range
:h :,
:h /\@!
:h q
:h @q
:h i]

答案 2 :(得分:0)

您似乎以一种应该使用:,/%/的方式使用:g/%/。您可以使用您的命令::g/%/s/%//:g/%/norm f%x

有关“global”命令的更多信息,请参阅:help :g。这基本上在匹配模式的行上执行命令模式命令。您的版本:,/%/从当前行开始运行,直到匹配“%”。这将删除前两个,因为当前行有一个,并且您正在搜索具有一个行(下一行)的行。您可以在:help :range中详细了解相关信息。使用此选项的更好方法是使用仅在最后一行的搜索项。例如,:,/]/s/%//:,/]/norm f%x