2011-09-16 86 views
4

我有一個使用setline()的函數。爲簡單起見,我們把它叫做使用setline()從正常模式映射調用vimscript函數

function! MyFunc() 
    call setline(".", "test") 
endfunc 

我想從一個映射調用這個函數(使用,,)。由於setline()調用,我知道map <expr> ,, MyFunc()不起作用。原則上,imap ,, <C-R>=MyFunc()確實起作用,但我通常會從正常模式(而不是插入模式)調用此函數。

有沒有什麼能讓我在正常模式下調用函數或使用表達式寄存器?

回答

5

爲了調用該函數,請按如下所示更改映射。

:nnoremap ,, :call MyFunc()<cr> 

一般地,表達的映射是用於使用在插入模式,因爲它 允許根據 一個特定的情況下動態地改變的按鍵序列是有用的。如果你想使用表達式寄存器插入文本 到正常模式的緩衝區,你應該使用合適的普通模式命令 插入或更改文本(例如,iIaA),其次是 表達式寄存器評估插入的文本。因此,映射

:nnoremap ,, cc<c-r>=MyFunc()<cr><esc> 

必須與第一個相同的效果,如果插入函數MyFunc()返回包含文本字符串 :

function! MyFunc() 
    ... 
    return 'text for inserting' 
endfunction