# HG changeset patch # User Bram Moolenaar # Date 1546982105 -3600 # Node ID 325e4a8ba1b6d1bca9bdb20145322509b4b4d275 # Parent 989d5000e18e0022765c12ecc37341adf1b3be9d patch 8.1.0706: tabline is not always redrawn commit https://github.com/vim/vim/commit/e12bab3144af8943937bd0ff4bc57f04e53037b3 Author: Bram Moolenaar Date: Tue Jan 8 22:02:56 2019 +0100 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. diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -7758,6 +7758,9 @@ A jump table for the options with a shor the text to be displayed. Use "%1T" for the first label, "%2T" for 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 are invisible and you can't jump to their windows. diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt --- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -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 @@ -30,6 +30,11 @@ CTRL-L Clear and redraw the screen. T includes an item that doesn't cause automatic 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* When entering a number: Remove the last digit. Note: if you like to use for this, add this diff --git a/src/ex_cmdidxs.h b/src/ex_cmdidxs.h --- a/src/ex_cmdidxs.h +++ b/src/ex_cmdidxs.h @@ -23,14 +23,14 @@ static const unsigned short cmdidxs1[26] /* p */ 309, /* q */ 348, /* r */ 351, - /* s */ 370, - /* t */ 437, - /* u */ 480, - /* v */ 491, - /* w */ 509, - /* x */ 524, - /* y */ 533, - /* z */ 534 + /* s */ 371, + /* t */ 438, + /* u */ 481, + /* v */ 492, + /* w */ 510, + /* x */ 525, + /* y */ 534, + /* z */ 535 }; /* @@ -58,7 +58,7 @@ static const unsigned char cmdidxs2[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 }, /* 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 }, - /* 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 }, /* 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 }, @@ -69,4 +69,4 @@ static const unsigned char cmdidxs2[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 } }; -static const int command_count = 547; +static const int command_count = 548; diff --git a/src/ex_cmds.h b/src/ex_cmds.h --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -1175,6 +1175,9 @@ EX(CMD_redraw, "redraw", ex_redraw, EX(CMD_redrawstatus, "redrawstatus", ex_redrawstatus, BANG|TRLBAR|CMDWIN, ADDR_LINES), +EX(CMD_redrawtabline, "redrawtabline", ex_redrawtabline, + TRLBAR|CMDWIN, + ADDR_LINES), EX(CMD_registers, "registers", ex_display, EXTRA|NOTRLCOM|TRLBAR|CMDWIN, ADDR_LINES), diff --git a/src/ex_docmd.c b/src/ex_docmd.c --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -296,6 +296,7 @@ static void ex_redo(exarg_T *eap); static void ex_later(exarg_T *eap); static void ex_redir(exarg_T *eap); static void ex_redrawstatus(exarg_T *eap); +static void ex_redrawtabline(exarg_T *eap); static void close_redir(void); static void ex_mkrc(exarg_T *eap); static void ex_mark(exarg_T *eap); @@ -9918,6 +9919,25 @@ ex_redrawstatus(exarg_T *eap UNUSED) 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 close_redir(void) { diff --git a/src/proto/screen.pro b/src/proto/screen.pro --- a/src/proto/screen.pro +++ b/src/proto/screen.pro @@ -52,6 +52,7 @@ int screen_del_lines(int off, int row, i int showmode(void); void unshowmode(int force); void clearmode(void); +void draw_tabline(void); void get_trans_bufname(buf_T *buf); int redrawing(void); int messaging(void); diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -154,7 +154,6 @@ static int win_do_lines(win_T *wp, int r static void win_rest_invalid(win_T *wp); static void msg_pos_mode(void); static void recording_mode(int attr); -static void draw_tabline(void); static int fillchar_status(int *attr, win_T *wp); static int fillchar_vsep(int *attr); #ifdef FEAT_MENU @@ -10693,7 +10692,7 @@ recording_mode(int attr) /* * Draw the tab pages line at the top of the Vim window. */ - static void + void draw_tabline(void) { int tabcount = 0; diff --git a/src/testdir/test_tabline.vim b/src/testdir/test_tabline.vim --- a/src/testdir/test_tabline.vim +++ b/src/testdir/test_tabline.vim @@ -1,19 +1,22 @@ -function! TablineWithCaughtError() + +source shared.vim + +func TablineWithCaughtError() let s:func_in_tabline_called = 1 try call eval('unknown expression') catch endtry return '' -endfunction +endfunc -function! TablineWithError() +func TablineWithError() let s:func_in_tabline_called = 1 call eval('unknown expression') return '' -endfunction +endfunc -function! Test_caught_error_in_tabline() +func Test_caught_error_in_tabline() if has('gui') set guioptions-=e endif @@ -27,9 +30,9 @@ function! Test_caught_error_in_tabline() call assert_equal(tabline, &tabline) set tabline= 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') set guioptions-=e endif @@ -46,4 +49,24 @@ function! Test_tabline_will_be_disabled_ call assert_equal('', &tabline) set tabline= 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -800,6 +800,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 706, +/**/ 705, /**/ 704,