Vim 状态行不从表达式扩展颜色/高亮组

Posted

技术标签:

【中文标题】Vim 状态行不从表达式扩展颜色/高亮组【英文标题】:Vim statusline does not expand color/highlight group from expression 【发布时间】:2015-10-26 15:03:00 【问题描述】:

我写了一个返回字符串的函数:

function! StatusBricks()
    let l:stat = Brick(statusbricks#ReportLinecount('raw'), 
        \ 'brick_color': 'LineNr',
        \ 'delimiter_position': 'right',
        \ 'delimiter_right': '❯'
        \ )
    return l:stat
endfunction

结果格式如下,由Brick()生成:

%#HighlightGroup#SomeData

当我将函数用作状态行中的表达式时,我希望 highlight group 能够扩展,以便为相应的状态行部分着色:

set statusline =%StatusBricks()

但我得到的是一个状态行,字面上显示的是%#HighlightGroup#ExpandedData,而不是ExpandedData

我做错了什么?

【问题讨论】:

【参考方案1】:

% 的结果不会被进一步解释,但%! 的结果是。使用

set statusline=%!StatusBricks()

%! 在帮助文件中似乎没有标签,但在:help 'statusline' 的开头附近提到了它。

根据您的评论:如果您希望根据每个特定窗口的状态在状态行中使用不同的颜色,那么如果您不希望出现特定的突出显示,则可以突出显示一个空字符串。例如

set stl=%#error#%r%#search#

只有只读窗口(例如打开帮助缓冲区)才会以红色显示只读标志。诚然,这可能会根据您的突出显示要求而变得复杂。

【讨论】:

帮助不太清楚%的进一步解释。也许我错过了什么。但是%! 有一个副作用:来自help:“请注意,“%!”表达式是在当前窗口和缓冲区的上下文中计算的,而 % 项是在状态行所在的窗口的上下文中计算的属于。”因此,不幸的是,%! 并没有真正的用处。 查看编辑,如果这就是你的意思。也许您可以在问题中包含更多细节和代码,以便我们知道您想要实现的目标。 当使用%!时,你可以在你的函数中使用winbufnr(g:statusline_winid)来识别你正在绘制其状态线的缓冲区。【参考方案2】:

tl;dr - 使用 % %

我意识到这是一个老问题,但我找到了一个未来读者可能会使用的答案。

而不是

set statusline =%StatusBricks()

你需要

set statusline =%%StatusBricks()%

来自:help 'statusline'

    % -  This is almost same as  except the result of the expression is
          re-evaluated as a statusline format string.  Thus if the
          return value of expr contains % items they will get expanded.
          The expression can contain the  character, the end of
          expression is denoted by %.
          The For example:
            func! Stl_filename() abort
                return "%t"
            endfunc

            `stl=%Stl_filename()`   results in `"%t"`
            `stl=%%Stl_filename()%` results in `"Name of current file"`

【讨论】:

以上是关于Vim 状态行不从表达式扩展颜色/高亮组的主要内容,如果未能解决你的问题,请参考以下文章

vim  模式查找

linux文本查找相关命令

linux文本查找相关命令

Vim的语法高亮颜色设置在screen中无效?

Vim的语法高亮颜色设置在screen中无效?

怎样修改vim默认的背景颜色