Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim键映射:如何将{rhs}设置为函数返回的字符串值_Vim - Fatal编程技术网

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

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 ':

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

对于.pl文件:
: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在这里。请参阅我的另一个答案。非常感谢这两个答案!