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 状态行不从表达式扩展颜色/高亮组的主要内容,如果未能解决你的问题,请参考以下文章