在设置statusline
时,可以使用表达式(例如函数调用)而不是文字值的两种方式,似乎都不允许使用静态函数。
set statusline=%{s:MyFunc()}
set statusline=%!s:MyFunc()
两者都产生以下错误对。
E120: Using <SID> not in a script context: <SID>:MyFunc
E15: Invalid expression: <SID>:MyFunc()
我在我尝试设置s:MyFunc()
的同一文件中定义了statusline
。
当我将函数设置为全局(s:MyFunc
被文件中的MyFunc
替换)时,没有错误,statusline
设置正确。因此这个问题。
请注意,将s:
替换为<SID>:
无效。
答案 0 :(得分:3)
statusline
未在脚本的上下文中进行评估,因此尝试使用带有s:
的本地脚本中的函数将始终失败。
s:
表示给定的符号是脚本的本地符号,而不是静态的,因此您需要使用另一种方法来识别该函数。请参阅:help E738
以获取可能的符号修饰符列表。
正如你在问题中所述,这确实有效:
function MyFunc()
return "Hello World"
endfunction
set statusline=%!MyFunc()
答案 1 :(得分:1)
Don Cruickshank的解释是正确的。这里有一些可能的解决方案比定义一个全局函数更好(虽然这也可行,特别是如果你在名称前加上脚本的名称以使其唯一):
plugin/myscript.vim
中完成,不一定在autoload/myscript.vim
中。例如。 function myscript#MyStatuslineFunc()
s:
转换为实际的<SNR>NNN_FuncName
(当您使用<SID>
时自动执行的映射):function! s:function(name)
return substitute(a:name, '^s:', matchstr(expand('<sfile>'), '<SNR>\d\+_\zefunction$'),'')
endfunction
let &statusline = '%!' . s:function('s:MyFunc()')