VimL:正确使用`call()`?我一直在收到错误

时间:2013-01-30 01:41:17

标签: vim

任何帮助将不胜感激。我正在使用以下内容:

let g:usefulstatusline_normal=call(exe, ['hi StatusLine'], {})

我得到了:

E15: Invalid expression: call(exe, ['hi StatusLine'], {})

我做错了什么?我知道这可能是显而易见的事情。

我想要实现的是获取当前colorscheme的状态行的颜色和内容并将其包含在变量中。所以我以后可以重复使用它。

任何帮助都表示赞赏,同样,任何有关如何以更好的方式实现这一目标的提示也将受到赞赏。

如果您需要完整代码,请访问此文件:https://github.com/Greduan/vim-usefulstatusline/blob/master/autoload/usefulstatusline_colorize.vim

现在忽略顶部,它仅用于测试目的。 :)

2 个答案:

答案 0 :(得分:4)

这里的问题是你需要:highlight command的输出。与vim中的函数不同,该函数返回一个值,该值可以分配给表达式左侧的某些内容,此命令会回显其输出。在这种情况下,您需要暂时将输出重定向到变量,然后恢复正常输出,如下所示:

redir => g:usefulstatusline_normal
silent! exec 'hi StatusLine'
redir END

请注意,:highlight命令可以输出的可能值是单行上不存在的突出显示组的错误,或换行符然后是输出,因此您需要做更多的工作而不仅仅是上面的例子:

" Returns: hl group value or '' on nonexistent highlight group
" Usage: let foo = GetHL('StatusLine')
function! GetHL(grp)
  redir => hlOutput
  silent! exec 'hi '.a:grp
  redir END
  let hlVal = matchstr(hlOutput, '\v%(\nStatusLine\s+xxx\s+)@<=.*')
  return hlVal
endfunction

答案 1 :(得分:4)

请注意,为了查询突出显示组的属性,您不需要解析:hi命令的输出(这应该只作为最后的手段,无论如何)。您可以结合使用hlID()synIDattr()函数来执行此操作:

:echo synIDattr(synIDtrans(hlID('StatusLine')), 'bg')