在设置statusline时,表达式(例如函数调用)可以使用而不是文字值的两种方法中,两种方法都不允许静态函数。
set statusline=%{s:MyFunc()}set statusline=%!s:MyFunc()两者都会产生以下错误对。
E120: Using <SID> not in a script context: <SID>:MyFuncE15: Invalid expression: <SID>:MyFunc()我在试图设置s:MyFunc()的同一个文件中定义了statusline。
当我使函数是全局的(文件中的s:MyFunc被MyFunc替换)时,没有错误,statusline被正确设置。因此,这个问题。
请注意,用s:代替<SID>:没有帮助。
发布于 2013-06-19 06:29:03
唐·克鲁克申克的解释是正确的。以下是一些可能的解决方案,这些解决方案比定义全局函数更好(尽管这样做也有效,特别是如果您在名称前面加上脚本的名称以使其惟一):
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()')发布于 2013-06-18 22:54:17
statusline不会在脚本的上下文中进行评估,因此尝试使用本地脚本中的s:函数总是失败的。
s:意味着给定的符号是脚本的本地符号,而不是静态的,因此您需要使用另一种识别函数的方法。有关可能的符号修饰符的列表,请参见:help E738。
正如你在问题中所述,这将确实有效:
function MyFunc()
return "Hello World"
endfunction
set statusline=%!MyFunc()https://stackoverflow.com/questions/17179576
复制相似问题