插入模式下的VIM单编译命令

插入模式下的VIM单编译命令,vim,macvim,Vim,Macvim,我跟在后面,上面写着: The <C-R>= command doesn't create a new undo point. You can also call Vim functions using the <C-R>= command: :inoremap <F2> <C-R>=MyVimFunc()<CR> 它正在工作,但问题是当我回到插入模式时,0字符作为副作用被插入 这是为什么?我如何避免 编辑: 我之所以使用,是因为它

我跟在后面,上面写着:

The <C-R>= command doesn't create a new undo point.
You can also call Vim functions using the <C-R>= command:

:inoremap <F2> <C-R>=MyVimFunc()<CR>
它正在工作,但问题是当我回到插入模式时,
0
字符作为副作用被插入

这是为什么?我如何避免

编辑:

我之所以使用
,是因为它不创建撤消点,而是用于调用函数,而不是像
那样输入命令。我不想创建撤消点

编辑:


我已经根据Ingo Karkat提供的三元运算符技巧更新了VIM wiki。

0是函数的返回值,在插入模式下调用时会自然插入缓冲区


使用而不是退出COM的插入模式,函数的隐式返回值为
0
。您需要修改
SingleCompile#Compile()
或编写一个返回空字符串的包装器:

function! SingleCompileWrapper()
    call SingleCompile#Compile()
    return ''
endfunction

map! <F5> <C-R>=SingleCompileWrapper()<CR>

我不推荐这种方法,但redneck解决方案如何(只需在事后删除
0
):

地图=单编译#编译()

说真的,对于那些无法使用
且必须离开插入模式的情况,
:undocjoin
可能会有所帮助。

我之所以使用它,是因为它不会创建撤销点,并且其目的是调用函数,而不是像这样输入命令。我不想创建撤销点。谢谢你的“为什么”部分。我仍然希望得到一个理想的响应,忽略插入到缓冲区中的函数返回值。我认为您的解决方案已经基本实现,我只是不想每次都创建一个包装器。你知道我如何创建一个通用的包装器来调用我给出的函数吗?你的技巧对我不起作用,我在输入了多少函数后听到了错误的哔哔声?您可以使用funcref编写通用包装器,但映射不会变得更漂亮。也许附加
(就像我的另一个答案一样)真的是你的出路?!现在,我需要2个,但将来,我不知道。谢谢,你的把戏奏效了,我已经让变化发生了,已经忘记了。改回“已解决”。我将通过此测试,因为我不想:q!因为闪烁的0。但我会看看:加入,谢谢
function! SingleCompileWrapper()
    call SingleCompile#Compile()
    return ''
endfunction

map! <F5> <C-R>=SingleCompileWrapper()<CR>
map! <F5> <C-R>=SingleCompile#Compile()?'':''<CR>
map! <F5> <C-R>=SingleCompile#Compile()<CR><BS>