Vim:在小于一行的范围内替换

时间:2012-11-08 22:51:07

标签: vim replace substitution

假设我有以下代码行:

something:somethingElse:anotherThing:woahYetAnotherThing

我想用: 替换每个;,但第一个除外,这样该行看起来像这样:

something:somethingElse;anotherThing;woahYetAnotherThing

有没有办法使用:[range]s/[search]/[replace]/[options]命令执行此操作而不使用c选项来确认每次替换操作?

据我所知,s作用的最小范围是一行。如果这是真的,那么执行上述任务的最快方法是什么?

3 个答案:

答案 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 ; ;

然后你可以反复按; 直到你到达行尾。

(你选择更换分号会让这有点令人讨厌)

说明:

  • f - 转到第一个冒号
  • ; - 转到下一个冒号(重复在线搜索)
  • r ; - 用分号替换当前字符
  • ; - 重复最后一次在线搜索(再次)
  • - 重复上一个命令(用分号替换当前字符)

长话短说:

  • f x - 移至当前行的下一次出现x
  • ; 重复上一次内联搜索

答案 2 :(得分:2)

虽然其他答案适用于这种特殊情况,但这是一个更通用的解决方案:

创建从第二个元素到行尾的视觉选择。然后,通过包含\%V

将替换限制为可视区域
:'<,'>s/\%V:/;/g

或者,您可以使用vis.vim plugin

:'<,'>B s/:/;/g