Vim:为什么不":正常!我"进入插入模式?

Ein*_*Ein 21 vim insert mode

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

:normal! i
Run Code Online (Sandbox Code Playgroud)

vim不进入插入模式.同样的命令

:normal! A
Run Code Online (Sandbox Code Playgroud)

将光标移动到行尾,但光标仍处于插入模式.

任何想法为什么这不起作用?如果不这样,我想知道从vimscript函数的主体进入插入模式的另一种方法(并且当函数返回后,插入模式仍然存在).

编辑:看起来:startinsert会填满问题的第二部分,但我仍然想知道我怎么能做类似的事情:normal! A,:normal! a以及为什么那些不能简单地按预期工作.用箭头运动模拟"附加"是一个糟糕的解决方案,因为像空行等等.

Tho*_*hor 29

普通命令认为以插入模式结束为不完整命令并中止.来自help normal:

{commands}应该是一个完整的命令.如果{commands}未完成命令,则最后一个命令将被中止,就像 输入<Esc><C-C>输入一样.":normal"忙时,显示不会更新.这意味着必须完成一个insert命令(要启动Insert模式,请参阅:startinsert)

:startinsert 可能是你正在寻找的命令.

:normal A可以通过附加一个bang(!)来实现startinsert,正如Ingo Karkat所建议的那样.来自help startinsert:

当...的时候 !包含它的工作方式像"A",附加到该行.


ZyX*_*ZyX 16

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

call feedkeys('A', 'n')
Run Code Online (Sandbox Code Playgroud)

你会做你想做的事情,但是这种方式添加的密钥只有在执行当前脚本/功能/映射/等完成后才会被处理.


Ing*_*kat 8

而不是:normal A,使用:startinsert!(带!).它在帮助中提到.

对于:normal a,将光标向右移动,然后执行:startinsert.