来自功能的状态行突出显示组无效

时间:2015-08-21 15:24:21

标签: vim

在我的vim配置中,我有一个像

这样的功能
function! StatuslineTrailingSpace()
  if !exists('b:statusline_trailing_space_warning')
    let b:statusline_trailing_space_warning = &modifiable ? search('\s\+$', 'nw') != 0 ? ' %#warningmsg#[\s]%*' : '' : ''
  endif

  return b:statusline_trailing_space_warning
endfunction

然后在某个地方

set statusline+=%{StatuslineTrailingSpace()}

但状态行中没有彩色[\s]标记,而是显示完整的%#warningmsg#[\s]%*字符串。

this answer中提议使用%!代替%{}似乎不起作用,因为我的vim会出错

line   70:
E539: Illegal character <!>: statusline+=%!StatuslineTrailingSpace()

如何让彩色状态线正常工作?

2 个答案:

答案 0 :(得分:2)

我怀疑你必须使用%!构造来访问缓冲区。但是,由于文档暗示%!必须从选项的开头开始,最好的选择可能是保存当前状态行,然后使用您的函数返回整个事物。

function! StatuslineTrailingSpace()
  if !exists('b:statusline_trailing_space_warning')
let b:statusline_trailing_space_warning = &modifiable ? search('\s\+$', 'nw') != 0 ? ' %#warningmsg#[\s]%*' : '' : ''
  endif

  return s:former_status_line . b:statusline_trailing_space_warning
endfunction

let s:former_status_line = &statusline
set statusline=%!StatuslineTrailingSpace()

那样的东西?

答案 1 :(得分:1)

突出显示组应位于'statusline'选项中,而不是表达式中:

function! StatuslineTrailingSpace()
  if !exists('b:stsw')
    let b:stsw = &modifiable ? search('\s\+$', 'nw') != 0 ? ' [\s]' : '' : ''
  endif

  return b:stsw
endfunction

set statusline+=%#warningmsg#%{StatuslineTrailingSpace()}%*