aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2023-04-01 14:58:52 +0200
committerLuuk van Baal <luukvbaal@gmail.com>2023-04-05 12:36:47 +0200
commitf0ac91c58b42ed4f38dea7352d89fd39a88142f4 (patch)
tree743426a5cb8b6c37ae4cb48e7cd8c06a2dcde8d2
parent9e7426718b678e299f3fd03ef94f81b1e2d01ab0 (diff)
downloadrneovim-f0ac91c58b42ed4f38dea7352d89fd39a88142f4.tar.gz
rneovim-f0ac91c58b42ed4f38dea7352d89fd39a88142f4.tar.bz2
rneovim-f0ac91c58b42ed4f38dea7352d89fd39a88142f4.zip
feat(api): evaluate 'statuscolumn' with nvim_eval_statusline()
-rw-r--r--runtime/doc/api.txt2
-rw-r--r--runtime/doc/news.txt3
-rw-r--r--src/nvim/api/keysets.lua1
-rw-r--r--src/nvim/api/private/helpers.c4
-rw-r--r--src/nvim/api/vim.c59
-rw-r--r--src/nvim/decoration.c16
-rw-r--r--src/nvim/drawline.c69
-rw-r--r--src/nvim/highlight_defs.h4
-rw-r--r--src/nvim/sign.c18
-rw-r--r--src/nvim/sign_defs.h2
-rw-r--r--src/nvim/statusline.c11
-rw-r--r--src/nvim/statusline_defs.h4
-rw-r--r--test/functional/api/vim_spec.lua34
13 files changed, 153 insertions, 74 deletions
diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt
index 3c3e66dd57..46816856b9 100644
--- a/runtime/doc/api.txt
+++ b/runtime/doc/api.txt
@@ -773,6 +773,8 @@ nvim_eval_statusline({str}, {*opts}) *nvim_eval_statusline()*
• use_tabline: (boolean) Evaluate tabline instead of
statusline. When true, {winid} is ignored. Mutually
exclusive with {use_winbar}.
+ • use_statuscol: (boolean) Evaluate statuscolumn instead of
+ statusline.
Return: ~
Dictionary containing statusline information, with these keys:
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index f68edde33b..98f3f3f398 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -73,6 +73,9 @@ NEW FEATURES *news-features*
The following new APIs or features were added.
+• |nvim_eval_statusline()| supports evaluating the |'statuscolumn'| through a
+ new `opts` field: `use_statuscol`.
+
• |nvim_buf_get_extmarks()| now accepts a -1 `ns_id` to request extmarks from
all namespaces and adds the namespace id to the details array.
Other missing properties have been added to the details array and marks can
diff --git a/src/nvim/api/keysets.lua b/src/nvim/api/keysets.lua
index ce29001787..26e87bccec 100644
--- a/src/nvim/api/keysets.lua
+++ b/src/nvim/api/keysets.lua
@@ -97,6 +97,7 @@ return {
"highlights";
"use_winbar";
"use_tabline";
+ "use_statuscol";
}};
{ 'option', {
"scope";
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index c996e19eb9..02060a8950 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -959,12 +959,14 @@ bool set_mark(buf_T *buf, String name, Integer line, Integer col, Error *err)
}
/// Get default statusline highlight for window
-const char *get_default_stl_hl(win_T *wp, bool use_winbar)
+const char *get_default_stl_hl(win_T *wp, bool use_winbar, int stc_hl_id)
{
if (wp == NULL) {
return "TabLineFill";
} else if (use_winbar) {
return (wp == curwin) ? "WinBar" : "WinBarNC";
+ } else if (stc_hl_id > 0) {
+ return syn_id2name(stc_hl_id);
} else {
return (wp == curwin) ? "StatusLine" : "StatusLineNC";
}
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 343c3b6e40..383953a676 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -25,6 +25,7 @@
#include "nvim/buffer.h"
#include "nvim/channel.h"
#include "nvim/context.h"
+#include "nvim/cursor.h"
#include "nvim/drawscreen.h"
#include "nvim/eval.h"
#include "nvim/eval/typval.h"
@@ -59,6 +60,7 @@
#include "nvim/popupmenu.h"
#include "nvim/pos.h"
#include "nvim/runtime.h"
+#include "nvim/sign.h"
#include "nvim/state.h"
#include "nvim/statusline.h"
#include "nvim/strings.h"
@@ -2054,6 +2056,7 @@ Array nvim_get_mark(String name, Dictionary opts, Error *err)
/// - use_winbar: (boolean) Evaluate winbar instead of statusline.
/// - use_tabline: (boolean) Evaluate tabline instead of statusline. When true, {winid}
/// is ignored. Mutually exclusive with {use_winbar}.
+/// - use_statuscol: (boolean) Evaluate statuscolumn instead of statusline.
///
/// @param[out] err Error details, if any.
/// @return Dictionary containing statusline information, with these keys:
@@ -2071,9 +2074,11 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
int maxwidth;
int fillchar = 0;
+ int use_bools = 0;
Window window = 0;
bool use_winbar = false;
bool use_tabline = false;
+ bool use_statuscol = false;
bool highlights = false;
if (str.size < 2 || memcmp(str.data, "%!", 2) != 0) {
@@ -2111,23 +2116,34 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
}
if (HAS_KEY(opts->use_winbar)) {
use_winbar = api_object_to_bool(opts->use_winbar, "use_winbar", false, err);
-
+ use_bools++;
if (ERROR_SET(err)) {
return result;
}
}
if (HAS_KEY(opts->use_tabline)) {
use_tabline = api_object_to_bool(opts->use_tabline, "use_tabline", false, err);
-
+ use_bools++;
if (ERROR_SET(err)) {
return result;
}
}
- VALIDATE(!(use_winbar && use_tabline), "%s", "Cannot use both 'use_winbar' and 'use_tabline'", {
+ if (HAS_KEY(opts->use_statuscol)) {
+ use_statuscol = api_object_to_bool(opts->use_statuscol, "use_statuscol", false, err);
+ use_bools++;
+ if (ERROR_SET(err)) {
+ return result;
+ }
+ }
+ VALIDATE(use_bools <= 1, "%s",
+ "Can only use one of 'use_winbar', 'use_tabline' and 'use_statuscol'", {
return result;
});
win_T *wp, *ewp;
+ int stc_hl_id = 0;
+ statuscol_T statuscol = { 0 };
+ SignTextAttrs sattrs[SIGN_SHOW_MAX] = { 0 };
if (use_tabline) {
wp = NULL;
@@ -2149,6 +2165,31 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
fillchar = fillchar_status(&attr, wp);
}
}
+ if (use_statuscol) {
+ HlPriId line = { 0 };
+ HlPriId cul = { 0 };
+ HlPriId num = { 0 };
+ linenr_T lnum = (linenr_T)get_vim_var_nr(VV_LNUM);
+ int num_signs = buf_get_signattrs(wp->w_buffer, lnum, sattrs, &num, &line, &cul);
+ decor_redraw_signs(wp->w_buffer, lnum - 1, &num_signs, sattrs, &num, &line, &cul);
+
+ statuscol.sattrs = sattrs;
+ statuscol.foldinfo = fold_info(wp, lnum);
+ statuscol.use_cul = wp->w_p_cul && lnum == wp->w_cursorline
+ && (wp->w_p_culopt_flags & CULOPT_NBR);
+ statuscol.sign_cul_id = statuscol.use_cul ? cul.hl_id : 0;
+ if (num.hl_id) {
+ stc_hl_id = num.hl_id;
+ } else if (statuscol.use_cul) {
+ stc_hl_id = HLF_CLN + 1;
+ } else if (wp->w_p_rnu) {
+ stc_hl_id = (lnum < wp->w_cursor.lnum ? HLF_LNA : HLF_LNB) + 1;
+ } else {
+ stc_hl_id = HLF_N + 1;
+ }
+ set_vim_var_nr(VV_RELNUM, labs(get_cursor_rel_lnum(wp, lnum)));
+ set_vim_var_nr(VV_VIRTNUM, 0);
+ }
}
if (HAS_KEY(opts->maxwidth)) {
@@ -2158,12 +2199,12 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
maxwidth = (int)opts->maxwidth.data.integer;
} else {
- maxwidth = (use_tabline || (!use_winbar && global_stl_height() > 0)) ? Columns : wp->w_width;
+ maxwidth = use_statuscol ? win_col_off(wp)
+ : (use_tabline || (!use_winbar && global_stl_height() > 0)) ? Columns : wp->w_width;
}
char buf[MAXPATHL];
stl_hlrec_t *hltab;
- stl_hlrec_t **hltab_ptr = highlights ? &hltab : NULL;
// Temporarily reset 'cursorbind' to prevent side effects from moving the cursor away and back.
int p_crb_save = ewp->w_p_crb;
@@ -2177,9 +2218,9 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
0,
fillchar,
maxwidth,
- hltab_ptr,
+ highlights ? &hltab : NULL,
NULL,
- NULL);
+ use_statuscol ? &statuscol : NULL);
PUT(result, "width", INTEGER_OBJ(width));
@@ -2195,7 +2236,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
// add the default highlight at the beginning of the highlight list
if (hltab->start == NULL || (hltab->start - buf) != 0) {
Dictionary hl_info = ARRAY_DICT_INIT;
- grpname = get_default_stl_hl(wp, use_winbar);
+ grpname = get_default_stl_hl(wp, use_winbar, stc_hl_id);
PUT(hl_info, "start", INTEGER_OBJ(0));
PUT(hl_info, "group", CSTR_TO_OBJ(grpname));
@@ -2209,7 +2250,7 @@ Dictionary nvim_eval_statusline(String str, Dict(eval_statusline) *opts, Error *
PUT(hl_info, "start", INTEGER_OBJ(sp->start - buf));
if (sp->userhl == 0) {
- grpname = get_default_stl_hl(wp, use_winbar);
+ grpname = get_default_stl_hl(wp, use_winbar, stc_hl_id);
} else if (sp->userhl < 0) {
grpname = syn_id2name(-sp->userhl);
} else {
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index f45e13b42a..ea54554c46 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -386,7 +386,7 @@ next_mark:
}
void decor_redraw_signs(buf_T *buf, int row, int *num_signs, SignTextAttrs sattrs[],
- HlPriAttr *num_attrs, HlPriAttr *line_attrs, HlPriAttr *cul_attrs)
+ HlPriId *num_id, HlPriId *line_id, HlPriId *cul_id)
{
if (!buf->b_signs) {
return;
@@ -422,23 +422,23 @@ void decor_redraw_signs(buf_T *buf, int row, int *num_signs, SignTextAttrs sattr
if (j < SIGN_SHOW_MAX) {
sattrs[j] = (SignTextAttrs) {
.text = decor->sign_text,
- .hl_attr_id = decor->sign_hl_id == 0 ? 0 : syn_id2attr(decor->sign_hl_id),
+ .hl_id = decor->sign_hl_id,
.priority = decor->priority
};
(*num_signs)++;
}
}
- struct { HlPriAttr *dest; int hl; } cattrs[] = {
- { line_attrs, decor->line_hl_id },
- { num_attrs, decor->number_hl_id },
- { cul_attrs, decor->cursorline_hl_id },
+ struct { HlPriId *dest; int hl; } cattrs[] = {
+ { line_id, decor->line_hl_id },
+ { num_id, decor->number_hl_id },
+ { cul_id, decor->cursorline_hl_id },
{ NULL, -1 },
};
for (int i = 0; cattrs[i].dest; i++) {
if (cattrs[i].hl != 0 && decor->priority >= cattrs[i].dest->priority) {
- *cattrs[i].dest = (HlPriAttr) {
- .attr_id = syn_id2attr(cattrs[i].hl),
+ *cattrs[i].dest = (HlPriId) {
+ .hl_id = cattrs[i].hl,
.priority = decor->priority
};
}
diff --git a/src/nvim/drawline.c b/src/nvim/drawline.c
index caad88c212..a05fb4e08e 100644
--- a/src/nvim/drawline.c
+++ b/src/nvim/drawline.c
@@ -508,31 +508,12 @@ static void get_sign_display_info(bool nrcol, win_T *wp, winlinevars_T *wlv, int
if (use_cursor_line_highlight(wp, wlv->lnum) && sign_cul_attr > 0) {
wlv->char_attr = sign_cul_attr;
} else {
- wlv->char_attr = sattr->hl_attr_id;
+ wlv->char_attr = sattr->hl_id ? syn_id2attr(sattr->hl_id) : 0;
}
}
}
}
-static int get_sign_attrs(buf_T *buf, winlinevars_T *wlv, int *sign_num_attrp, int *sign_cul_attrp)
-{
- HlPriAttr line_attrs = { wlv->line_attr, 0 };
- HlPriAttr num_attrs = { *sign_num_attrp, 0 };
- HlPriAttr cul_attrs = { *sign_cul_attrp, 0 };
-
- // TODO(bfredl, vigoux): line_attr should not take priority over decoration!
- int num_signs = buf_get_signattrs(buf, wlv->lnum, wlv->sattrs, &num_attrs, &line_attrs,
- &cul_attrs);
- decor_redraw_signs(buf, wlv->lnum - 1, &num_signs, wlv->sattrs, &num_attrs, &line_attrs,
- &cul_attrs);
-
- wlv->line_attr = line_attrs.attr_id;
- *sign_num_attrp = num_attrs.attr_id;
- *sign_cul_attrp = cul_attrs.attr_id;
-
- return num_signs;
-}
-
/// Returns width of the signcolumn that should be used for the whole window
///
/// @param wp window we want signcolumn width from
@@ -726,7 +707,7 @@ static void get_statuscol_display_info(statuscol_T *stcp, winlinevars_T *wlv)
if (stcp->textp + wlv->n_extra < stcp->text_end) {
int hl = stcp->hlrecp->userhl;
stcp->textp = stcp->hlrecp->start;
- stcp->cur_attr = hl < 0 ? syn_id2attr(-hl) : hl > 0 ? hl : stcp->num_attr;
+ stcp->cur_attr = hl < 0 ? syn_id2attr(-hl) : stcp->num_attr;
stcp->hlrecp++;
wlv->draw_state = WL_STC - 1;
}
@@ -1288,9 +1269,37 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
area_highlighting = true;
}
- int sign_num_attr = 0; // sign attribute for the number column
- int sign_cul_attr = 0; // sign attribute for cursorline
- int num_signs = get_sign_attrs(buf, &wlv, &sign_num_attr, &sign_cul_attr);
+ HlPriId line_id = { 0 };
+ HlPriId sign_cul = { 0 };
+ HlPriId sign_num = { 0 };
+ // TODO(bfredl, vigoux): line_attr should not take priority over decoration!
+ int num_signs = buf_get_signattrs(buf, wlv.lnum, wlv.sattrs, &sign_num, &line_id, &sign_cul);
+ decor_redraw_signs(buf, wlv.lnum - 1, &num_signs, wlv.sattrs, &sign_num, &line_id, &sign_cul);
+
+ int sign_cul_attr = 0;
+ int sign_num_attr = 0;
+ statuscol_T statuscol = { 0 };
+ if (*wp->w_p_stc != NUL) {
+ // Draw the 'statuscolumn' if option is set.
+ statuscol.draw = true;
+ statuscol.sattrs = wlv.sattrs;
+ statuscol.foldinfo = foldinfo;
+ statuscol.width = win_col_off(wp) - (cmdwin_type != 0 && wp == curwin);
+ statuscol.use_cul = use_cursor_line_highlight(wp, lnum);
+ statuscol.sign_cul_id = statuscol.use_cul ? sign_cul.hl_id : 0;
+ statuscol.num_attr = sign_num.hl_id ? syn_id2attr(sign_num.hl_id)
+ : get_line_number_attr(wp, &wlv);
+ } else {
+ if (sign_cul.hl_id > 0) {
+ sign_cul_attr = syn_id2attr(sign_cul.hl_id);
+ }
+ if (sign_num.hl_id > 0) {
+ sign_num_attr = syn_id2attr(sign_num.hl_id);
+ }
+ }
+ if (line_id.hl_id > 0) {
+ wlv.line_attr = syn_id2attr(line_id.hl_id);
+ }
// Highlight the current line in the quickfix window.
if (bt_quickfix(wp->w_buffer) && qf_current_entry(wp) == lnum) {
@@ -1495,18 +1504,6 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool nochange,
extra_check = true;
}
- statuscol_T statuscol = { 0 };
- if (*wp->w_p_stc != NUL) {
- // Draw the 'statuscolumn' if option is set.
- statuscol.draw = true;
- statuscol.sattrs = wlv.sattrs;
- statuscol.foldinfo = foldinfo;
- statuscol.width = win_col_off(wp) - (cmdwin_type != 0 && wp == curwin);
- statuscol.use_cul = use_cursor_line_highlight(wp, lnum);
- statuscol.sign_cul_attr = statuscol.use_cul ? sign_cul_attr : 0;
- statuscol.num_attr = sign_num_attr ? sign_num_attr : get_line_number_attr(wp, &wlv);
- }
-
int sign_idx = 0;
int virt_line_index;
int virt_line_offset = -1;
diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h
index a5586659c7..f690b57148 100644
--- a/src/nvim/highlight_defs.h
+++ b/src/nvim/highlight_defs.h
@@ -247,8 +247,8 @@ typedef struct {
/// highlight attributes with associated priorities
typedef struct {
- int attr_id;
+ int hl_id;
int priority;
-} HlPriAttr;
+} HlPriId;
#endif // NVIM_HIGHLIGHT_DEFS_H
diff --git a/src/nvim/sign.c b/src/nvim/sign.c
index d555b8bf4a..86a2586f06 100644
--- a/src/nvim/sign.c
+++ b/src/nvim/sign.c
@@ -491,8 +491,8 @@ SignTextAttrs *sign_get_attr(int idx, SignTextAttrs sattrs[], int max_signs)
/// @param lnum Line in which to search
/// @param sattrs Output array for attrs
/// @return Number of signs of which attrs were found
-int buf_get_signattrs(buf_T *buf, linenr_T lnum, SignTextAttrs sattrs[], HlPriAttr *num_attrs,
- HlPriAttr *line_attrs, HlPriAttr *cul_attrs)
+int buf_get_signattrs(buf_T *buf, linenr_T lnum, SignTextAttrs sattrs[], HlPriId *num_id,
+ HlPriId *line_id, HlPriId *cul_id)
{
sign_entry_T *sign;
@@ -517,21 +517,21 @@ int buf_get_signattrs(buf_T *buf, linenr_T lnum, SignTextAttrs sattrs[], HlPriAt
if (sp->sn_text != NULL && sattr_matches < SIGN_SHOW_MAX) {
sattrs[sattr_matches++] = (SignTextAttrs) {
.text = sp->sn_text,
- .hl_attr_id = sp->sn_text_hl == 0 ? 0 : syn_id2attr(sp->sn_text_hl),
+ .hl_id = sp->sn_text_hl,
.priority = sign->se_priority
};
}
- struct { HlPriAttr *dest; int hl; } cattrs[] = {
- { line_attrs, sp->sn_line_hl },
- { num_attrs, sp->sn_num_hl },
- { cul_attrs, sp->sn_cul_hl },
+ struct { HlPriId *dest; int hl; } cattrs[] = {
+ { line_id, sp->sn_line_hl },
+ { num_id, sp->sn_num_hl },
+ { cul_id, sp->sn_cul_hl },
{ NULL, -1 },
};
for (int i = 0; cattrs[i].dest; i++) {
if (cattrs[i].hl != 0 && sign->se_priority >= cattrs[i].dest->priority) {
- *cattrs[i].dest = (HlPriAttr) {
- .attr_id = syn_id2attr(cattrs[i].hl),
+ *cattrs[i].dest = (HlPriId) {
+ .hl_id = cattrs[i].hl,
.priority = sign->se_priority
};
}
diff --git a/src/nvim/sign_defs.h b/src/nvim/sign_defs.h
index bae5344588..274158faad 100644
--- a/src/nvim/sign_defs.h
+++ b/src/nvim/sign_defs.h
@@ -35,7 +35,7 @@ struct sign_entry {
/// Sign attributes. Used by the screen refresh routines.
typedef struct {
char *text;
- int hl_attr_id;
+ int hl_id;
int priority;
} SignTextAttrs;
diff --git a/src/nvim/statusline.c b/src/nvim/statusline.c
index ca92953b05..b36b703309 100644
--- a/src/nvim/statusline.c
+++ b/src/nvim/statusline.c
@@ -1512,7 +1512,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
case STL_LINE:
// Overload %l with v:lnum for 'statuscolumn'
- if (opt_name != NULL && strcmp(opt_name, "statuscolumn") == 0) {
+ if (stcp != NULL) {
if (wp->w_p_nu && !get_vim_var_nr(VV_VIRTNUM)) {
num = (int)get_vim_var_nr(VV_LNUM);
}
@@ -1617,7 +1617,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
case STL_ROFLAG:
case STL_ROFLAG_ALT:
// Overload %r with v:relnum for 'statuscolumn'
- if (opt_name != NULL && strcmp(opt_name, "statuscolumn") == 0) {
+ if (stcp != NULL) {
if (wp->w_p_rnu && !get_vim_var_nr(VV_VIRTNUM)) {
num = (int)get_vim_var_nr(VV_RELNUM);
}
@@ -1652,7 +1652,7 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
char *p;
if (fold) {
size_t n = fill_foldcolumn(out_p, wp, stcp->foldinfo, (linenr_T)get_vim_var_nr(VV_LNUM));
- stl_items[curitem].minwid = win_hl_attr(wp, stcp->use_cul ? HLF_CLF : HLF_FC);
+ stl_items[curitem].minwid = -((stcp->use_cul ? HLF_CLF : HLF_FC) + 1);
p = out_p;
p[n] = NUL;
}
@@ -1668,9 +1668,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, char *opt_n
} else if (!fold) {
SignTextAttrs *sattr = virtnum ? NULL : sign_get_attr(i, stcp->sattrs, wp->w_scwidth);
p = sattr && sattr->text ? sattr->text : " ";
- stl_items[curitem].minwid = sattr ? stcp->sign_cul_attr ? stcp->sign_cul_attr
- : sattr->hl_attr_id
- : win_hl_attr(wp, stcp->use_cul ? HLF_CLS : HLF_SC);
+ stl_items[curitem].minwid = -(sattr ? stcp->sign_cul_id ? stcp->sign_cul_id
+ : sattr->hl_id : (stcp->use_cul ? HLF_CLS : HLF_SC) + 1);
}
stl_items[curitem].type = Highlight;
stl_items[curitem].start = out_p + strlen(buf_tmp);
diff --git a/src/nvim/statusline_defs.h b/src/nvim/statusline_defs.h
index 6835d62cdd..a9483216de 100644
--- a/src/nvim/statusline_defs.h
+++ b/src/nvim/statusline_defs.h
@@ -62,8 +62,8 @@ typedef struct statuscol statuscol_T;
struct statuscol {
int width; ///< width of the status column
int cur_attr; ///< current attributes in text
- int num_attr; ///< attributes used for line number
- int sign_cul_attr; ///< cursorline sign attr
+ int num_attr; ///< default highlight attr
+ int sign_cul_id; ///< cursorline sign highlight id
int truncate; ///< truncated width
bool draw; ///< whether to draw the statuscolumn
bool use_cul; ///< whether to use cursorline attrs
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index ab26425425..cddea48a76 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -3421,6 +3421,40 @@ describe('API', function()
'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight',
{ use_winbar = true, highlights = true }))
end)
+ it('works with statuscolumn', function()
+ command([[
+ let &stc='%C%s%=%l '
+ set cul nu nuw=3 scl=yes:2 fdc=2
+ call setline(1, repeat(['aaaaa'], 5))
+ let g:ns = nvim_create_namespace('')
+ call sign_define('a', {'text':'aa', 'texthl':'IncSearch', 'numhl':'Normal'})
+ call sign_place(2, 1, 'a', bufnr(), {'lnum':4})
+ call nvim_buf_set_extmark(0, g:ns, 3, 1, { 'sign_text':'bb', 'sign_hl_group':'ErrorMsg' })
+ 1,5fold | 1,5 fold | foldopen!
+ ]])
+ command('norm 4G')
+ command('let v:lnum=4')
+ eq({
+ str = '││aabb 4 ',
+ width = 9,
+ highlights = {
+ { group = 'CursorLineFold', start = 0 },
+ { group = 'Normal', start = 6 },
+ { group = 'IncSearch', start = 6 },
+ { group = 'ErrorMsg', start = 8 },
+ { group = 'Normal', start = 10 }
+ }
+ }, meths.eval_statusline('%C%s%=%l ', { use_statuscol = true, highlights = true }))
+ command('let v:lnum=3')
+ eq({
+ str = '3 ' ,
+ width = 2,
+ highlights = {
+ { group = 'LineNr', start = 0 },
+ { group = 'ErrorMsg', start = 1 }
+ }
+ }, meths.eval_statusline('%l%#ErrorMsg# ', { use_statuscol = true, highlights = true }))
+ end)
it('no memory leak with click functions', function()
meths.eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})
eq({