summaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-05-23 22:11:59 +0200
committerBram Moolenaar <Bram@vim.org>2019-05-23 22:11:59 +0200
commit1c6fd1e100fd0457375642ec50d483bcc0f61bb2 (patch)
tree88d15359a046a461250ab7301d0f5216b1616837 /src/buffer.c
parent99499b1c05f85f83876b828eea3f6e14f0f407b4 (diff)
patch 8.1.1372: when evaluating 'statusline' the current window is unknownv8.1.1372
Problem: When evaluating 'statusline' the current window is unknown. (Daniel Hahler) Solution: Set "g:actual_curwin" for %{} items. Set "g:statusline_winid" when evaluationg %!. (closes #4406, closes #3299)
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 0e45f0e66c..425c9143a1 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3893,7 +3893,8 @@ build_stl_str_hl(
char_u base;
char_u opt;
#define TMPLEN 70
- char_u tmp[TMPLEN];
+ char_u buf_tmp[TMPLEN];
+ char_u win_tmp[TMPLEN];
char_u *usefmt = fmt;
struct stl_hlrec *sp;
int save_must_redraw = must_redraw;
@@ -3906,9 +3907,17 @@ build_stl_str_hl(
*/
if (fmt[0] == '%' && fmt[1] == '!')
{
+ typval_T tv;
+
+ tv.v_type = VAR_NUMBER;
+ tv.vval.v_number = wp->w_id;
+ set_var((char_u *)"g:statusline_winid", &tv, FALSE);
+
usefmt = eval_to_string_safe(fmt + 2, NULL, use_sandbox);
if (usefmt == NULL)
usefmt = fmt;
+
+ do_unlet((char_u *)"g:statusline_winid", TRUE);
}
#endif
@@ -4225,8 +4234,11 @@ build_stl_str_hl(
p = t;
#ifdef FEAT_EVAL
- vim_snprintf((char *)tmp, sizeof(tmp), "%d", curbuf->b_fnum);
- set_internal_string_var((char_u *)"g:actual_curbuf", tmp);
+ vim_snprintf((char *)buf_tmp, sizeof(buf_tmp),
+ "%d", curbuf->b_fnum);
+ set_internal_string_var((char_u *)"g:actual_curbuf", buf_tmp);
+ vim_snprintf((char *)win_tmp, sizeof(win_tmp), "%d", curwin->w_id);
+ set_internal_string_var((char_u *)"g:actual_curwin", win_tmp);
save_curbuf = curbuf;
save_curwin = curwin;
@@ -4238,6 +4250,7 @@ build_stl_str_hl(
curwin = save_curwin;
curbuf = save_curbuf;
do_unlet((char_u *)"g:actual_curbuf", TRUE);
+ do_unlet((char_u *)"g:actual_curwin", TRUE);
if (str != NULL && *str != 0)
{
@@ -4290,21 +4303,21 @@ build_stl_str_hl(
break;
case STL_ALTPERCENT:
- str = tmp;
+ str = buf_tmp;
get_rel_pos(wp, str, TMPLEN);
break;
case STL_ARGLISTSTAT:
fillable = FALSE;
- tmp[0] = 0;
- if (append_arg_number(wp, tmp, (int)sizeof(tmp), FALSE))
- str = tmp;
+ buf_tmp[0] = 0;
+ if (append_arg_number(wp, buf_tmp, (int)sizeof(buf_tmp), FALSE))
+ str = buf_tmp;
break;
case STL_KEYMAP:
fillable = FALSE;
- if (get_keymap_str(wp, (char_u *)"<%s>", tmp, TMPLEN))
- str = tmp;
+ if (get_keymap_str(wp, (char_u *)"<%s>", buf_tmp, TMPLEN))
+ str = buf_tmp;
break;
case STL_PAGENUM:
#if defined(FEAT_PRINTER) || defined(FEAT_GUI_TABLINE)
@@ -4360,9 +4373,9 @@ build_stl_str_hl(
if (*wp->w_buffer->b_p_ft != NUL
&& STRLEN(wp->w_buffer->b_p_ft) < TMPLEN - 3)
{
- vim_snprintf((char *)tmp, sizeof(tmp), "[%s]",
+ vim_snprintf((char *)buf_tmp, sizeof(buf_tmp), "[%s]",
wp->w_buffer->b_p_ft);
- str = tmp;
+ str = buf_tmp;
}
break;
@@ -4371,11 +4384,11 @@ build_stl_str_hl(
if (*wp->w_buffer->b_p_ft != NUL
&& STRLEN(wp->w_buffer->b_p_ft) < TMPLEN - 2)
{
- vim_snprintf((char *)tmp, sizeof(tmp), ",%s",
+ vim_snprintf((char *)buf_tmp, sizeof(buf_tmp), ",%s",
wp->w_buffer->b_p_ft);
- for (t = tmp; *t != 0; t++)
+ for (t = buf_tmp; *t != 0; t++)
*t = TOUPPER_LOC(*t);
- str = tmp;
+ str = buf_tmp;
}
break;