在vim中,如何回到之前搜索的位置?

285

在vim中编程时,我经常需要搜索某些内容,将其复制到剪贴板,然后回到原来的位置,将其插入并进行修改。

问题是,在搜索和查找之后,我需要手动找回原来的位置。

是否有一种自动回到上一次搜索位置的方法?


可能是将光标移动到其最后位置的重复问题。 - Simone Carletti
7个回答

448

Ctrl+O带我回到先前的位置。不知道搜索之前的位置。

编辑:另外,`.会把你带到上次更改的位置。


2
似乎按下足够多次CTRL+O也会开始带您回到先前打开的文件。 - Mark Biek
1
Ctrl+O是我首选的方法。我经常使用它,希望其他编辑器也能复制它的行为。 - amrox
54
是的,CTRL-O和CTRL-I似乎可以带你回到你去过的地方,不错。 - Edward Tanguay
8
如果你使用标签进入某个页面,按下Ctrl+T将使你返回该页面。但是如果你在没有使用标签的情况下进行搜索,按下Ctrl+T将会带你回到先前的页面,而不是搜索时所在的页面。请注意,此处的“标签”指的是网页浏览器中的标签页。 - Nathan Fellman
1
我发现如果通过:70:100跳转,按一次ctrl+o会回到原始位置,而不是第70行。 :( - WhyNotHugo
显示剩余2条评论

102

使用``返回到搜索/跳转之前的确切位置,或使用''返回到搜索/跳转之前所在行的开头。


4
只有在第一个匹配时才能正常工作,如果转到后续匹配,则不会跳回起点。 - Kris
如果您进行了搜索并进行了更改,会发生什么? - Costa Michailidis
3
你还可以使用g;g,,它能跳转到上一个/下一个修改处的位置。 - goetz

48

我一直通过设置标记来完成这个。

  1. 在命令模式下,按m[字母]。例如,ma 使用a作为标记标识符在当前行设置标记。

  2. 要返回到标记,请按' [字母]。例如,'a将您带回到步骤1中设置的行标记。要返回到标记所在行的列位置,请使用`a(反引号[字母])。

要查看当前设置的所有标记,请键入:marks


稍微不相关的是,我刚发现关于标记的另一个巧妙的事情。

假设您通过执行mb跳转到标记b。 Vim会自动将标记'(单引号)设置为跳转到标记b之前所在的任何行。

这意味着您可以通过'b跳转到该标记,然后通过''(2个单引号)返回到之前的位置。

我是通过使用:marks命令意外发现的,该命令显示所有标记的列表。


6
幸运的是,由于Vim可以特别跟踪某些位置并通过``、^O等方式让你访问它们,因此通常不需要使用书签。 - aehlke
标记似乎只能将我带到设置它的那一行的开头。): - john-jones
2
@HermannIngjaldsson 你可能已经明白了,但是使用 ' 可以带你到标记的行,而 ` 可以带你到确切的位置。 - azmr

44

你真的应该阅读:help jumplist,它非常清楚地解释了所有这些。


1
我最喜欢这个答案,因为在 :help 中有很多信息是大多数人不知道的(直到最近我也不知道)。 - Christian Stewart
1
太棒了!这真的很有帮助。使用<C-o>和<C-i>可以在最近访问过的位置之间进行循环。默认情况下,它可以跨缓冲区工作 :) - Costa Michailidis
非常感谢您提供了根本答案,使用了术语"jumplist"并指向了非常有帮助的文档。我之前完全不知道这是使用的范例。 - undefined

38

CTRL+OCTRL+I,用于向前和向后跳转。


8
我使用这个:
nnoremap / ms/
nnoremap ? ms?

如果我使用 / 或者 ? 进行搜索,我可以通过按下 `s 快速返回。你可以将字母 s 替换为任何你喜欢的字母。


这里唯一的注意事项是,它会破坏在窗口中搜索的功能,例如在NerdTree中,m被定义为除标记之外的其他内容,在NerdTree中,它是菜单。 - Kris

7
最简单的方法是使用m[letter]来设置标记,然后使用'[letter]回到该标记。

当我搜索vim技巧时,能看到你的帮助真是太棒了。我最近更多地使用ctrl-o和ctrl-i,因为它们可以更轻松、更自动地来回切换。 - MattK

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