2012-07-24 15 views
2

命令我想从下面的行删除百分比标记:指定位置在Ex模式

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. 我应该怎么办呢
    • 不使用可视化模式,并
    • 不计算行号?

回答

2

问题1 :

您的范围:,/%/大致从当前行开始翻译。范围的末尾将是当前游标行之后匹配/%/的下一行。这将产生2条线。有关更多信息,请参见:h :,

问题2:

有很多方法可以做到这一点。您已经提出了normals///方法。解决您的命令的一种方法是调整范围。下列情况之一的将工作:

  • ,/\]\./-1比赛结束].,然后减去行
  • ,/^\s*%\(.*\n\s*%\)\@!/使用负前瞻搜索不具有%开始一条线。

总之,你可以使用:

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

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

qq0f%[email protected] 

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

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

欲了解更多信息,请参阅:

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

谢谢!我结束了':,/]/s /%//'。因为我总是知道''''行不会有'%'。并感谢参考。 – 2012-07-25 06:58:38

2

你第一个例子基本上是说......从我的当前位置,直到下一个议题%的命令S /%// ...

你可能想要做的是一样的东西

:,$ s/%// 

它说,从我目前的位置的每一行,直到文件($)结束时,发出命令S /%//

如果你不想这样做,直到该文件的末尾,那么你可以

:set number 

,它会显示你行号,然后像做

:2,8 s/%// 

刚刚发出命令所有行从2-8

+0

如上所述,_I do ** not **想要计算行号_。 – 2012-07-25 06:59:32

+0

你不需要计算任何东西......看起始线,看结束线......不涉及计数。 – 2012-07-25 14:16:54

0

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

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