1

在设置时可以使用表达式(例如函数调用)代替文字值的两种方式中statusline,似乎都不允许使用静态函数。

  1. set statusline=%{s:MyFunc()}
  2. 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>:没有帮助。

4

2 回答 2

4

statusline不在脚本的上下文中进行评估,因此尝试使用本地脚本中的函数s:总是会失败。

s:意味着给定的符号是脚本的本地符号,而不是静态的,因此您需要使用另一种方法来识别函数。有关:help E738可能的符号修饰符的列表,请参阅。

正如您在问题中所述,这确实会起作用:

function MyFunc()
  return "Hello World"
endfunction

set statusline=%!MyFunc()
于 2013-06-18T22:54:17.933 回答
1

唐克鲁克香克的解释是正确的。以下是一些比定义全局函数更好的可能解决方案(尽管这也可以,特别是如果您在名称前加上脚本名称以使其唯一):

  1. 定义并使用一个自动加载函数来本地化该函数;这也可以在 a 中完成plugin/myscript.vim,也不一定在autoload/myscript.vim. 例如function myscript#MyStatuslineFunc()
  2. 要使用脚本本地函数,您需要自己将 ofs:转换为实际<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-19T06:29:03.057 回答