diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-05-10 08:54:37 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-10 08:54:37 +0800 |
commit | 5359be78935dc639c481d74f010fe133dd40290c (patch) | |
tree | 84c02f5a532d200cfa6b122b70ef625bc5c99068 | |
parent | 9aa5647e686e5420e5b9b51828ec7d55631f98ed (diff) | |
parent | 65df08aade7eac9fab51058924af89a60351f4bf (diff) | |
download | rneovim-5359be78935dc639c481d74f010fe133dd40290c.tar.gz rneovim-5359be78935dc639c481d74f010fe133dd40290c.tar.bz2 rneovim-5359be78935dc639c481d74f010fe133dd40290c.zip |
Merge pull request #18509 from zeertzjq/vim-8.2.4929
vim-patch:8.2.4929: off-by-one error in in statusline item
-rw-r--r-- | src/nvim/buffer.c | 3 | ||||
-rw-r--r-- | src/nvim/testdir/test_statusline.vim | 19 | ||||
-rw-r--r-- | test/functional/legacy/statusline_spec.lua | 71 |
3 files changed, 91 insertions, 2 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 8a56a08aaa..ab804cc42f 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -3635,7 +3635,8 @@ int build_stl_str_hl(win_T *wp, char *out, size_t outlen, char *fmt, int use_san // correct the start of the items for the truncation for (int idx = stl_groupitems[groupdepth] + 1; idx < curitem; idx++) { // Shift everything back by the number of removed bytes - stl_items[idx].start -= n; + // Minus one for the leading '<' added above. + stl_items[idx].start -= n - 1; // If the item was partially or completely truncated, set its // start to the start of the group diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim index 492d09c645..8579457d9f 100644 --- a/src/nvim/testdir/test_statusline.vim +++ b/src/nvim/testdir/test_statusline.vim @@ -461,7 +461,6 @@ func Test_statusline_removed_group() call writefile(lines, 'XTest_statusline') let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 10, 'cols': 50}) - call term_wait(buf, 100) call VerifyScreenDump(buf, 'Test_statusline_1', {}) " clean up @@ -535,4 +534,22 @@ func Test_statusline_verylong_filename() bwipe! endfunc +func Test_statusline_highlight_truncate() + CheckScreendump + + let lines =<< trim END + set laststatus=2 + hi! link User1 Directory + hi! link User2 ErrorMsg + set statusline=%.5(%1*ABC%2*DEF%1*GHI%) + END + call writefile(lines, 'XTest_statusline') + + let buf = RunVimInTerminal('-S XTest_statusline', {'rows': 6}) + call VerifyScreenDump(buf, 'Test_statusline_hl', {}) + + call StopVimInTerminal(buf) + call delete('XTest_statusline') +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/test/functional/legacy/statusline_spec.lua b/test/functional/legacy/statusline_spec.lua new file mode 100644 index 0000000000..5eb46077ec --- /dev/null +++ b/test/functional/legacy/statusline_spec.lua @@ -0,0 +1,71 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') +local clear = helpers.clear +local exec = helpers.exec +local feed = helpers.feed + +before_each(clear) + +describe('statusline', function() + local screen + + before_each(function() + screen = Screen.new(50, 7) + screen:attach() + end) + + it('is updated in cmdline mode when using window-local statusline vim-patch:8.2.2737', function() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {bold = true, reverse = true}, -- StatusLine + [3] = {reverse = true}, -- StatusLineNC, VertSplit + }) + exec([[ + setlocal statusline=-%{mode()}- + split + setlocal statusline=+%{mode()}+ + ]]) + screen:expect([[ + ^ | + {1:~ }| + {2:+n+ }| + | + {1:~ }| + {3:-n- }| + | + ]]) + feed(':') + screen:expect([[ + | + {1:~ }| + {2:+c+ }| + | + {1:~ }| + {3:-c- }| + :^ | + ]]) + end) + + it('truncated item does not cause off-by-one highlight vim-patch:8.2.4929', function() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {foreground = Screen.colors.Blue}, -- User1 + [3] = {background = Screen.colors.Red, foreground = Screen.colors.White}, -- User2 + }) + exec([[ + set laststatus=2 + hi! link User1 Directory + hi! link User2 ErrorMsg + set statusline=%.5(%1*ABC%2*DEF%1*GHI%) + ]]) + screen:expect([[ + ^ | + {1:~ }| + {1:~ }| + {1:~ }| + {1:~ }| + {3:<F}{2:GHI }| + | + ]]) + end) +end) |