Vim键映射:如何将{rhs}设置为函数返回的字符串值
我有一个特定于文件类型的映射,用于在当前缓冲区中执行代码 对于.pl文件:Vim键映射:如何将{rhs}设置为函数返回的字符串值,vim,Vim,我有一个特定于文件类型的映射,用于在当前缓冲区中执行代码 对于.pl文件: :nnoremap r:!回声“输出:”;perl% 对于.py文件: :nnoremap r:!回声“输出:”;python% 正如您所看到的,{rhs}只在解释器名称('perl','python'等)上有所不同。所以,我写了一个函数来生成它 " Creates command-string to run code in buffer. function! GenerateCmd(prg) return ':
:nnoremap r:!回声“输出:”;perl%
对于.py文件:
:nnoremap r:!回声“输出:”;python%
正如您所看到的,{rhs}只在解释器名称('perl','python'等)上有所不同。所以,我写了一个函数来生成它
" Creates command-string to run code in buffer.
function! GenerateCmd(prg)
return ':!echo "OUTPUT:"; ' . a:prg . ' %<cr>'
endfunction
“创建命令字符串以在缓冲区中运行代码。
函数!GenerateCmd(prg)
返回':!echo“输出:”;'.a:prg.'%
端功能
这就是我遇到的问题。如何将{rhs}设置为GenerateCmd()
返回的字符串值
例如:
:nnoremap r=GenerateCmd('perl')
创建的映射与我在上面为perl编写的映射不同。拼图中缺少的部分是:help map expr
,其中{rhs}
由Vimscript表达式确定:
:nnoremap <buffer> <expr> <leader>r GenerateCmd('perl')
:nnoremap r GenerateCmd('perl'))
请注意,表达式必须返回实际键,因此在函数中使用
“…”
而不是“…”
;在双引号中,可以使用转义特殊键表示法(这比嵌入实际的^M
更容易)。当命令是静态命令时(也就是说,不需要在每次映射调用时对其重新求值),您可以使用:execute
,它允许将字符串作为Vimscript命令求值:
:execute 'nnoremap <buffer> <leader>r' GenerateCmd('perl')
:执行'nnoremap r'GenerateCmd('perl')
谢谢你的帮助!不过有一点细微的区别。每次使用r
都会调用GenerateCmd('perl')
,而我希望函数在理想情况下只调用一次,以获取给定文件类型的常量命令字符串。虽然这不会对性能造成影响,但我很好奇这是否可能。我不完全确定您的命令是否为常量,所以我选择了更通用的解决方案;您说得对,这并不重要r在这里。请参阅我的另一个答案。非常感谢这两个答案!