From 8154c77bef1327aca76b83a1ec5177510f6b4b7b Mon Sep 17 00:00:00 2001 From: erw7 Date: Thu, 1 Oct 2020 16:53:21 +0900 Subject: screen.c: fix buffer overflow due to folding fixes #12988. --- src/nvim/screen.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') diff --git a/src/nvim/screen.c b/src/nvim/screen.c index f3fdafcc70..3503348049 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -2822,6 +2822,16 @@ win_line ( n_extra = wp->w_p_rl ? (col + 1) : (grid->Columns - col); } + if (draw_state == WL_LINE + && foldinfo.fi_level != 0 + && foldinfo.fi_lines > 0 + && col >= grid->Columns + && n_extra != 0 + && row == startrow) { + // Truncate the folding. + n_extra = 0; + } + if (draw_state == WL_LINE && (area_highlighting || has_spell)) { // handle Visual or match highlighting in this line if (vcol == fromcol -- cgit From 620c8fdfe91a382982fafaa376acd722fe0df051 Mon Sep 17 00:00:00 2001 From: erw7 Date: Wed, 23 Sep 2020 10:33:18 +0900 Subject: extmark: fix decoration ploblems with extmark 54ce101 changed the way undo entries are created when adding decorations. This creates all sorts of problems.This change fixes the problem by reverting to the previous behavior. --- src/nvim/api/buffer.c | 4 ++-- src/nvim/extmark.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index e77870dcf3..2eeaeae522 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -1534,7 +1534,7 @@ Integer nvim_buf_add_highlight(Buffer buffer, ns_id = extmark_set(buf, ns_id, 0, (int)line, (colnr_T)col_start, end_line, (colnr_T)col_end, - decoration_hl(hl_id), kExtmarkUndo); + decoration_hl(hl_id), kExtmarkNoUndo); return src_id; } @@ -1664,7 +1664,7 @@ Integer nvim_buf_set_virtual_text(Buffer buffer, Decoration *decor = xcalloc(1, sizeof(*decor)); decor->virt_text = virt_text; - extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, kExtmarkUndo); + extmark_set(buf, ns_id, 0, (int)line, 0, -1, -1, decor, kExtmarkNoUndo); return src_id; } diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index 17141f12fd..0de396fd1f 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -783,7 +783,7 @@ void bufhl_add_hl_pos_offset(buf_T *buf, } (void)extmark_set(buf, (uint64_t)src_id, 0, (int)lnum-1, hl_start, (int)lnum-1+end_off, hl_end, - decor, kExtmarkUndo); + decor, kExtmarkNoUndo); } } -- cgit From b2f9c2b6c19ce9b66bf278b487d3fe59bf26304f Mon Sep 17 00:00:00 2001 From: erw7 Date: Wed, 23 Sep 2020 10:55:13 +0900 Subject: undo: fix possibility of aborting --- src/nvim/undo.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 97018f6c02..903e57732f 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -3029,8 +3029,6 @@ u_header_T *u_force_get_undo_header(buf_T *buf) curbuf = buf; // Args are tricky: this means replace empty range by empty range.. u_savecommon(0, 1, 1, true); - curbuf = save_curbuf; - uhp = buf->b_u_curhead; if (!uhp) { uhp = buf->b_u_newhead; @@ -3038,6 +3036,7 @@ u_header_T *u_force_get_undo_header(buf_T *buf) abort(); } } + curbuf = save_curbuf; } return uhp; } -- cgit From f1b39f91a5be7f3bf61b0e0d129dce49d51ff360 Mon Sep 17 00:00:00 2001 From: erw7 Date: Fri, 25 Sep 2020 09:26:44 +0900 Subject: extmark: Change nvim_buf_set_extmark to not create undo data --- src/nvim/api/buffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c index 2eeaeae522..174f6e94a9 100644 --- a/src/nvim/api/buffer.c +++ b/src/nvim/api/buffer.c @@ -1420,7 +1420,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, } id = extmark_set(buf, (uint64_t)ns_id, id, - (int)line, (colnr_T)col, line2, col2, decor, kExtmarkUndo); + (int)line, (colnr_T)col, line2, col2, decor, kExtmarkNoUndo); return (Integer)id; -- cgit From 72914cd7f21570a725fdace9c9fe2b171ec4c107 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Thu, 1 Oct 2020 21:46:16 -0400 Subject: vim-patch:8.2.1779: some debian changelog files are not recognized Problem: Some debian changelog files are not recognized. Solution: Add */debian/changelog. (Jason Franklin) https://github.com/vim/vim/commit/0022675aa362da0969666e48ced252b57ca1f79e --- src/nvim/testdir/test_filetype.vim | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/nvim/testdir/test_filetype.vim b/src/nvim/testdir/test_filetype.vim index 9f8939f2f6..c7ca682c8c 100644 --- a/src/nvim/testdir/test_filetype.vim +++ b/src/nvim/testdir/test_filetype.vim @@ -128,6 +128,7 @@ let s:filename_checks = { \ 'dart': ['file.dart', 'file.drt'], \ 'datascript': ['file.ds'], \ 'dcd': ['file.dcd'], + \ 'debchangelog': ['changelog.Debian', 'changelog.dch', 'NEWS.Debian', 'NEWS.dch', '/debian/changelog'], \ 'debcontrol': ['/debian/control'], \ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list'], \ 'def': ['file.def'], -- cgit From 25513049b3c3f9276dfa560ef0920f3ed6cc5f2f Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Thu, 1 Oct 2020 21:47:35 -0400 Subject: vim-patch:8.2.1780: statusline not updated when splitting windows Problem: Statusline not updated when splitting windows. Solution: Call status_redraw_all(). (Jason Franklin, closes vim/vim#5496) https://github.com/vim/vim/commit/668008be66326ed9e5b1122abede34ed3d2de2d8 --- src/nvim/testdir/test_statusline.vim | 19 +++++++++++++++++++ src/nvim/window.c | 8 +++----- 2 files changed, 22 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/nvim/testdir/test_statusline.vim b/src/nvim/testdir/test_statusline.vim index 8c81ec3431..7efd181d04 100644 --- a/src/nvim/testdir/test_statusline.vim +++ b/src/nvim/testdir/test_statusline.vim @@ -412,3 +412,22 @@ func Test_statusline_removed_group() call StopVimInTerminal(buf) call delete('XTest_statusline') endfunc + +func Test_statusline_after_split_vsplit() + only + + " Make the status line of each window show the window number. + set ls=2 stl=%{winnr()} + + split | redraw + vsplit | redraw + + " The status line of the third window should read '3' here. + call assert_equal('3', nr2char(screenchar(&lines - 1, 1))) + + only + set ls& stl& +endfunc + + +" vim: shiftwidth=2 sts=2 expandtab diff --git a/src/nvim/window.c b/src/nvim/window.c index 6608deb231..e53570edd8 100644 --- a/src/nvim/window.c +++ b/src/nvim/window.c @@ -1490,13 +1490,11 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir) if (flags & (WSP_TOP | WSP_BOT)) (void)win_comp_pos(); - /* - * Both windows need redrawing - */ + // Both windows need redrawing. Update all status lines, in case they + // show something related to the window count or position. redraw_win_later(wp, NOT_VALID); - wp->w_redr_status = TRUE; redraw_win_later(oldwin, NOT_VALID); - oldwin->w_redr_status = TRUE; + status_redraw_all(); if (need_status) { msg_row = Rows - 1; -- cgit From 2000e1621d5e529d660dc0a7534f0884b6179c8b Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Fri, 2 Oct 2020 22:46:54 -0400 Subject: vim-patch:8.2.1787: crash with 'incsearch' and very long line Problem: Crash with 'incsearch' and very long line. Solution: Check whether regprog becomes NULL. (closes vim/vim#7063) https://github.com/vim/vim/commit/795aaa1e84d76a6fe066694de9876b8a21cbe40c N/A patches for version.c: vim-patch:8.2.1784: commits are not scanned for security problems Problem: commits are not scanned for security problems Solution: Enable Github code scanning. (Christian Brabandt, closes vim/vim#7057) https://github.com/vim/vim/commit/fa79be6b10e1d34fd697a56e85f6c0ce101f3d62 --- src/nvim/search.c | 27 ++++++++++++++++++++++----- src/nvim/testdir/test_search.vim | 15 +++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/nvim/search.c b/src/nvim/search.c index b053459c7f..ea2107c5c7 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -651,6 +651,10 @@ int searchit( colnr_T col = at_first_line && (options & SEARCH_COL) ? pos->col : 0; nmatched = vim_regexec_multi(®match, win, buf, lnum, col, tm, timed_out); + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) { + break; + } // Abort searching on an error (e.g., out of stack). if (called_emsg || (timed_out != NULL && *timed_out)) { break; @@ -722,6 +726,10 @@ int searchit( match_ok = false; break; } + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) { + break; + } matchpos = regmatch.startpos[0]; endpos = regmatch.endpos[0]; submatch = first_submatch(®match); @@ -811,10 +819,13 @@ int searchit( } break; } - - /* Need to get the line pointer again, a - * multi-line search may have made it invalid. */ - ptr = ml_get_buf(buf, lnum + matchpos.lnum, FALSE); + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) { + break; + } + // Need to get the line pointer again, a + // multi-line search may have made it invalid. + ptr = ml_get_buf(buf, lnum + matchpos.lnum, false); } /* @@ -891,6 +902,11 @@ int searchit( } at_first_line = FALSE; + // vim_regexec_multi() may clear "regprog" + if (regmatch.regprog == NULL) { + break; + } + // Stop the search if wrapscan isn't set, "stop_lnum" is // specified, after an interrupt, after a match and after looping // twice. @@ -4243,7 +4259,8 @@ is_zero_width(char_u *pattern, int move, pos_T *cur, Direction direction) if (nmatched != 0) { break; } - } while (direction == FORWARD + } while (regmatch.regprog != NULL + && direction == FORWARD ? regmatch.startpos[0].col < pos.col : regmatch.startpos[0].col > pos.col); diff --git a/src/nvim/testdir/test_search.vim b/src/nvim/testdir/test_search.vim index 211fc73562..5db23c22a8 100644 --- a/src/nvim/testdir/test_search.vim +++ b/src/nvim/testdir/test_search.vim @@ -981,6 +981,21 @@ func Test_incsearch_substitute() call Incsearch_cleanup() endfunc +func Test_incsearch_substitute_long_line() + throw 'skipped: Nvim does not support test_override()' + new + call test_override("char_avail", 1) + set incsearch + + call repeat('x', 100000)->setline(1) + call feedkeys(':s/\%c', 'xt') + redraw + call feedkeys("\", 'xt') + + call Incsearch_cleanup() + bwipe! +endfunc + func Test_search_undefined_behaviour() if !has("terminal") return -- cgit From 970d6ee0d1fafb92eeaa56a3d767e704c6ef42c2 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Fri, 2 Oct 2020 01:05:12 -0400 Subject: vim-patch:8.1.2143: cannot see each command even when 'verbose' is set Problem: Cannot see each command even when 'verbose' is set. Solution: List each command when 'verbose' is at least 16. https://github.com/vim/vim/commit/4facea310c2788c88f021b262658b847381a50a8 Cherry-pick Test_tselect() from patch 8.1.2141. It requires screendump so it won't run. I cannot port it to a lua screen test. --- src/nvim/ex_docmd.c | 36 ++++++++++++++++++++++++++---------- src/nvim/testdir/test_cmdline.vim | 23 +++++++++++++++++++++++ src/nvim/testdir/test_tagjump.vim | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 7bb4bd32a3..a4ed86e4c0 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -258,6 +258,27 @@ void do_exmode(int improved) msg_scroll = save_msg_scroll; } +// Print the executed command for when 'verbose' is set. +// When "lnum" is 0 only print the command. +static void msg_verbose_cmd(linenr_T lnum, char_u *cmd) + FUNC_ATTR_NONNULL_ALL +{ + no_wait_return++; + verbose_enter_scroll(); + + if (lnum == 0) { + smsg(_("Executing: %s"), cmd); + } else { + smsg(_("line %" PRIdLINENR ": %s"), lnum, cmd); + } + if (msg_silent == 0) { + msg_puts("\n"); // don't overwrite this + } + + verbose_leave_scroll(); + no_wait_return--; +} + /* * Execute a simple command line. Used for translated commands like "*". */ @@ -568,16 +589,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, } if (p_verbose >= 15 && sourcing_name != NULL) { - ++no_wait_return; - verbose_enter_scroll(); - - smsg(_("line %" PRIdLINENR ": %s"), sourcing_lnum, cmdline_copy); - if (msg_silent == 0) { - msg_puts("\n"); // don't overwrite this either - } - - verbose_leave_scroll(); - --no_wait_return; + msg_verbose_cmd(sourcing_lnum, cmdline_copy); } /* @@ -1269,6 +1281,10 @@ static char_u * do_one_cmd(char_u **cmdlinep, goto doend; } + if (p_verbose >= 16) { + msg_verbose_cmd(0, *cmdlinep); + } + // 1. Skip comment lines and leading white space and colons. // 2. Handle command modifiers. diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index f8d84f1a49..27db957149 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -1,5 +1,8 @@ " Tests for editing the command line. +source check.vim +source screendump.vim + func Test_complete_tab() call writefile(['testfile'], 'Xtestfile') call feedkeys(":e Xtestf\t\r", "tx") @@ -718,6 +721,26 @@ func Test_verbosefile() call delete('Xlog') endfunc +func Test_verbose_option() + CheckScreendump + + let lines =<< trim [SCRIPT] + command DoSomething echo 'hello' |set ts=4 |let v = '123' |echo v + call feedkeys("\r", 't') " for the hit-enter prompt + set verbose=20 + [SCRIPT] + call writefile(lines, 'XTest_verbose') + + let buf = RunVimInTerminal('-S XTest_verbose', {'rows': 12}) + call term_wait(buf, 100) + call term_sendkeys(buf, ":DoSomething\") + call VerifyScreenDump(buf, 'Test_verbose_option_1', {}) + + " clean up + call StopVimInTerminal(buf) + call delete('XTest_verbose') +endfunc + func Test_setcmdpos() func InsertTextAtPos(text, pos) call assert_equal(0, setcmdpos(a:pos)) diff --git a/src/nvim/testdir/test_tagjump.vim b/src/nvim/testdir/test_tagjump.vim index 6abe5b7c89..7057cdefb2 100644 --- a/src/nvim/testdir/test_tagjump.vim +++ b/src/nvim/testdir/test_tagjump.vim @@ -1,5 +1,8 @@ " Tests for tagjump (tags and special searches) +source check.vim +source screendump.vim + " SEGV occurs in older versions. (At least 7.4.1748 or older) func Test_ptag_with_notagstack() set notagstack @@ -551,6 +554,37 @@ func Test_tag_line_toolong() let &verbose = old_vbs endfunc +" Check that using :tselect does not run into the hit-enter prompt. +" Requires a terminal to trigger that prompt. +func Test_tselect() + CheckScreendump + + call writefile([ + \ 'main Xtest.h /^void test();$/;" f', + \ 'main Xtest.c /^int main()$/;" f', + \ 'main Xtest.x /^void test()$/;" f', + \ ], 'Xtags') + cal writefile([ + \ 'int main()', + \ 'void test()', + \ ], 'Xtest.c') + + let lines =<< trim [SCRIPT] + set tags=Xtags + [SCRIPT] + call writefile(lines, 'XTest_tselect') + let buf = RunVimInTerminal('-S XTest_tselect', {'rows': 10, 'cols': 50}) + + call term_wait(buf, 100) + call term_sendkeys(buf, ":tselect main\2\") + call VerifyScreenDump(buf, 'Test_tselect_1', {}) + + call StopVimInTerminal(buf) + call delete('Xtags') + call delete('Xtest.c') + call delete('XTest_tselect') +endfunc + func Test_tagline() call writefile([ \ 'provision Xtest.py /^ def provision(self, **kwargs):$/;" m line:1 language:Python class:Foo', -- cgit From 86ab4a1cb4cbf377d2ddf90f785d811a0be50cfc Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Fri, 2 Oct 2020 01:22:30 -0400 Subject: vim-patch:8.2.0841: 'verbose' value 16 causes duplicate output Problem: 'verbose' value 16 causes duplicate output. Solution: Combine levels 15 and 16 into one message. (Christian Brabandt, closes vim/vim#6153) https://github.com/vim/vim/commit/823654bc06c847af20967d41db32d592aba416cb --- src/nvim/ex_docmd.c | 6 +----- src/nvim/testdir/test_cmdline.vim | 1 + 2 files changed, 2 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index a4ed86e4c0..ccaa0b0e52 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -588,7 +588,7 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, } } - if (p_verbose >= 15 && sourcing_name != NULL) { + if ((p_verbose >= 15 && sourcing_name != NULL) || p_verbose >= 16) { msg_verbose_cmd(sourcing_lnum, cmdline_copy); } @@ -1281,10 +1281,6 @@ static char_u * do_one_cmd(char_u **cmdlinep, goto doend; } - if (p_verbose >= 16) { - msg_verbose_cmd(0, *cmdlinep); - } - // 1. Skip comment lines and leading white space and colons. // 2. Handle command modifiers. diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 27db957149..871143699a 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -722,6 +722,7 @@ func Test_verbosefile() endfunc func Test_verbose_option() + " See test/functional/ui/cmdline_spec.lua CheckScreendump let lines =<< trim [SCRIPT] -- cgit