我有一个特定于文件类型的映射,用于在当前缓冲区中执行代码。
对于.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手写的映射相同的映射。
答案 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
更容易)。