在vim中,当我退出编辑模式时,是否可以防止插入符号移回?


9

在vim中,如果我不做任何事情就进入和退出编辑模式,则插入符号将向左移动一个字符。如果我进入和退出追加模式,则插入符号会向前移动,然后向后移动。

在这些情况下,有什么方法可以配置vim以使插入符号不起作用?

理想情况下,我只想始终进入附加模式,但在进入或退出模式时不移动插入符号。

(当前,我通常使用插入模式,因为它不会在进入时弄乱我的插入符号位置。也就是说,除非我需要追加到行尾,在这种情况下,我以一种过时的方式向vim发誓,请按Esc键并进入附加模式。)


1
这个问题的答案很好。我只想指出,如果他们的假设正确,那就是您使用i进入编辑模式,这就是导致倒退的原因。如果您使用“ a”(而不是A),它将按预期工作。
约翰尼

@约翰尼,我认为不会。我通常处于“正常”模式,在文件和其他内容之间移动。当我需要进行编辑时,我先将插入标记定位,然后按“ a”,然后发现我将其放置错误,因为它向右移动。鉴于我将99%的编辑时间都花在了现代编辑器中,因此我永远不会记得在按“ a”之前在左边放置一个字符。这就是为什么我希望有一个宏之类的东西。
2011年

这是一个习惯问题。确实很烦人,但只有头几年。你最终会学会按ia不想想,也可以是甚至sSci",而不是限制ia
Luc Hermitte 2011年

1
我理解您的无奈。试着去思考你在做什么。问问自己是否有更好的方法(比起将Vim用作常规文本编辑器)。我发现Vim总是有更好的方法,Vim做事的方法。我们可以提供帮助,但是遇到问题时我们必须知道您在做什么。例如,当您要删除某些内容时,是否进入编辑模式?否,删除字符有“ x”。要替换字符,然后有“ r”。只要考虑一下您想要实现的目标。
约翰尼

@johnny我理解您在说什么,但这需要太多的重新学习才能对我有意义。我将99%的编辑时间都花在了Visual Studio中,我喜欢它。我只是知道我不会重新学习,所以没有浪费时间。
2011年

Answers:


9

这个问题在新的vi / Vim用户中经常被问到,答案是在正常模式下,光标总是在一个字符上,但是在插入模式下,光标总是在两个字符之间(记住,末尾-of-line是一个字符)。在控制台Vim中,您实际上也看不到它的插图,但是在GUI中,您会注意到进入插入模式时光标变成两个字符之间的小节,而在正常模式下光标不会变成字符上的障碍物。

因此,您看到的并不一定是当您离开插入模式时光标将一个字符移回,而只是移动到了一个字符上。唯一安全的移动方向是向左(或向后)。因此,您可以通过多种方式进入插入模式:

  • “ a”进入插入模式时,光标“位于”光标所在的字符与右边的下一个字符之间。
  • “ i”进入插入模式时,光标“位于”光标所在的字符与左侧的前一个字符之间。

有些人努力抑制了他们不喜欢的这种“运动”,但是它不可避免地会干扰他们希望将来运行的插件和其他Vim脚本。

我的建议是在适当的情况下习惯使用“ a”和“ i”(以及“ A”和“ I”)命令。

学习“ o”和“ O”命令也很有用。看到:

:help a
:help i
:help A
:help I
:help o
:help O

编辑:如果您仍然确定要更改此行为,请尝试以下提示:防止转义符将光标向左移动一个字符


1
我理解您的意思,但是“ i” /“ Esc” /“ i” /“ Esc”会导致插入符号的实际整体净移动。我真的认为VIM根本不适合我。
2011年

2
@romkyns:我认为您应该使用a而不是i
暂停,直到另行通知。

1
@Dennis同意,“ a”好一点,因为它允许插入号位于一行中的第一个字符之前和最后一个字符之后-“ i”任意禁止。但是我尝试过 发生的情况是,我总是在按“ a”之前放错插入符号-因此我必须立即将插入符号向左移动一个位置。每一次。它很累,所以我切换到“ i”。
2011年

@Heptite您能指出我一个错误的实现方式来抑制运动吗?将来我想使用插件或其他脚本的机会基本上为零。
2011年

1
@romkyns,它(不能)同时起作用。重新映射<esc>确实会阻止大多数插件<esc>正常使用,但是,当您使用其他返回正常模式的标准功能时,它会继续使您烦恼<esc>。学会动态使用正确的密钥是从长远来看可以扩展/工作的解决方案。
2011年

1

我认为克拉表示您的光标,如果您使用“ i”,它将直接插入光标所在的位置,“ a”(我相信您正在寻找)将光标向右移动一个字符。同样,shift-i(I)将转到行的开头,而shift-a(A)将一直到行的结尾。

如果我误解了您的问题,我深表歉意。


1

由于重新映射<ESC>被认为是“危险的”,因此我仅结合“ 避免转义”键方法之一,并在我的代码中包含以下内容.vimrc

 inoremap ii <ESC>l

注意:请确保在行尾没有空格字符。

简单,但经过完全认证为“对我来说很好”,因为这正是我手动输入的内容。

无论我使用a还是i仍然使插入符号退回行为,它都会使我烦恼不止,然后我想输入的下一个内容就是d$删除到行尾,等等。


非常简单的解决方案。我遇到的最好的。
Tyler Collier 2014年

1

这是我的解决方案:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

这很有趣。所有三个站点都存在相同的问题:SO,SU,Unix + Linux。


我觉得这很有趣:)幸运的是,我找到了一个不会让我发疯的编辑器(diakonos),所以这不再是一个问题。仍然为喜欢vim的人投票。
RomanSt 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.