为什么离开插入模式会将光标位置向左移动

时间:2013-07-31 15:01:03

标签: vim

当我们在vim中处于插入模式时:

foo b[a]r

其中[]表示光标位置

然后我们回到正常模式,光标向左移动一个位置:

foo [b]ar

这有优点吗?

5 个答案:

答案 0 :(得分:6)

来自VIM FAQ

10.2. In insert mode, when I press the <Esc> key to go to command mode, the
 cursor moves one character to the left (except when the cursor is on
 the first character of the line). Is it possible to change this
 behavior to keep the cursor at the same column?

No. It is not possible to change this behavior. The cursor is *always*
positioned on a valid character (unless you have virtual-edit mode
enabled). So, if you are appending text to the end of a line, when you
return to command mode the cursor *must* drop back onto the last character
you typed. For consistency sake, the cursor drops back everywhere, even if
you are in the middle of a line.

You can use the CTRL-O command in insert mode to execute a single ex
command and return back to insert mode without moving the cursor column.

如果您想在.vimrc中更改此行为并仅在EOL上向左移动,请参阅this vim提示。

答案 1 :(得分:4)

您的初始“状态”是错误的,这是您在插入模式下获得的:

bar[]

在插入模式下,光标在字符之间,而在正常模式下 on 字符。当你离开插入模式时,光标在一个字符上:它可能是什么字符?插入模式光标左侧的那个或右侧的那个? Vim应该如何决定哪一方是好方?

一个提示是用于进入插入模式的命令:在i可能将光标留在左侧并且a可能将其留在右侧之后保留插入模式。但是,将光标放在我们输入的最后一个字符右侧的字符上会有什么意义呢?

无论如何,插入模式仅用于插入文本 i<Esc>a<Esc>毫无意义,没有实际意义。另一方面:

Lorem[] dolor sit amet.
Lorem ipsum[] dolor sit amet.
<Esc>
Lorem ipsu[m] dolor sit amet.

比以下更有意义:

Lorem[] dolor sit amet.
Lorem ipsum[] dolor sit amet.
<Esc>
Lorem ipsum[ ]dolor sit amet.

不是吗?

答案 2 :(得分:3)

嗯,惯例是vim与我们习惯的不同。例如,请参阅默认paste的工作原理。如果按p - 在我之前,光标在光标后面而不是光标处出现。

光标位于paste的末尾?它位于新文本结尾之前的一个字符!因此,如果您想继续在文本后面写字,则需要向右移动,然后按i

您需要切换到认为实际光标是右侧(或下方)的一个字符而不是您看到的字符。这就是vim惯例。

如果您开始使用a / o默认情况下输入插入模式而非i / O,则可能会对您有所帮助。只需转换您的想法,a是默认值,然后粘贴,光标退出insert模式的位置,以及其他许多内容将更有意义。

修改

再多说几句话来回答你的问题(而不是帮助你应对这种行为)

vim中最重要的功能是行为的一致性。目标是让您在不看屏幕的情况下准确了解会发生什么。

因此,当您退出insert模式时,光标应该在哪里?它不能在文本之后,因为如果文本在行的末尾结束,则光标无法到达那里! (不能行结束后)。对于paste也是如此 - 如果粘贴在一行的末尾,则结果光标不能在插入的文本之后!。

由于一致性要求 - 如果它有时不能在插入的文本之后,那么就不应该存在。否则,如果你在不看屏幕的情况下打字,你就不知道光标在哪里 - 你必须抬头查看!

vim的许多行为都可以这样解释:为什么'^'会让你进入第一个角色,而不是先到先得? (这样a可以插入,就像paste$等一样,因为如果第一个字符在行的开头 - 你不能去“一个在它之前“。而且你希望保持一致。

答案 3 :(得分:2)

我没有看到仅仅输入h的直接优势。

向左观察到的移动是VIM中约定的副产品 - 始终将插入模式“向左” - 我觉得非常方便。

方便,因为有很多方法可以进入插入模式,并且做了一些插入后,我关心如何退出而不是如何进入插入模式。

有很多方法可以改变这种行为,参见这些SE帖子:

答案 4 :(得分:2)

可能是因为你只允许在书写区域移动光标,例如bar []在不插入模式时应该变为ba [r],但是你是对的,它不需要总是发生