我想删除以下行中的百分比标记:
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
预期:删除所有百分比标记。结果:仅删除前两个百分号。
答案 0 :(得分:2)
你的第一个例子基本上是说...从我当前的位置直到下一个%发出命令s /%//...
您可能想要做的事情就像
:,$ s/%//
表示,对于从当前位置到文件末尾($)的每一行,发出命令s /%//
如果你不想在文件结束之前这样做,那么你可以
:set number
这将显示行号,然后执行类似
的操作:2,8 s/%//
只发出2-8
所有行的命令答案 1 :(得分:2)
问题1:
您的范围:,/%/
从当前行开始粗略翻译。范围的结尾将是在当前光标线之后匹配/%/
的下一行。这将产生2条线。有关详细信息,请参阅:h :,
。
问题2:
有很多方法可以做到这一点。您已经提供了normal
和s///
方法。修复命令的一种方法是调整范围。以下之一将起作用:
,/\]\./-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
。