首页 > 解决方案 > 为什么按退出键会返回一个字符?

问题描述

在 vim 中,我一直很好奇为什么按下esc键会导致光标返回一个字符(通常)。例如,如果我输入:

This is |

光标为|,在我完成输入并按 后esc,该行将如下所示:

This is|

并且要从我离开的地方重新输入,我必须按a而不是i. 为什么这是 vim 中的预期行为?

标签: vim

解决方案


我在 Unix & Linux Stack Exchange 上的这个问题中找到了以下答案:

在插入模式下,光标在字符之间,或者在第一个字符之前或最后一个字符之后。在正常模式下,光标位于一个字符上(换行符不是用于此目的的字符)。这有点不寻常:大多数编辑器总是将光标放在字符之间,并让大多数命令作用于光标之后(严格来说,不是在 下)的字符。这可能部分是由于在 GUI 之前,文本终端总是将光标显示在字符上(下划线或块,可能闪烁)。这种抽象在插入模式下失败,因为这需要多一个位置(帖子与围栏)。

可以这么说,在模式之间切换必须将光标移动半个字符。该i命令向左移动,将光标放在它结束的字符之前。a命令向右移动。如果可能,退出插入模式(通过按Esc)将光标向左移动(如果它位于行首,则改为向右移动)。

我想这种Esc行为是有道理的。通常,您在行尾输入,并且Esc只能向左走。所以一般行为是最常见的行为。

将光标下的字符视为最后一个有趣的字符,将插入命令视为a. 您可以在不移动光标的情况下重复 a Esc,但如果您从非空行的开头开始,您将被向右碰撞一个位置。

归功于原作者。

如果您想编辑此行为,您可以遵循@ib 的建议。在这个答案中:

尽管我不建议更改默认游标机制,但实现相关行为的一种方法是使用以下插入模式映射。

:inoremap `^

这里Esc键在插入模式下被重载,以额外运行将`^光标移动到上次离开插入模式的位置的命令。由于在此映射中,它在离开插入模式后立即执行Esc,与默认行为相比,光标向右左一个字符。

与其他一些变通方法不同,此变通方法不需要使用该+ex_extra功能编译 Vim。


推荐阅读