Vim / Vi中是否有命令将光标移动到搜索突出显示的末尾?


84

Vim / Vi中是否有任何命令可在选定的搜索段内移动?

例如,如果我搜索一个单词,是否有任何命令将光标移动到突出显示的段的末尾?假设我有一个单词“ FishTaco”,我想搜索“ Fish”的所有实例并在其后插入一些内容。我知道我可以进行全局替换,但是如果我只想在几个非顺序实例中进行更改怎么办?

我可以看到将光标移动到当前突出显示的段的末尾以执行操作的方便之处。


3
这不是一个问题的答案,但要实现你的更换所有的终极目标FishFishTaco,你可以做:%s/Fish\(Taco\)\@!/&Taco/,这将发现每一个Fish尚未之后Taco,取而代之的是FishTaco。将否定超前搜索与包含相匹配的词项(后跟)的替换组合在一起Taco
Jim Stewart

@JimStewart我不知道为什么这个评论没有至少+1的答案。这是忍者级的vim。
Still.Tony

Answers:


133

您可以这样做:

/Fish/e

/e在搜索区域(而不是默认的第一个字符结束在年底登陆你的光标。


32
请注意,您可以添加+ n-n将光标n个字符放在末尾之前或之后。
内森·费尔曼

10
值得一提的是,完成/Fish搜索后,您可以跳到//eVim 7.4的末尾,并可以从gn视觉上突出显示找到的结果。
smathy 2014年

也可以看看@ghbarratt答案,还有更多选项可将光标放在突出显示的匹配项上。
尼玛

81

如果您只想将光标放在Fish的最后一个字符之后,则可以使用

/Fish/e+1

这会将您的光标放在h后面。(没有+1光标,光标将停在最后一个字符的左侧。)

如果您特别希望将光标放在Fish后面,但仅当光标出现在“ FishTaco”中时,则可以尝试以下选项之一:

您可以使用

/FishTaco/s+4

您的光标将最终移到Fish和Taco之间。该/s+4搜索词开始后4位将光标置于。

您也可以使用

/FishTaco/e-3

这会将您的光标放在最后一个(结束)字符左侧的3个位置。

您也可以使用

/FishTaco/b+4 

因为/b+4将被视为/s+4


13
很好的解释,但是现在我饿了。
肯尼2012年

27

如果您已经搜索过/Fish,则可以通过迅速将搜索更改为匹配的结尾//e,该操作会重复上一次搜索,但会附加e已经说明的修饰符。


1
// e + number正是我想要的!太棒了
arkod

12

/ long-regexp1 \zs long-regexp2 / ..光标将停在\ zs上,请参阅:help \ zs


11

进行视觉选择后,可以使用o来在所选块的开始和结束之间切换光标位置。当选择线是逐这样可以在线位置的,即光标移动到选择的起始和结束行但不与开始或结束字符。如果选择的是按字符排列的,则移动也将按字符排列。

您也可以使用`<`>在可视块的开始和结束之间切换光标,但是这会影响选择本身,因此可用于重置或调整选择范围。

编辑:啊,但是对于搜索突出显示这是行不通的,因为o它将启动行插入。我猜搜索突出显示与视觉选择不同,抱歉:)


我也不知道 无需重新开始即可修改选择的开始,这非常好。(例如,你过早或过晚开始选择一个词)
Timothée鲍彻

8

问题的“比赛结束时的光标”部分已得到回答。

你可以做的:%s/Fish/FishTaco/c。这使您有机会确认或拒绝每项替换,并跳过整个“比赛结束时的光标”业务。


很棒的提示。如果输入“ y”,它将仅在第一个执行替换。如何确认每一个?
乔丹·帕默

1
它将转到下一个匹配项,并等待您键入yn等等,直到没有匹配项为止。要接受所有其他替代,请键入a,以拒绝它们,请键入q
romainl 2012年

1
实际上,我错过了g决赛之后的比赛,/因此比赛没有继续进行。谢谢你的提示。
乔丹·帕默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.