1

在 Vim - Tutorial (Part 1) - 6.2 Insert mode maps 中关注 Mapping keys ,它说:

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>

我正在尝试使用它来调用SingleCompile#Compile()

map! <F5> <C-R>=SingleCompile#Compile()<CR>

它正在工作,但问题是当我回到插入模式时,0会插入一个字符作为副作用。

为什么会这样,我该如何避免?

编辑:

我正在使用它是<C-R>因为它不会创建撤消点,并且其目的是调用函数而不是像<C-O>这样输入命令。我不想创建撤消点。

编辑:

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

4

3 回答 3

2

函数的隐式返回值为0. 您需要修改SingleCompile#Compile()或编写一个返回空字符串的包装器:

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

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

另一种巧妙的技巧是评估?:三元运算符内部的函数:

map! <F5> <C-R>=SingleCompile#Compile()?'':''<CR>
于 2012-07-27T11:07:37.860 回答
1

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

使用 <CO> 而不是 <CR> 离开命令的插入模式

于 2012-07-27T10:49:48.207 回答
0

我不推荐这种方法,但是乡巴佬解决方案怎么样(只是删除0事后):

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

说真的,对于那些<C-R>不能使用的情况,你必须离开插入模式,:undojoin可能会有所帮助。

于 2012-07-27T11:17:29.347 回答