如果将<cr>重新映射到函数,如何调用函数中的原始<cr>?</cr> </cr>

时间:2011-01-23 14:26:55

标签: vim

我尝试编写vimscript,当用户按下<cr>(正常模式和插入模式)时会执行某些操作,但不会影响{{1}的正常效果},即插入换行符并将光标移动到下一行的右侧位置(尊重智能缩进或任何其他缩进模式)。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

尝试在可能的情况下省略*map,您将不会遇到此类问题。这将按预期工作:

function s:DoSomething()
    echom "Inside DoSomething"
    return "\<CR>"
    " return "\n" also works "
endfunction
inoremap <expr> <CR> <SID>DoSomething()
" If DoSomething function cannot be executed inside a textlock: "
inoremap <CR> <C-o>:call <SID>DoSomething()<CR><CR>

注意nore,它会阻止<CR>返回的s:DoSomething再次被替换。

答案 1 :(得分:0)

映射的右侧需要以<cr>开头。像这样:

:imap <cr> <cr>sometext   

然后它不会递归地触发映射。

来源: http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial%28Part_1%29#Nested_.28recursive.29_maps

如果地图的{rhs}以{lhs}开头,则不会以递归方式替换它。例如,以下命令不会为gq:

创建递归映射
:nmap gq gq