Vim查找最后一次出现的位置

45
在一个大缓冲区中,我想滚动到模式pattern的最后一次出现。
如果我在第一次出现的位置,那么很容易搜索模式/,然后使用n的相反方向移动到下一个出现位置,再使用N到达最后一次出现。
如果我处于一系列的出现位置中间... 是否有更好的跳转方式?
4个回答

92

找到最后一个出现位置的简单方法是跳转到末尾并向后搜索:

G?foo<CR>

实际上,如果你已经在搜索某些内容,有一种更简单的方法。只要直接跳到末尾,反向搜索你刚才正在寻找的东西

GN

就这么简单。

编辑:如果你的搜索出现在文本的最后一行,那么GN会跳过它到倒数第二次出现的地方。使用ggN可以解决这个问题。(而gg?foo<CR>出于类似的原因也是如此。)


哈,我觉得我的答案和你的第二点一样。当我写我的答案时没有看到那个点。删掉我的,支持你的!+1 - Kent
5
我建议使用 ggN,即使需要按一个额外的键。因为 GN 只有在最后一个匹配项不在文件的最后一行时才起作用。如果匹配项在最后一行,使用 N 会跳过它。 - Kent

5
您可以尝试通过 "?" 进行向后搜索。
:1?SEARCH_PHRASE

1
假设使用了 :set wrapscan,我更喜欢使用 1G?search_pattern,因为它不依赖于 vim。 - Kajukenbo

5
一个更长的解决方案:
:vim foo % | clast

type clast -> -bash: type: clast: 未找到命令 - Robottinosino
我假设 clast 是一个应该在 $PATH 上的程序?如果是这样,我尝试使用 type 来定位它(就像 which),但它给了我那个错误信息。clast 是什么? - Robottinosino
1
你在说什么?:clast 是一个 Vim 命令,用于跳转到快速修复列表中的最后一项。请阅读:h :clast - romainl

0

另一个解决方案是:

G/\(.\{-}\zs\(foo\)\)\{1,}<CR>

@StackOverflowed,你是什么意思? - Reman
抱歉,我只是想理解它 :)。 - StackOverflowed

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