移动到搜索查找的开头和结尾。

39
在 vim/gvim 中,我想要移动到当前搜索结果的前面和后面。这是否可能?
例如,对于此文件:
A dog and a cat
A hat and a bat
我想能够执行搜索,例如/dog\sand,然后能够从'dog and'表达式的开头到结尾进行移动,并返回,以便我的光标从单词“dog”的字母“d”下方的第3列开始,然后移动到字母“and”或单词“and”的字母“d”下方的第9列。
我之所以要这样做,是因为我想搜索一个表达式,然后使用改变命令c和移动命令相结合替换该特定搜索表达式。 我不想在这里使用substitute和replace,而是想使用change命令和移动键执行此操作。
4个回答

55
你正在寻找cgn。来自:help gn的信息:
Search forward for the last used search pattern, like
with `n`, and start Visual mode to select the match.
If the cursor is on the match, visually selects it.
If an operator is pending, operates on the match.
E.g., "dgn" deletes the text of the next match.
If Visual mode is active, extends the selection
until the end of the next match.

这样做的美妙之处在于您可以使用cgn来执行命令,然后使用.重复该命令,并且是的,它将在下一个搜索模式匹配上执行相同的操作。当您开始使用复杂的正则表达式进行搜索时,这变得非常有用。


谢谢你,黑客,为回答问题而感谢你。搜索引擎会带我们找到相关的问题,但往往我们会发现“不是这个,而是那个”。你的回答非常准确,“美丽之处在于……”,这就是我知道这就是我要搜索的问题的原因。 - Bruno Bronosky

31

尝试这个:

/pattern<cr> to place the cursor at the start of search pattern
/pattern/e<cr> to place the cursor at the end of search pattern

我该如何将此用作移动命令?我知道这可以让我搜索到表达式的末尾,但它不是一个移动命令。 - Pan Thomakos
很抱歉这里的“移动”一词可能会引起混淆。/pattern<cr>将把光标放置在搜索模式的开头。而/pattern/e<cr>将把光标放置在搜索模式的结尾 - anubhava
1
没错,但这怎么能用作移动命令呢?请看我的原始问题。例如,我不能使用您的答案来进行更改命令。 - Pan Thomakos
搜索就是动作。答案并不是很好,因为有一个“最后一次搜索模式”的速记符号: // - Quinn Strahl
5
请注意,由于我有点困难:如果您使用?,则需要使用?pattern?e - Ven
显示剩余2条评论

22

您可以使用c//e<CR>跳转到匹配项的结尾,而//<CR>将带您到下一个匹配项的开头。您可能想要为这些绑定设置一些实用的绑定。例如,我刚刚尝试了以下内容,它似乎很好用:

:onoremap <silent>m //e<CR>

这样你就可以用cm来表示更改匹配项。虽然我不确定应该把//<CR>映射成什么,但我已经尝试将其映射为n,并且似乎工作得很好。不知道这会不会对你造成问题。

:nnoremap <silent>n //<CR>

2
这有点不好,因为它覆盖了默认的 Vim 行为,变得不太有用;例如,您将无法执行 [count]n - Quinn Strahl
同意。另一个回答中提到的gn命令要好得多,但我认为它在2011年5月还不存在。 - Austin Taylor
@AustinTaylor 感谢你提供的 //e<CR> 和 //<CR>,我一直在尝试找到如何跳转到搜索文本末尾的方法。而使用句点进行重复替换的 cgn 真是太棒了。Vim 真是太厉害了。 - kjl
请使用@QuinnStrahl的答案,它正是vim用户在这里想要的,并且适用于几乎所有相关情况。这并不针对Austin,他找到了一些可以适用于某些类似情况的东西,并且及时地为提问者解决了问题。 - Starman

-2

既然你知道你要搜索多少个单词,为什么不使用单词移动命令直接前往并返回呢?例如,“2w”前往当前搜索结果的末尾,“2b”返回。


2
我可以在简单的示例中做到,但在更复杂的情况下就不那么容易了。如果搜索表达式包括标点符号和数字怎么办? - Pan Thomakos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接