0
0
mirror of https://github.com/vim/vim.git synced 2025-10-01 04:54:07 -04:00

patch 8.1.0706: tabline is not always redrawn

Problem:    Tabline is not always redrawn when something that is used in
            'tabline' changes.
Solution:   Add ":redrawtabline" so that a plugin can at least cause the
            redraw when needed.
This commit is contained in:
Bram Moolenaar
2019-01-08 22:02:56 +01:00
parent 6d4470b0e9
commit e12bab3144
9 changed files with 77 additions and 21 deletions

View File

@@ -7758,6 +7758,9 @@ A jump table for the options with a short description can be found at |Q_op|.
the text to be displayed. Use "%1T" for the first label, "%2T" for the text to be displayed. Use "%1T" for the first label, "%2T" for
the second one, etc. Use "%X" items for closing labels. the second one, etc. Use "%X" items for closing labels.
When changing something that is used in 'tabline' that does not
trigger it to be updated, use |:redrawtabline|.
Keep in mind that only one of the tab pages is the current one, others Keep in mind that only one of the tab pages is the current one, others
are invisible and you can't jump to their windows. are invisible and you can't jump to their windows.

View File

@@ -1,4 +1,4 @@
*various.txt* For Vim version 8.1. Last change: 2018 Dec 13 *various.txt* For Vim version 8.1. Last change: 2019 Jan 08
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -30,6 +30,11 @@ CTRL-L Clear and redraw the screen. The redraw may happen
includes an item that doesn't cause automatic includes an item that doesn't cause automatic
updating. updating.
*:redrawt* *:redrawtabline*
:redrawt[abline] Redraw the tabline. Useful to update the tabline when
'tabline' includes an item that doesn't trigger
automatic updating.
*N<Del>* *N<Del>*
<Del> When entering a number: Remove the last digit. <Del> When entering a number: Remove the last digit.
Note: if you like to use <BS> for this, add this Note: if you like to use <BS> for this, add this

View File

@@ -23,14 +23,14 @@ static const unsigned short cmdidxs1[26] =
/* p */ 309, /* p */ 309,
/* q */ 348, /* q */ 348,
/* r */ 351, /* r */ 351,
/* s */ 370, /* s */ 371,
/* t */ 437, /* t */ 438,
/* u */ 480, /* u */ 481,
/* v */ 491, /* v */ 492,
/* w */ 509, /* w */ 510,
/* x */ 524, /* x */ 525,
/* y */ 533, /* y */ 534,
/* z */ 534 /* z */ 535
}; };
/* /*
@@ -58,7 +58,7 @@ static const unsigned char cmdidxs2[26][26] =
/* o */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 0, 9, 0, 11, 0, 0, 0 }, /* o */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 5, 0, 0, 0, 0, 0, 0, 9, 0, 11, 0, 0, 0 },
/* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 }, /* p */ { 1, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 16, 17, 26, 0, 27, 0, 28, 0 },
/* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* q */ { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 18, 0, 0, 0, 0 }, /* r */ { 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 19, 0, 0, 0, 0 },
/* s */ { 2, 6, 15, 0, 18, 22, 0, 24, 25, 0, 0, 28, 30, 34, 38, 40, 0, 48, 0, 49, 0, 61, 62, 0, 63, 0 }, /* s */ { 2, 6, 15, 0, 18, 22, 0, 24, 25, 0, 0, 28, 30, 34, 38, 40, 0, 48, 0, 49, 0, 61, 62, 0, 63, 0 },
/* t */ { 2, 0, 19, 0, 22, 24, 0, 25, 0, 26, 0, 27, 31, 34, 36, 37, 0, 38, 40, 0, 41, 0, 0, 0, 0, 0 }, /* t */ { 2, 0, 19, 0, 22, 24, 0, 25, 0, 26, 0, 27, 31, 34, 36, 37, 0, 38, 40, 0, 41, 0, 0, 0, 0, 0 },
/* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
@@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[26][26] =
/* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* z */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
}; };
static const int command_count = 547; static const int command_count = 548;

View File

@@ -1175,6 +1175,9 @@ EX(CMD_redraw, "redraw", ex_redraw,
EX(CMD_redrawstatus, "redrawstatus", ex_redrawstatus, EX(CMD_redrawstatus, "redrawstatus", ex_redrawstatus,
BANG|TRLBAR|CMDWIN, BANG|TRLBAR|CMDWIN,
ADDR_LINES), ADDR_LINES),
EX(CMD_redrawtabline, "redrawtabline", ex_redrawtabline,
TRLBAR|CMDWIN,
ADDR_LINES),
EX(CMD_registers, "registers", ex_display, EX(CMD_registers, "registers", ex_display,
EXTRA|NOTRLCOM|TRLBAR|CMDWIN, EXTRA|NOTRLCOM|TRLBAR|CMDWIN,
ADDR_LINES), ADDR_LINES),

View File

@@ -296,6 +296,7 @@ static void ex_redo(exarg_T *eap);
static void ex_later(exarg_T *eap); static void ex_later(exarg_T *eap);
static void ex_redir(exarg_T *eap); static void ex_redir(exarg_T *eap);
static void ex_redrawstatus(exarg_T *eap); static void ex_redrawstatus(exarg_T *eap);
static void ex_redrawtabline(exarg_T *eap);
static void close_redir(void); static void close_redir(void);
static void ex_mkrc(exarg_T *eap); static void ex_mkrc(exarg_T *eap);
static void ex_mark(exarg_T *eap); static void ex_mark(exarg_T *eap);
@@ -9918,6 +9919,25 @@ ex_redrawstatus(exarg_T *eap UNUSED)
out_flush(); out_flush();
} }
/*
* ":redrawtabline": force redraw of the tabline
*/
static void
ex_redrawtabline(exarg_T *eap UNUSED)
{
int r = RedrawingDisabled;
int p = p_lz;
RedrawingDisabled = 0;
p_lz = FALSE;
draw_tabline();
RedrawingDisabled = r;
p_lz = p;
out_flush();
}
static void static void
close_redir(void) close_redir(void)
{ {

View File

@@ -52,6 +52,7 @@ int screen_del_lines(int off, int row, int line_count, int end, int force, int c
int showmode(void); int showmode(void);
void unshowmode(int force); void unshowmode(int force);
void clearmode(void); void clearmode(void);
void draw_tabline(void);
void get_trans_bufname(buf_T *buf); void get_trans_bufname(buf_T *buf);
int redrawing(void); int redrawing(void);
int messaging(void); int messaging(void);

View File

@@ -154,7 +154,6 @@ static int win_do_lines(win_T *wp, int row, int line_count, int mayclear, int de
static void win_rest_invalid(win_T *wp); static void win_rest_invalid(win_T *wp);
static void msg_pos_mode(void); static void msg_pos_mode(void);
static void recording_mode(int attr); static void recording_mode(int attr);
static void draw_tabline(void);
static int fillchar_status(int *attr, win_T *wp); static int fillchar_status(int *attr, win_T *wp);
static int fillchar_vsep(int *attr); static int fillchar_vsep(int *attr);
#ifdef FEAT_MENU #ifdef FEAT_MENU
@@ -10693,7 +10692,7 @@ recording_mode(int attr)
/* /*
* Draw the tab pages line at the top of the Vim window. * Draw the tab pages line at the top of the Vim window.
*/ */
static void void
draw_tabline(void) draw_tabline(void)
{ {
int tabcount = 0; int tabcount = 0;

View File

@@ -1,19 +1,22 @@
function! TablineWithCaughtError()
source shared.vim
func TablineWithCaughtError()
let s:func_in_tabline_called = 1 let s:func_in_tabline_called = 1
try try
call eval('unknown expression') call eval('unknown expression')
catch catch
endtry endtry
return '' return ''
endfunction endfunc
function! TablineWithError() func TablineWithError()
let s:func_in_tabline_called = 1 let s:func_in_tabline_called = 1
call eval('unknown expression') call eval('unknown expression')
return '' return ''
endfunction endfunc
function! Test_caught_error_in_tabline() func Test_caught_error_in_tabline()
if has('gui') if has('gui')
set guioptions-=e set guioptions-=e
endif endif
@@ -27,9 +30,9 @@ function! Test_caught_error_in_tabline()
call assert_equal(tabline, &tabline) call assert_equal(tabline, &tabline)
set tabline= set tabline=
let &showtabline = showtabline_save let &showtabline = showtabline_save
endfunction endfunc
function! Test_tabline_will_be_disabled_with_error() func Test_tabline_will_be_disabled_with_error()
if has('gui') if has('gui')
set guioptions-=e set guioptions-=e
endif endif
@@ -46,4 +49,24 @@ function! Test_tabline_will_be_disabled_with_error()
call assert_equal('', &tabline) call assert_equal('', &tabline)
set tabline= set tabline=
let &showtabline = showtabline_save let &showtabline = showtabline_save
endfunction endfunc
func Test_redrawtabline()
if has('gui')
set guioptions-=e
endif
let showtabline_save = &showtabline
set showtabline=2
set tabline=%{bufnr('$')}
edit Xtabline1
edit Xtabline2
redraw
call assert_match(bufnr('$') . '', Screenline(1))
au BufAdd * redrawtabline
badd Xtabline3
call assert_match(bufnr('$') . '', Screenline(1))
set tabline=
let &showtabline = showtabline_save
au! Bufadd
endfunc

View File

@@ -799,6 +799,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 */
/**/
706,
/**/ /**/
705, 705,
/**/ /**/