mirror of
https://github.com/vim/vim.git
synced 2025-09-17 02:48:10 -04:00
patch 8.0.1208: 'statusline' drops empty group with highlight change
Problem: 'statusline' drops empty group with highlight change. Solution: Do not drop an empty group if it changes highlighting. (Marius Gedminas, closes #2228)
This commit is contained in:
parent
67435d9983
commit
6b89dbb55f
17
src/buffer.c
17
src/buffer.c
@ -3883,6 +3883,8 @@ build_stl_str_hl(
|
||||
int width;
|
||||
int itemcnt;
|
||||
int curitem;
|
||||
int group_end_userhl;
|
||||
int group_start_userhl;
|
||||
int groupitem[STL_MAX_ITEM];
|
||||
int groupdepth;
|
||||
struct stl_item
|
||||
@ -4023,11 +4025,20 @@ build_stl_str_hl(
|
||||
if (curitem > groupitem[groupdepth] + 1
|
||||
&& item[groupitem[groupdepth]].minwid == 0)
|
||||
{
|
||||
/* remove group if all items are empty */
|
||||
/* remove group if all items are empty and highlight group
|
||||
* doesn't change */
|
||||
group_start_userhl = group_end_userhl = 0;
|
||||
for (n = 0; n < groupitem[groupdepth]; n++)
|
||||
if (item[n].type == Highlight)
|
||||
group_start_userhl = item[n].minwid;
|
||||
for (n = groupitem[groupdepth] + 1; n < curitem; n++)
|
||||
if (item[n].type == Normal || item[n].type == Highlight)
|
||||
{
|
||||
if (item[n].type == Normal)
|
||||
break;
|
||||
if (n == curitem)
|
||||
if (item[n].type == Highlight)
|
||||
group_end_userhl = item[n].minwid;
|
||||
}
|
||||
if (n == curitem && group_start_userhl == group_end_userhl)
|
||||
{
|
||||
p = t;
|
||||
l = 0;
|
||||
|
@ -5,7 +5,6 @@
|
||||
" %N
|
||||
" %T
|
||||
" %X
|
||||
" %*
|
||||
|
||||
source view_util.vim
|
||||
|
||||
@ -249,6 +248,70 @@ func Test_statusline()
|
||||
call assert_equal(sa1, sa3)
|
||||
call assert_notequal(sa1, sa2)
|
||||
|
||||
" An empty group that contains highlight changes
|
||||
let g:a = ''
|
||||
set statusline=ab%(cd%1*%{g:a}%*%)de
|
||||
call assert_match('^abde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 4)
|
||||
call assert_equal(sa1, sa2)
|
||||
let g:a = 'X'
|
||||
call assert_match('^abcdXde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 5)
|
||||
let sa3=screenattr(&lines - 1, 7)
|
||||
call assert_equal(sa1, sa3)
|
||||
call assert_notequal(sa1, sa2)
|
||||
|
||||
let g:a = ''
|
||||
set statusline=ab%1*%(cd%*%{g:a}%1*%)de
|
||||
call assert_match('^abde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 4)
|
||||
call assert_notequal(sa1, sa2)
|
||||
let g:a = 'X'
|
||||
call assert_match('^abcdXde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 3)
|
||||
let sa3=screenattr(&lines - 1, 5)
|
||||
let sa4=screenattr(&lines - 1, 7)
|
||||
call assert_notequal(sa1, sa2)
|
||||
call assert_equal(sa1, sa3)
|
||||
call assert_equal(sa2, sa4)
|
||||
|
||||
" An empty group that contains highlight changes and doesn't reset them
|
||||
let g:a = ''
|
||||
set statusline=ab%(cd%1*%{g:a}%)de
|
||||
call assert_match('^abcdde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 5)
|
||||
call assert_notequal(sa1, sa2)
|
||||
let g:a = 'X'
|
||||
call assert_match('^abcdXde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 5)
|
||||
let sa3=screenattr(&lines - 1, 7)
|
||||
call assert_notequal(sa1, sa2)
|
||||
call assert_equal(sa2, sa3)
|
||||
|
||||
let g:a = ''
|
||||
set statusline=ab%1*%(cd%*%{g:a}%)de
|
||||
call assert_match('^abcdde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 3)
|
||||
let sa3=screenattr(&lines - 1, 5)
|
||||
call assert_notequal(sa1, sa2)
|
||||
call assert_equal(sa1, sa3)
|
||||
let g:a = 'X'
|
||||
call assert_match('^abcdXde\s*$', s:get_statusline())
|
||||
let sa1=screenattr(&lines - 1, 1)
|
||||
let sa2=screenattr(&lines - 1, 3)
|
||||
let sa3=screenattr(&lines - 1, 5)
|
||||
let sa4=screenattr(&lines - 1, 7)
|
||||
call assert_notequal(sa1, sa2)
|
||||
call assert_equal(sa1, sa3)
|
||||
call assert_equal(sa1, sa4)
|
||||
|
||||
" %%: a percent sign.
|
||||
set statusline=10%%
|
||||
call assert_match('^10%\s*$', s:get_statusline())
|
||||
|
@ -761,6 +761,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1208,
|
||||
/**/
|
||||
1207,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user