10

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

foo b[a]r

where[]表示光标位置

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

foo [b]ar

这有优势吗?

4

5 回答 5

6

VIM 常见问题解答

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 上定位到左侧,请参阅此vim 提示。

于 2013-07-31T16:20:59.340 回答
5

Your initial "state" is wrong, this is what you get in insert mode:

bar[]

In insert mode, the cursor is between characters while it is on a character in normal mode. When you leave insert mode, the cursor has to be on a character: what character could it be? The one on the left of the insert mode cursor or the one on the right? How is Vim supposed to decide which side is the good one?

One hint would be the command used to enter insert mode: leaving insert mode after i could probably leave the cursor on the left side and a could probably leave it on the right side. But, what would be the point of having the cursor on the character that's on the right of the last character we typed?

Anyway, insert mode is for inserting text exclusively. i<Esc> or a<Esc> make no sense and serve no practical purpose. On the other hand:

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

makes a lot more sense than:

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

Doesn't it?

于 2013-07-31T16:23:55.560 回答
3

我看不出比只打字有直接的优势h

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

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

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

于 2013-07-31T15:26:18.187 回答
3

好吧,约定是 vim 与我们习惯的不同。例如,请参阅默认设置的paste工作方式。如果您按p- 被拉出的文本出现在光标之后,而不是像我们习惯的那样出现在光标处。

光标位于末尾的什么位置paste?它位于新文本结尾之前的一个字符!所以如果你想在文本之后继续写你需要向右移动然后按i

您只需切换到认为实际光标是比您看到的那个更靠右(或靠下)的一个字符。这就是 vim 约定。

如果您开始使用a/o默认进入插入模式而不是i/ O,它可能会帮助您做到这一点。只需转换您的想法,因此a是默认设置,然后粘贴,光标退出insert模式的位置以及许多其他事情会更有意义。

编辑

多说几句话来实际回答您的问题(而不是帮助您应对行为)

vim 中最重要的特性是行为的一致性。目标是让您无需看屏幕即可确切知道会发生什么。

那么,当你退出insert模式时,光标应该在哪里呢?不能在文本之后,因为如果文本在行尾结束,光标就无法到达那里!(不能在行尾之后)。相同paste- 如果您在行尾粘贴,则生成的光标不能在插入的文本之后!。

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

vim 的许多行为可以这样解释:为什么 '^' 让你到达第一个字符而不是 one-before-first?(这样a插入就可以了,就像它一样paste$等等)因为如果第一个字符位于行首 - 你不能去“一个在它之前”。你想保持一致。

于 2013-07-31T16:14:13.557 回答
2

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

于 2013-07-31T15:26:43.557 回答