1

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

对于 .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 手写的映射相同的映射。

4

2 回答 2

2

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

:execute 'nnoremap <buffer> <leader>r' GenerateCmd('perl')
于 2013-06-12T06:01:09.323 回答
0

缺少的部分是:help map-expr,其中{rhs}由 Vimscript 表达式确定:

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

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

于 2013-06-11T14:29:13.483 回答