mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
patch 8.2.1909: number of status line items is limited to 80
Problem: Number of status line items is limited to 80. Solution: Dynamically allocate the arrays. (Rom Grk, closes #7181)
This commit is contained in:
@@ -7225,7 +7225,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
normal text. Each status line item is of the form:
|
normal text. Each status line item is of the form:
|
||||||
%-0{minwid}.{maxwid}{item}
|
%-0{minwid}.{maxwid}{item}
|
||||||
All fields except the {item} are optional. A single percent sign can
|
All fields except the {item} are optional. A single percent sign can
|
||||||
be given as "%%". Up to 80 items can be specified. *E541*
|
be given as "%%".
|
||||||
|
|
||||||
When the option starts with "%!" then it is used as an expression,
|
When the option starts with "%!" then it is used as an expression,
|
||||||
evaluated and the result is used as the option value. Example: >
|
evaluated and the result is used as the option value. Example: >
|
||||||
|
240
src/buffer.c
240
src/buffer.c
@@ -673,7 +673,7 @@ aucmd_abort:
|
|||||||
buf->b_nwindows = nwindows;
|
buf->b_nwindows = nwindows;
|
||||||
|
|
||||||
buf_freeall(buf, (del_buf ? BFA_DEL : 0)
|
buf_freeall(buf, (del_buf ? BFA_DEL : 0)
|
||||||
+ (wipe_buf ? BFA_WIPE : 0)
|
+ (wipe_buf ? BFA_WIPE : 0)
|
||||||
+ (ignore_abort ? BFA_IGNORE_ABORT : 0));
|
+ (ignore_abort ? BFA_IGNORE_ABORT : 0));
|
||||||
|
|
||||||
// Autocommands may have deleted the buffer.
|
// Autocommands may have deleted the buffer.
|
||||||
@@ -4017,6 +4017,32 @@ free_titles(void)
|
|||||||
#endif // FEAT_TITLE
|
#endif // FEAT_TITLE
|
||||||
|
|
||||||
#if defined(FEAT_STL_OPT) || defined(FEAT_GUI_TABLINE) || defined(PROTO)
|
#if defined(FEAT_STL_OPT) || defined(FEAT_GUI_TABLINE) || defined(PROTO)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used for building in the status line.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char_u *stl_start;
|
||||||
|
int stl_minwid;
|
||||||
|
int stl_maxwid;
|
||||||
|
enum {
|
||||||
|
Normal,
|
||||||
|
Empty,
|
||||||
|
Group,
|
||||||
|
Middle,
|
||||||
|
Highlight,
|
||||||
|
TabPage,
|
||||||
|
Trunc
|
||||||
|
} stl_type;
|
||||||
|
} stl_item_T;
|
||||||
|
|
||||||
|
static size_t stl_items_len = 20; // Initial value, grows as needed.
|
||||||
|
static stl_item_T *stl_items = NULL;
|
||||||
|
static int *stl_groupitem = NULL;
|
||||||
|
static stl_hlrec_T *stl_hltab = NULL;
|
||||||
|
static stl_hlrec_T *stl_tabtab = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Build a string from the status line items in "fmt".
|
* Build a string from the status line items in "fmt".
|
||||||
* Return length of string in screen cells.
|
* Return length of string in screen cells.
|
||||||
@@ -4040,8 +4066,8 @@ build_stl_str_hl(
|
|||||||
int use_sandbox UNUSED, // "fmt" was set insecurely, use sandbox
|
int use_sandbox UNUSED, // "fmt" was set insecurely, use sandbox
|
||||||
int fillchar,
|
int fillchar,
|
||||||
int maxwidth,
|
int maxwidth,
|
||||||
struct stl_hlrec *hltab, // return: HL attributes (can be NULL)
|
stl_hlrec_T **hltab, // return: HL attributes (can be NULL)
|
||||||
struct stl_hlrec *tabtab) // return: tab page nrs (can be NULL)
|
stl_hlrec_T **tabtab) // return: tab page nrs (can be NULL)
|
||||||
{
|
{
|
||||||
linenr_T lnum;
|
linenr_T lnum;
|
||||||
size_t len;
|
size_t len;
|
||||||
@@ -4069,24 +4095,7 @@ build_stl_str_hl(
|
|||||||
int curitem;
|
int curitem;
|
||||||
int group_end_userhl;
|
int group_end_userhl;
|
||||||
int group_start_userhl;
|
int group_start_userhl;
|
||||||
int groupitem[STL_MAX_ITEM];
|
|
||||||
int groupdepth;
|
int groupdepth;
|
||||||
struct stl_item
|
|
||||||
{
|
|
||||||
char_u *start;
|
|
||||||
int minwid;
|
|
||||||
int maxwid;
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
Normal,
|
|
||||||
Empty,
|
|
||||||
Group,
|
|
||||||
Middle,
|
|
||||||
Highlight,
|
|
||||||
TabPage,
|
|
||||||
Trunc
|
|
||||||
} type;
|
|
||||||
} item[STL_MAX_ITEM];
|
|
||||||
int minwid;
|
int minwid;
|
||||||
int maxwid;
|
int maxwid;
|
||||||
int zeropad;
|
int zeropad;
|
||||||
@@ -4096,10 +4105,18 @@ build_stl_str_hl(
|
|||||||
char_u buf_tmp[TMPLEN];
|
char_u buf_tmp[TMPLEN];
|
||||||
char_u win_tmp[TMPLEN];
|
char_u win_tmp[TMPLEN];
|
||||||
char_u *usefmt = fmt;
|
char_u *usefmt = fmt;
|
||||||
struct stl_hlrec *sp;
|
stl_hlrec_T *sp;
|
||||||
int save_must_redraw = must_redraw;
|
int save_must_redraw = must_redraw;
|
||||||
int save_redr_type = curwin->w_redr_type;
|
int save_redr_type = curwin->w_redr_type;
|
||||||
|
|
||||||
|
if (stl_items == NULL)
|
||||||
|
{
|
||||||
|
stl_items = ALLOC_MULT(stl_item_T, stl_items_len);
|
||||||
|
stl_groupitem = ALLOC_MULT(int, stl_items_len);
|
||||||
|
stl_hltab = ALLOC_MULT(stl_hlrec_T, stl_items_len);
|
||||||
|
stl_tabtab = ALLOC_MULT(stl_hlrec_T, stl_items_len);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
/*
|
/*
|
||||||
* When the format starts with "%!" then evaluate it as an expression and
|
* When the format starts with "%!" then evaluate it as an expression and
|
||||||
@@ -4162,16 +4179,30 @@ build_stl_str_hl(
|
|||||||
prevchar_isitem = FALSE;
|
prevchar_isitem = FALSE;
|
||||||
for (s = usefmt; *s; )
|
for (s = usefmt; *s; )
|
||||||
{
|
{
|
||||||
if (curitem == STL_MAX_ITEM)
|
if (curitem == (int)stl_items_len)
|
||||||
{
|
{
|
||||||
// There are too many items. Add the error code to the statusline
|
size_t new_len = stl_items_len * 3 / 2;
|
||||||
// to give the user a hint about what went wrong.
|
stl_item_T *new_items;
|
||||||
if (p + 6 < out + outlen)
|
int *new_groupitem;
|
||||||
{
|
stl_hlrec_T *new_hlrec;
|
||||||
mch_memmove(p, " E541", (size_t)5);
|
|
||||||
p += 5;
|
new_items = vim_realloc(stl_items, sizeof(stl_item_T) * new_len);
|
||||||
}
|
if (new_items == NULL)
|
||||||
break;
|
break;
|
||||||
|
stl_items = new_items;
|
||||||
|
new_groupitem = vim_realloc(stl_groupitem, sizeof(int) * new_len);
|
||||||
|
if (new_groupitem == NULL)
|
||||||
|
break;
|
||||||
|
stl_groupitem = new_groupitem;
|
||||||
|
new_hlrec = vim_realloc(stl_hltab, sizeof(stl_hlrec_T) * new_len);
|
||||||
|
if (new_hlrec == NULL)
|
||||||
|
break;
|
||||||
|
stl_hltab = new_hlrec;
|
||||||
|
new_hlrec = vim_realloc(stl_tabtab, sizeof(stl_hlrec_T) * new_len);
|
||||||
|
if (new_hlrec == NULL)
|
||||||
|
break;
|
||||||
|
stl_tabtab = new_hlrec;
|
||||||
|
stl_items_len = new_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*s != NUL && *s != '%')
|
if (*s != NUL && *s != '%')
|
||||||
@@ -4204,15 +4235,15 @@ build_stl_str_hl(
|
|||||||
s++;
|
s++;
|
||||||
if (groupdepth > 0)
|
if (groupdepth > 0)
|
||||||
continue;
|
continue;
|
||||||
item[curitem].type = Middle;
|
stl_items[curitem].stl_type = Middle;
|
||||||
item[curitem++].start = p;
|
stl_items[curitem++].stl_start = p;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*s == STL_TRUNCMARK)
|
if (*s == STL_TRUNCMARK)
|
||||||
{
|
{
|
||||||
s++;
|
s++;
|
||||||
item[curitem].type = Trunc;
|
stl_items[curitem].stl_type = Trunc;
|
||||||
item[curitem++].start = p;
|
stl_items[curitem++].stl_start = p;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*s == ')')
|
if (*s == ')')
|
||||||
@@ -4222,83 +4253,85 @@ build_stl_str_hl(
|
|||||||
continue;
|
continue;
|
||||||
groupdepth--;
|
groupdepth--;
|
||||||
|
|
||||||
t = item[groupitem[groupdepth]].start;
|
t = stl_items[stl_groupitem[groupdepth]].stl_start;
|
||||||
*p = NUL;
|
*p = NUL;
|
||||||
l = vim_strsize(t);
|
l = vim_strsize(t);
|
||||||
if (curitem > groupitem[groupdepth] + 1
|
if (curitem > stl_groupitem[groupdepth] + 1
|
||||||
&& item[groupitem[groupdepth]].minwid == 0)
|
&& stl_items[stl_groupitem[groupdepth]].stl_minwid == 0)
|
||||||
{
|
{
|
||||||
// remove group if all items are empty and highlight group
|
// remove group if all items are empty and highlight group
|
||||||
// doesn't change
|
// doesn't change
|
||||||
group_start_userhl = group_end_userhl = 0;
|
group_start_userhl = group_end_userhl = 0;
|
||||||
for (n = groupitem[groupdepth] - 1; n >= 0; n--)
|
for (n = stl_groupitem[groupdepth] - 1; n >= 0; n--)
|
||||||
{
|
{
|
||||||
if (item[n].type == Highlight)
|
if (stl_items[n].stl_type == Highlight)
|
||||||
{
|
{
|
||||||
group_start_userhl = group_end_userhl = item[n].minwid;
|
group_start_userhl = group_end_userhl =
|
||||||
|
stl_items[n].stl_minwid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (n = groupitem[groupdepth] + 1; n < curitem; n++)
|
for (n = stl_groupitem[groupdepth] + 1; n < curitem; n++)
|
||||||
{
|
{
|
||||||
if (item[n].type == Normal)
|
if (stl_items[n].stl_type == Normal)
|
||||||
break;
|
break;
|
||||||
if (item[n].type == Highlight)
|
if (stl_items[n].stl_type == Highlight)
|
||||||
group_end_userhl = item[n].minwid;
|
group_end_userhl = stl_items[n].stl_minwid;
|
||||||
}
|
}
|
||||||
if (n == curitem && group_start_userhl == group_end_userhl)
|
if (n == curitem && group_start_userhl == group_end_userhl)
|
||||||
{
|
{
|
||||||
// empty group
|
// empty group
|
||||||
p = t;
|
p = t;
|
||||||
l = 0;
|
l = 0;
|
||||||
for (n = groupitem[groupdepth] + 1; n < curitem; n++)
|
for (n = stl_groupitem[groupdepth] + 1; n < curitem; n++)
|
||||||
{
|
{
|
||||||
// do not use the highlighting from the removed group
|
// do not use the highlighting from the removed group
|
||||||
if (item[n].type == Highlight)
|
if (stl_items[n].stl_type == Highlight)
|
||||||
item[n].type = Empty;
|
stl_items[n].stl_type = Empty;
|
||||||
// adjust the start position of TabPage to the next
|
// adjust the start position of TabPage to the next
|
||||||
// item position
|
// item position
|
||||||
if (item[n].type == TabPage)
|
if (stl_items[n].stl_type == TabPage)
|
||||||
item[n].start = p;
|
stl_items[n].stl_start = p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (l > item[groupitem[groupdepth]].maxwid)
|
if (l > stl_items[stl_groupitem[groupdepth]].stl_maxwid)
|
||||||
{
|
{
|
||||||
// truncate, remove n bytes of text at the start
|
// truncate, remove n bytes of text at the start
|
||||||
if (has_mbyte)
|
if (has_mbyte)
|
||||||
{
|
{
|
||||||
// Find the first character that should be included.
|
// Find the first character that should be included.
|
||||||
n = 0;
|
n = 0;
|
||||||
while (l >= item[groupitem[groupdepth]].maxwid)
|
while (l >= stl_items[stl_groupitem[groupdepth]].stl_maxwid)
|
||||||
{
|
{
|
||||||
l -= ptr2cells(t + n);
|
l -= ptr2cells(t + n);
|
||||||
n += (*mb_ptr2len)(t + n);
|
n += (*mb_ptr2len)(t + n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
n = (long)(p - t) - item[groupitem[groupdepth]].maxwid + 1;
|
n = (long)(p - t) - stl_items[stl_groupitem[groupdepth]]
|
||||||
|
.stl_maxwid + 1;
|
||||||
|
|
||||||
*t = '<';
|
*t = '<';
|
||||||
mch_memmove(t + 1, t + n, (size_t)(p - (t + n)));
|
mch_memmove(t + 1, t + n, (size_t)(p - (t + n)));
|
||||||
p = p - n + 1;
|
p = p - n + 1;
|
||||||
|
|
||||||
// Fill up space left over by half a double-wide char.
|
// Fill up space left over by half a double-wide char.
|
||||||
while (++l < item[groupitem[groupdepth]].minwid)
|
while (++l < stl_items[stl_groupitem[groupdepth]].stl_minwid)
|
||||||
*p++ = fillchar;
|
*p++ = fillchar;
|
||||||
|
|
||||||
// correct the start of the items for the truncation
|
// correct the start of the items for the truncation
|
||||||
for (l = groupitem[groupdepth] + 1; l < curitem; l++)
|
for (l = stl_groupitem[groupdepth] + 1; l < curitem; l++)
|
||||||
{
|
{
|
||||||
item[l].start -= n;
|
stl_items[l].stl_start -= n;
|
||||||
if (item[l].start < t)
|
if (stl_items[l].stl_start < t)
|
||||||
item[l].start = t;
|
stl_items[l].stl_start = t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (abs(item[groupitem[groupdepth]].minwid) > l)
|
else if (abs(stl_items[stl_groupitem[groupdepth]].stl_minwid) > l)
|
||||||
{
|
{
|
||||||
// fill
|
// fill
|
||||||
n = item[groupitem[groupdepth]].minwid;
|
n = stl_items[stl_groupitem[groupdepth]].stl_minwid;
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
{
|
{
|
||||||
// fill by appending characters
|
// fill by appending characters
|
||||||
@@ -4314,8 +4347,8 @@ build_stl_str_hl(
|
|||||||
if (p + l >= out + outlen)
|
if (p + l >= out + outlen)
|
||||||
l = (long)((out + outlen) - p - 1);
|
l = (long)((out + outlen) - p - 1);
|
||||||
p += l;
|
p += l;
|
||||||
for (n = groupitem[groupdepth] + 1; n < curitem; n++)
|
for (n = stl_groupitem[groupdepth] + 1; n < curitem; n++)
|
||||||
item[n].start += l;
|
stl_items[n].stl_start += l;
|
||||||
for ( ; l > 0; l--)
|
for ( ; l > 0; l--)
|
||||||
*t++ = fillchar;
|
*t++ = fillchar;
|
||||||
}
|
}
|
||||||
@@ -4344,9 +4377,9 @@ build_stl_str_hl(
|
|||||||
}
|
}
|
||||||
if (*s == STL_USER_HL)
|
if (*s == STL_USER_HL)
|
||||||
{
|
{
|
||||||
item[curitem].type = Highlight;
|
stl_items[curitem].stl_type = Highlight;
|
||||||
item[curitem].start = p;
|
stl_items[curitem].stl_start = p;
|
||||||
item[curitem].minwid = minwid > 9 ? 1 : minwid;
|
stl_items[curitem].stl_minwid = minwid > 9 ? 1 : minwid;
|
||||||
s++;
|
s++;
|
||||||
curitem++;
|
curitem++;
|
||||||
continue;
|
continue;
|
||||||
@@ -4360,9 +4393,10 @@ build_stl_str_hl(
|
|||||||
// %X ends the close label, go back to the previously
|
// %X ends the close label, go back to the previously
|
||||||
// define tab label nr.
|
// define tab label nr.
|
||||||
for (n = curitem - 1; n >= 0; --n)
|
for (n = curitem - 1; n >= 0; --n)
|
||||||
if (item[n].type == TabPage && item[n].minwid >= 0)
|
if (stl_items[n].stl_type == TabPage
|
||||||
|
&& stl_items[n].stl_minwid >= 0)
|
||||||
{
|
{
|
||||||
minwid = item[n].minwid;
|
minwid = stl_items[n].stl_minwid;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4370,9 +4404,9 @@ build_stl_str_hl(
|
|||||||
// close nrs are stored as negative values
|
// close nrs are stored as negative values
|
||||||
minwid = - minwid;
|
minwid = - minwid;
|
||||||
}
|
}
|
||||||
item[curitem].type = TabPage;
|
stl_items[curitem].stl_type = TabPage;
|
||||||
item[curitem].start = p;
|
stl_items[curitem].stl_start = p;
|
||||||
item[curitem].minwid = minwid;
|
stl_items[curitem].stl_minwid = minwid;
|
||||||
s++;
|
s++;
|
||||||
curitem++;
|
curitem++;
|
||||||
continue;
|
continue;
|
||||||
@@ -4390,11 +4424,11 @@ build_stl_str_hl(
|
|||||||
minwid = (minwid > 50 ? 50 : minwid) * l;
|
minwid = (minwid > 50 ? 50 : minwid) * l;
|
||||||
if (*s == '(')
|
if (*s == '(')
|
||||||
{
|
{
|
||||||
groupitem[groupdepth++] = curitem;
|
stl_groupitem[groupdepth++] = curitem;
|
||||||
item[curitem].type = Group;
|
stl_items[curitem].stl_type = Group;
|
||||||
item[curitem].start = p;
|
stl_items[curitem].stl_start = p;
|
||||||
item[curitem].minwid = minwid;
|
stl_items[curitem].stl_minwid = minwid;
|
||||||
item[curitem].maxwid = maxwid;
|
stl_items[curitem].stl_maxwid = maxwid;
|
||||||
s++;
|
s++;
|
||||||
curitem++;
|
curitem++;
|
||||||
continue;
|
continue;
|
||||||
@@ -4647,9 +4681,9 @@ build_stl_str_hl(
|
|||||||
++s;
|
++s;
|
||||||
if (*s == '#')
|
if (*s == '#')
|
||||||
{
|
{
|
||||||
item[curitem].type = Highlight;
|
stl_items[curitem].stl_type = Highlight;
|
||||||
item[curitem].start = p;
|
stl_items[curitem].stl_start = p;
|
||||||
item[curitem].minwid = -syn_namen2id(t, (int)(s - t));
|
stl_items[curitem].stl_minwid = -syn_namen2id(t, (int)(s - t));
|
||||||
curitem++;
|
curitem++;
|
||||||
}
|
}
|
||||||
if (*s != NUL)
|
if (*s != NUL)
|
||||||
@@ -4657,8 +4691,8 @@ build_stl_str_hl(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
item[curitem].start = p;
|
stl_items[curitem].stl_start = p;
|
||||||
item[curitem].type = Normal;
|
stl_items[curitem].stl_type = Normal;
|
||||||
if (str != NULL && *str)
|
if (str != NULL && *str)
|
||||||
{
|
{
|
||||||
t = str;
|
t = str;
|
||||||
@@ -4757,7 +4791,7 @@ build_stl_str_hl(
|
|||||||
p += STRLEN(p);
|
p += STRLEN(p);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
item[curitem].type = Empty;
|
stl_items[curitem].stl_type = Empty;
|
||||||
|
|
||||||
if (opt == STL_VIM_EXPR)
|
if (opt == STL_VIM_EXPR)
|
||||||
vim_free(str);
|
vim_free(str);
|
||||||
@@ -4784,16 +4818,16 @@ build_stl_str_hl(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
for ( ; l < itemcnt; l++)
|
for ( ; l < itemcnt; l++)
|
||||||
if (item[l].type == Trunc)
|
if (stl_items[l].stl_type == Trunc)
|
||||||
{
|
{
|
||||||
// Truncate at %< item.
|
// Truncate at %< item.
|
||||||
s = item[l].start;
|
s = stl_items[l].stl_start;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (l == itemcnt)
|
if (l == itemcnt)
|
||||||
{
|
{
|
||||||
// No %< item, truncate first item.
|
// No %< item, truncate first item.
|
||||||
s = item[0].start;
|
s = stl_items[0].stl_start;
|
||||||
l = 0;
|
l = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4819,7 +4853,7 @@ build_stl_str_hl(
|
|||||||
else
|
else
|
||||||
s = out + maxwidth - 1;
|
s = out + maxwidth - 1;
|
||||||
for (l = 0; l < itemcnt; l++)
|
for (l = 0; l < itemcnt; l++)
|
||||||
if (item[l].start > s)
|
if (stl_items[l].stl_start > s)
|
||||||
break;
|
break;
|
||||||
itemcnt = l;
|
itemcnt = l;
|
||||||
*s++ = '>';
|
*s++ = '>';
|
||||||
@@ -4853,10 +4887,10 @@ build_stl_str_hl(
|
|||||||
--n; // count the '<'
|
--n; // count the '<'
|
||||||
for (; l < itemcnt; l++)
|
for (; l < itemcnt; l++)
|
||||||
{
|
{
|
||||||
if (item[l].start - n >= s)
|
if (stl_items[l].stl_start - n >= s)
|
||||||
item[l].start -= n;
|
stl_items[l].stl_start -= n;
|
||||||
else
|
else
|
||||||
item[l].start = s;
|
stl_items[l].stl_start = s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
width = maxwidth;
|
width = maxwidth;
|
||||||
@@ -4865,16 +4899,16 @@ build_stl_str_hl(
|
|||||||
{
|
{
|
||||||
// Apply STL_MIDDLE if any
|
// Apply STL_MIDDLE if any
|
||||||
for (l = 0; l < itemcnt; l++)
|
for (l = 0; l < itemcnt; l++)
|
||||||
if (item[l].type == Middle)
|
if (stl_items[l].stl_type == Middle)
|
||||||
break;
|
break;
|
||||||
if (l < itemcnt)
|
if (l < itemcnt)
|
||||||
{
|
{
|
||||||
p = item[l].start + maxwidth - width;
|
p = stl_items[l].stl_start + maxwidth - width;
|
||||||
STRMOVE(p, item[l].start);
|
STRMOVE(p, stl_items[l].stl_start);
|
||||||
for (s = item[l].start; s < p; s++)
|
for (s = stl_items[l].stl_start; s < p; s++)
|
||||||
*s = fillchar;
|
*s = fillchar;
|
||||||
for (l++; l < itemcnt; l++)
|
for (l++; l < itemcnt; l++)
|
||||||
item[l].start += maxwidth - width;
|
stl_items[l].stl_start += maxwidth - width;
|
||||||
width = maxwidth;
|
width = maxwidth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4882,13 +4916,14 @@ build_stl_str_hl(
|
|||||||
// Store the info about highlighting.
|
// Store the info about highlighting.
|
||||||
if (hltab != NULL)
|
if (hltab != NULL)
|
||||||
{
|
{
|
||||||
sp = hltab;
|
*hltab = stl_hltab;
|
||||||
|
sp = stl_hltab;
|
||||||
for (l = 0; l < itemcnt; l++)
|
for (l = 0; l < itemcnt; l++)
|
||||||
{
|
{
|
||||||
if (item[l].type == Highlight)
|
if (stl_items[l].stl_type == Highlight)
|
||||||
{
|
{
|
||||||
sp->start = item[l].start;
|
sp->start = stl_items[l].stl_start;
|
||||||
sp->userhl = item[l].minwid;
|
sp->userhl = stl_items[l].stl_minwid;
|
||||||
sp++;
|
sp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4899,13 +4934,14 @@ build_stl_str_hl(
|
|||||||
// Store the info about tab pages labels.
|
// Store the info about tab pages labels.
|
||||||
if (tabtab != NULL)
|
if (tabtab != NULL)
|
||||||
{
|
{
|
||||||
sp = tabtab;
|
*tabtab = stl_tabtab;
|
||||||
|
sp = stl_tabtab;
|
||||||
for (l = 0; l < itemcnt; l++)
|
for (l = 0; l < itemcnt; l++)
|
||||||
{
|
{
|
||||||
if (item[l].type == TabPage)
|
if (stl_items[l].stl_type == TabPage)
|
||||||
{
|
{
|
||||||
sp->start = item[l].start;
|
sp->start = stl_items[l].stl_start;
|
||||||
sp->userhl = item[l].minwid;
|
sp->userhl = stl_items[l].stl_minwid;
|
||||||
sp++;
|
sp++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5534,8 +5570,8 @@ bt_nofile(buf_T *buf)
|
|||||||
bt_dontwrite(buf_T *buf)
|
bt_dontwrite(buf_T *buf)
|
||||||
{
|
{
|
||||||
return buf != NULL && (buf->b_p_bt[0] == 'n'
|
return buf != NULL && (buf->b_p_bt[0] == 'n'
|
||||||
|| buf->b_p_bt[0] == 't'
|
|| buf->b_p_bt[0] == 't'
|
||||||
|| buf->b_p_bt[0] == 'p');
|
|| buf->b_p_bt[0] == 'p');
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_QUICKFIX) || defined(PROTO)
|
#if defined(FEAT_QUICKFIX) || defined(PROTO)
|
||||||
|
@@ -571,11 +571,10 @@ valid_filetype(char_u *val)
|
|||||||
static char *
|
static char *
|
||||||
check_stl_option(char_u *s)
|
check_stl_option(char_u *s)
|
||||||
{
|
{
|
||||||
int itemcnt = 0;
|
|
||||||
int groupdepth = 0;
|
int groupdepth = 0;
|
||||||
static char errbuf[80];
|
static char errbuf[80];
|
||||||
|
|
||||||
while (*s && itemcnt < STL_MAX_ITEM)
|
while (*s)
|
||||||
{
|
{
|
||||||
// Check for valid keys after % sequences
|
// Check for valid keys after % sequences
|
||||||
while (*s && *s != '%')
|
while (*s && *s != '%')
|
||||||
@@ -583,8 +582,6 @@ check_stl_option(char_u *s)
|
|||||||
if (!*s)
|
if (!*s)
|
||||||
break;
|
break;
|
||||||
s++;
|
s++;
|
||||||
if (*s != '%' && *s != ')')
|
|
||||||
++itemcnt;
|
|
||||||
if (*s == '%' || *s == STL_TRUNCMARK || *s == STL_MIDDLEMARK)
|
if (*s == '%' || *s == STL_TRUNCMARK || *s == STL_MIDDLEMARK)
|
||||||
{
|
{
|
||||||
s++;
|
s++;
|
||||||
@@ -627,8 +624,6 @@ check_stl_option(char_u *s)
|
|||||||
return N_("E540: Unclosed expression sequence");
|
return N_("E540: Unclosed expression sequence");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (itemcnt >= STL_MAX_ITEM)
|
|
||||||
return N_("E541: too many items");
|
|
||||||
if (groupdepth != 0)
|
if (groupdepth != 0)
|
||||||
return N_("E542: unbalanced groups");
|
return N_("E542: unbalanced groups");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -48,7 +48,7 @@ void col_print(char_u *buf, size_t buflen, int col, int vcol);
|
|||||||
void maketitle(void);
|
void maketitle(void);
|
||||||
void resettitle(void);
|
void resettitle(void);
|
||||||
void free_titles(void);
|
void free_titles(void);
|
||||||
int build_stl_str_hl(win_T *wp, char_u *out, size_t outlen, char_u *fmt, int use_sandbox, int fillchar, int maxwidth, struct stl_hlrec *hltab, struct stl_hlrec *tabtab);
|
int build_stl_str_hl(win_T *wp, char_u *out, size_t outlen, char_u *fmt, int use_sandbox, int fillchar, int maxwidth, stl_hlrec_T **hltab, stl_hlrec_T **tabtab);
|
||||||
void get_rel_pos(win_T *wp, char_u *buf, int buflen);
|
void get_rel_pos(win_T *wp, char_u *buf, int buflen);
|
||||||
char_u *fix_fname(char_u *fname);
|
char_u *fix_fname(char_u *fname);
|
||||||
void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname);
|
void fname_expand(buf_T *buf, char_u **ffname, char_u **sfname);
|
||||||
|
@@ -1196,8 +1196,8 @@ win_redr_custom(
|
|||||||
char_u buf[MAXPATHL];
|
char_u buf[MAXPATHL];
|
||||||
char_u *stl;
|
char_u *stl;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
struct stl_hlrec hltab[STL_MAX_ITEM];
|
stl_hlrec_T *hltab;
|
||||||
struct stl_hlrec tabtab[STL_MAX_ITEM];
|
stl_hlrec_T *tabtab;
|
||||||
int use_sandbox = FALSE;
|
int use_sandbox = FALSE;
|
||||||
win_T *ewp;
|
win_T *ewp;
|
||||||
int p_crb_save;
|
int p_crb_save;
|
||||||
@@ -1287,7 +1287,7 @@ win_redr_custom(
|
|||||||
stl = vim_strsave(stl);
|
stl = vim_strsave(stl);
|
||||||
width = build_stl_str_hl(ewp, buf, sizeof(buf),
|
width = build_stl_str_hl(ewp, buf, sizeof(buf),
|
||||||
stl, use_sandbox,
|
stl, use_sandbox,
|
||||||
fillchar, maxwidth, hltab, tabtab);
|
fillchar, maxwidth, &hltab, &tabtab);
|
||||||
vim_free(stl);
|
vim_free(stl);
|
||||||
ewp->w_p_crb = p_crb_save;
|
ewp->w_p_crb = p_crb_save;
|
||||||
|
|
||||||
|
@@ -1229,14 +1229,15 @@ struct mapblock
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Used for highlighting in the status line.
|
* Used for highlighting in the status line.
|
||||||
*/
|
*/
|
||||||
struct stl_hlrec
|
typedef struct
|
||||||
{
|
{
|
||||||
char_u *start;
|
char_u *start;
|
||||||
int userhl; // 0: no HL, 1-9: User HL, < 0 for syn ID
|
int userhl; // 0: no HL, 1-9: User HL, < 0 for syn ID
|
||||||
};
|
} stl_hlrec_T;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -372,7 +372,6 @@ func Test_set_errors()
|
|||||||
call assert_fails('set commentstring=x', 'E537:')
|
call assert_fails('set commentstring=x', 'E537:')
|
||||||
call assert_fails('set complete=x', 'E539:')
|
call assert_fails('set complete=x', 'E539:')
|
||||||
call assert_fails('set statusline=%{', 'E540:')
|
call assert_fails('set statusline=%{', 'E540:')
|
||||||
call assert_fails('set statusline=' . repeat("%p", 81), 'E541:')
|
|
||||||
call assert_fails('set statusline=%(', 'E542:')
|
call assert_fails('set statusline=%(', 'E542:')
|
||||||
if has('cursorshape')
|
if has('cursorshape')
|
||||||
" This invalid value for 'guicursor' used to cause Vim to crash.
|
" This invalid value for 'guicursor' used to cause Vim to crash.
|
||||||
|
@@ -376,6 +376,21 @@ func Test_statusline()
|
|||||||
delfunc GetNested
|
delfunc GetNested
|
||||||
delfunc GetStatusLine
|
delfunc GetStatusLine
|
||||||
|
|
||||||
|
" Test statusline works with 80+ items
|
||||||
|
function! StatusLabel()
|
||||||
|
redrawstatus
|
||||||
|
return '[label]'
|
||||||
|
endfunc
|
||||||
|
let statusline = '%{StatusLabel()}'
|
||||||
|
for i in range(150)
|
||||||
|
let statusline .= '%#TabLine' . (i % 2 == 0 ? 'Fill' : 'Sel') . '#' . string(i)[0]
|
||||||
|
endfor
|
||||||
|
let &statusline = statusline
|
||||||
|
redrawstatus
|
||||||
|
set statusline&
|
||||||
|
delfunc StatusLabel
|
||||||
|
|
||||||
|
|
||||||
" Check statusline in current and non-current window
|
" Check statusline in current and non-current window
|
||||||
" with the 'fillchars' option.
|
" with the 'fillchars' option.
|
||||||
set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
|
set fillchars=stl:^,stlnc:=,vert:\|,fold:-,diff:-
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1909,
|
||||||
/**/
|
/**/
|
||||||
1908,
|
1908,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -1699,7 +1699,6 @@ typedef unsigned short disptick_T; // display tick type
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SHOWCMD_COLS 10 // columns needed by shown command
|
#define SHOWCMD_COLS 10 // columns needed by shown command
|
||||||
#define STL_MAX_ITEM 80 // max nr of %<flag> in statusline
|
|
||||||
|
|
||||||
typedef void *vim_acl_T; // dummy to pass an ACL to a function
|
typedef void *vim_acl_T; // dummy to pass an ACL to a function
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user