假设我有以下代码行:
something:somethingElse:anotherThing:woahYetAnotherThing
我想用:
替换每个;
,但第一个除外,这样该行看起来像这样:
something:somethingElse;anotherThing;woahYetAnotherThing
有没有办法使用:[range]s/[search]/[replace]/[options]
命令执行此操作而不使用c
选项来确认每次替换操作?
据我所知,s
作用的最小范围是一行。如果这是真的,那么执行上述任务的最快方法是什么?
答案 0 :(得分:6)
我自己是个新手;我认为你的范围是正确的(仅限于100%),但是对于这个具体的例子,你可能会尝试用全局标志替换所有实例,然后通过省略全局标记来放回第一个实例 - 类似于:s/:/;/g|s/;/:/
。
注意:如果该行在第一个;
之前包含:
,那么这将不起作用。
答案 1 :(得分:2)
以下是如何使用单击键来执行您想要的操作(通过映射大写 Q ):
map Q :s/:/;/g\|:s/;/:<Enter>j
每按一次 Q ,当前行将被修改,光标将移动到下一行。
换句话说,您可以多次按 Q 来编辑每一行。
说明:
这将在当前行上全局运行:
:s/:/;/g
这会将第一个分号切换回冒号:
:s/;/:
@AlliedEnvy的回答将这些结合在一起。
我的地图命令将@ AlliedEnvy的答案分配给大写Q字符。
另一种方法(如果我只需要做一次,我可能会做什么):
˚F : ; - [R ; ;
然后你可以反复按; 。直到你到达行尾。
(你选择更换分号会让这有点令人讨厌)
说明:
长话短说:
x
答案 2 :(得分:2)
虽然其他答案适用于这种特殊情况,但这是一个更通用的解决方案:
创建从第二个元素到行尾的视觉选择。然后,通过包含\%V
:
:'<,'>s/\%V:/;/g
或者,您可以使用vis.vim plugin
:'<,'>B s/:/;/g