ChatGPT解决这个技术问题 Extra ChatGPT

Vim:将光标移动到最后一个位置

vim

在 (g)Vim 中是否可以将光标移动到之前的位置(在正常模式下)?在以前的光标位置列表中来回循环的东西是理想的。但也只需切换到最后一个位置就足够了(类似于 bash 中的 cd - 和目录)。

这是一个小演示:

line |1| <- cursor position
line 2
line 3
line 4

假设我做了 2j,现在是这样的:

line 1
line 2
line |3| <- cursor position
line 4

现在我想按一些东西(显然 2k 除外)移回第一个位置,也可能移到以前的位置。


D
DrAl

最快的方法是点击:

''

(两个撇号)或:

``

(两个反引号)。请注意,不同之处在于反引号指向行上的相同位置,而撇号则指向行首。在英国键盘上,撇号更容易理解,所以我倾向于使用那个。像这样的有用标记有很多,请参阅:help mark-motions

对于其他一些动作(我认为不是 2j),还有可以让您在多个动作之间来回导航的跳转列表。 CtrlOCtrlI 执行此导航,但有关详细信息,请参阅 :help jump-motions


实际上,这些行为都不像我预期的那样,但我想没有其他可用的东西了。
@Idan K - ``(双反引号)怎么不能给你你想要的? (“历史”方面除外)。
@Dan:如果我在上面的示例中尝试,那么我会看到这种行为:我站在第 1 行,然后连续按 j 两次(现在我在第 3 行),然后按双反引号到达第 1 行我希望它移动到第 2 行。
我认为你必须移动(2j 或其他东西),然后编辑(或进行任何操作来修改文本)然后使用 '' 移回以前的位置。使用 "2j" 是不合逻辑的,什么都不做,回到之前的位置
@IdanK 只有在您使用实际的“跳转”时才会更新跳转列表(即记录之前的光标位置),这是(我认为)除了 i j k l 移动之外的任何运动命令。 (帮助文档中的完整列表是 "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file。)所以不,这不会“撤消”2j 或类似的东西,但它几乎适用于其他所有内容。这是有道理的,因为 2j 等人。已经有简单的反转(2k 等),而其他的则没有。
C
Community

您还可以使用 g;g, 在您以前的编辑位置列表中前后移动。

在非美式键盘上

在我的瑞士和德国键盘布局中,不方便地键入 ; 需要使用 Shift 键。因此,我将 g- 定义为 $MYVIMRCg; 的更方便的别名:

" Map g- as an alias for g;
nnoremap g- g;

虽然我非常喜欢这个,但它只会在一个文件的更改之间跳转。如果您编辑缓冲区 1,然后编辑缓冲区 2,它不会跳回缓冲区 1。
Z
ZhaoGang

为什么没有人发现 DrAl's answer 的问题? ''`` 并不能解决本帖的原问题!这两个命令不适用于像 2j 这样的光标移动,至少对我来说是这样。这会让 vim 的新手更加困惑。

'' 或 `` 和 CtrlI 或 CtrlO 的行为基于跳转列表。 2j 不会将位置更改保存到跳转列表中,因此这些命令不适用于 2j。

'' 或 `` 在最后位置和当前位置之间切换。 CtrlI 和 CtrlO 处理跳转列表历史。

G; g,移动编辑位置,这也是非常常用的。


感谢您指出了这一点!我想知道,那么对于像 2j 这样的情况,什么会起作用?
谢谢@ZhaoGang,这正是我想要的!
F
Facundo Casco

直接来自帮助(:help jump):

:ju[mps] 打印跳转列表(不是运动命令)。 {Vi 无此功能} {没有 |+jumplist| 才可用|功能} *jumplist* 跳转被记住在跳转列表中。使用 CTRL-O 和 CTRL-I 命令,您可以转到旧跳转之前的光标位置,然后再返回。因此,您可以在列表中上下移动。每个窗口都有一个单独的跳转列表。最大条目数固定为 100。{如果没有 |+jumplist| 则不可用|特征}