Vim状态行:表达式不接受静态功能

时间:2013-06-18 21:47:20

标签: vim

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

  1. set statusline=%{s:MyFunc()}
  2. set statusline=%!s:MyFunc()
  3. 两者都产生以下错误对。

    • E120: Using <SID> not in a script context: <SID>:MyFunc
    • E15: Invalid expression: <SID>:MyFunc()

    我在我尝试设置s:MyFunc()的同一文件中定义了statusline

    当我将函数设置为全局(s:MyFunc被文件中的MyFunc替换)时,没有错误,statusline设置正确。因此这个问题。

    请注意,将s:替换为<SID>:无效。

2 个答案:

答案 0 :(得分:3)

statusline未在脚本的上下文中进行评估,因此尝试使用带有s:的本地脚本中的函数将始终失败。

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

正如你在问题中所述,这确实有效:

function MyFunc()
  return "Hello World"
endfunction

set statusline=%!MyFunc()

答案 1 :(得分:1)

Don Cruickshank的解释是正确的。这里有一些可能的解决方案比定义一个全局函数更好(虽然这也可行,特别是如果你在名称前加上脚本的名称以使其唯一):

  1. 定义并使用自动加载功能来定位功能;这也可以在plugin/myscript.vim中完成,不一定在autoload/myscript.vim中。例如。 function myscript#MyStatuslineFunc()
  2. 要使用脚本本地函数,您需要将s:转换为实际的<SNR>NNN_FuncName(当您使用<SID>时自动执行的映射):
  3. function! s:function(name)
        return substitute(a:name, '^s:', matchstr(expand('<sfile>'), '<SNR>\d\+_\zefunction$'),'')
    endfunction
    let &statusline = '%!' . s:function('s:MyFunc()')