【问题标题】:statusline highlight group from function has no effect功能中的状态行高亮组无效
【发布时间】:2015-11-15 14:53:31
【问题描述】:

在我的 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()}

但我看到的是完整的%#warningmsg#[\s]%* 字符串,而不是状态行中的彩色[\s] 标签。

尝试使用%! 而不是this answer 中建议的%{} 似乎不起作用,因为我的vim 给出了错误

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

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

【问题讨论】:

  • 您知道%!%{} 之间的区别吗?看起来您想要%!,因为这是将缓冲区考虑在内的那个。
  • @dash-tom-bang 我做到了。但正如我在帖子中所说,vim 在使用%! 时会出错。
  • 是的,我现在正在研究这个,因为它很有趣......文档说,When the option *starts* with "%!"... 所以可能只是您需要将整个状态行放入一个函数中。

标签: vim


【解决方案1】:

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

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()

类似的东西?

【讨论】:

  • %! 必须站在开头的提示对我有用。我现在使用一个状态行函数,它将我所有的字符串和函数连接在一起,并通过set statusline=%!Statusline() 使用它
【解决方案2】:

高亮组应该在'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()}%*

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 2018-09-29
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2016-03-06
    相关资源
    最近更新 更多