Vim键映射:如何将{rhs}设置为函数返回的字符串值

时间:2013-06-11 13:31:51

标签: vim

我有一个特定于文件类型的映射,用于在当前缓冲区中执行代码。

对于.pl文件: :nnoremap <buffer> <leader>r :!echo "OUTPUT:"; perl %<cr>

对于.py文件: :nnoremap <buffer> <leader>r :!echo "OUTPUT:"; python %<cr>

如您所见,{rhs}仅在解释器名称('perl','python'等)上有所不同。所以,我写了一个函数来生成它。

" Creates command-string to run code in buffer.
function! GenerateCmd(prg)
    return ':!echo "OUTPUT:"; ' . a:prg . ' %<cr>'
endfunction

这就是我被卡住的地方。如何将{rhs}设置为GenerateCmd()返回的字符串值?

例如::nnoremap <buffer> <leader>r =GenerateCmd('perl')不会创建与我为上面的Perl手写的映射相同的映射。

2 个答案:

答案 0 :(得分:2)

当命令是静态的(即不需要在每次映射调用时重新评估)时,可以使用:execute,它允许将字符串计算为Vimscript命令:

:execute 'nnoremap <buffer> <leader>r' GenerateCmd('perl')

答案 1 :(得分:0)

这个谜题的缺失部分是:help map-expr,其中{rhs}由Vimscript表达式确定:

:nnoremap <buffer> <expr> <leader>r GenerateCmd('perl')

请注意,表达式必须返回实际键,因此代替'...<cr>'在函数内使用"...\<cr>";在双引号内,您可以使用转义的特殊键表示法(这比嵌入实际的^M更容易)。