Vim:为什么“:normal!i”不能进入插入模式?

32

vim中,如果我从命令行执行以下操作

:normal! i

vim无法进入插入模式。同样的命令

:normal! A

将光标移到行末,但光标仍处于插入模式。

有没有想法为什么这不起作用?如果无法解决,我想知道从vimscript函数体中进入插入模式的替代方法(当然,希望在函数返回后插入模式仍然存在)。

编辑:看起来:startinsert可以完成第二个问题,但我仍然想知道如何执行:normal! A:normal! a以及为什么它们不能按预期工作。使用箭头移动模拟"添加"是一个糟糕的解决方案,因为会出现空行等问题。


3
看一下:help feedkeys()。它比:normal更加灵活,但是按键会在脚本完成后再被处理。 - Raimondi
3个回答

40

普通命令认为在插入模式下结束是不完整的命令并会中止。从help normal

{commands}应该是一条完整的命令。如果{commands}没有完成命令,最后一个命令将被中止,就好像键入了<Esc><C-C>。在“:normal”繁忙时,不更新显示。这意味着必须完成插入命令(要启动插入模式,请参见:startinsert)。

:startinsert可能是您要寻找的命令。

通过向startinsert添加感叹号(),可以实现:normal A,正如Ingo Karkat建议的那样。来自help startinsert

当包括!时,它的作用类似于“A”,附加到行末。


谢谢,我刚刚也看到了 :startinsert。但是我怎么从vimscript函数中获取 :normal! A 或相等的命令呢? - Ein
运行您的常规命令,并以startinsert结尾,这样您就可以进入插入模式。 - Conner
为什么 normal! v 能够正常工作,但 normal! i 却不能?为什么 v 是一个完整的命令,而 i 不是? - Ciro Santilli OurBigBook.com
@cirosantilli:好问题,似乎有点不一致,可能是因为方便起见,但我在这里猜测。 - Thor

19

除了已经提到的startinsert,你还可以使用feedkeys()

call feedkeys('A', 'n')

这样做能够实现你想要的效果,但是通过这种方式添加的键只会在当前脚本/函数/映射等执行完成后才会被处理。


这是克服此错误https://github.com/neovim/neovim/issues/4895并使用vimscript在终端中进入插入模式的唯一解决方案。 - Sassan

11

使用:startinsert!指令代替:normal A。在帮助文档中有提到此方法。

对于:normal a,将光标移至右侧,然后执行:startinsert指令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接