我有一个使用setline()的函数。为简单起见,我们称之为
function! MyFunc()
call setline( ".", "test" )
endfunc
我想从映射中调用此函数(使用,,
)。我知道map <expr> ,, MyFunc()
因为setline()调用而无效。原则上imap ,, <C-R>=MyFunc()
确实有效,但我通常会从正常模式调用此函数,而不是插入模式。
是否有任何东西可以让我在正常模式下调用函数或使用表达式寄存器?
答案 0 :(得分:5)
要调用该函数,请按如下所示更改映射。
:nnoremap ,, :call MyFunc()<cr>
通常,表达式映射对于在插入模式下使用很有用,因为它
允许根据动态改变按键的顺序
一个特例。如果要使用表达式寄存器来插入文本
在正常模式下进入缓冲区,您应该使用适当的正常模式命令
插入或更改文本(例如,i
,I
,a
,A
),然后是
表达式寄存器评估要插入的文本。所以,映射
:nnoremap ,, cc<c-r>=MyFunc()<cr><esc>
如果函数MyFunc()
返回,则将与第一个具有相同的效果 包含要插入的文本的字符串:
function! MyFunc()
...
return 'text for inserting'
endfunction