我正在创建一个vim插件,它有几个私有函数,我正在尝试使用vim-vspec向它添加单一测试。
在测试文件中调用这些私有函数的最佳方法是什么?
现在,我创建了一个调用私有函数的公共函数,但我不认为这是一个很好的方法,因为我已经失去了拥有私有函数的意义。这是一些代码
" File foo.vim (the plugin)
" Private function
fu! s:foo(arg)
...
endfu
" Public function
fu! InvokeFoo(arg)
call <SID>foo(a:arg)
endfu
" File foo-unittest.vim (the test file)
runtime! plugin/foo.vim
describe 'foo function'
it 'should have some behavior'
call InvokeFoo(...)
" Some expectations ...
end
end
我尝试为私有函数创建映射,但是当我调用exe map_combination
时,它对测试缓冲区没有任何影响。
答案 0 :(得分:0)
我找到了问题here的解决方案,它为变量提供了一种方法,为函数提供了另一种方法。
对于变量,我使用了vim的范围。调用:帮助内部变量:
作用域名称本身可以用作词典。例如,到 删除所有脚本局部变量:
:for k in keys(s:) : unlet s:[k] :endfor
所以我通过在其字典中使用getter函数来访问:s
范围:
fun! SScope()
return s:
endfu
最后,变量s:variable
将通过以下方式访问:
let l:scope = SScope()
echom l:scope['variable']
由于<SID>
字符串,函数有点复杂。如果您阅读了手册,那么
执行map命令时,Vim会用{替换
<SID>
特殊密钥代码,紧随其后 通过脚本独有的数字和下划线。例如:
:map <SID>Add
可以定义映射“23_Add”。
因此,我们需要访问此唯一编号,其中一种方法是使用函数内的maparg
定义将用作访问者的地图:
fu! SID()
return maparg('<SID>', 'n')
endfu
nnoremap <SID> <SID>
然后,为了调用该函数,我们将进行一些黑客攻击:
call call(substitute('s:my_function', '^s:', SID(), ''), [arg1, arg2, ...])