mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge pull request #13074 from janlazo/vim-8.1.1717
vim-patch:8.1.{746,1717,2294,2303,2405},8.2.0007
This commit is contained in:
commit
15ad7c0d27
@ -641,7 +641,7 @@ void validate_virtcol_win(win_T *wp)
|
|||||||
/*
|
/*
|
||||||
* Validate curwin->w_cline_height only.
|
* Validate curwin->w_cline_height only.
|
||||||
*/
|
*/
|
||||||
static void validate_cheight(void)
|
void validate_cheight(void)
|
||||||
{
|
{
|
||||||
check_cursor_moved(curwin);
|
check_cursor_moved(curwin);
|
||||||
if (!(curwin->w_valid & VALID_CHEIGHT)) {
|
if (!(curwin->w_valid & VALID_CHEIGHT)) {
|
||||||
@ -943,6 +943,9 @@ void curs_columns(
|
|||||||
redraw_later(SOME_VALID);
|
redraw_later(SOME_VALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now w_leftcol is valid, avoid check_cursor_moved() thinking otherwise
|
||||||
|
curwin->w_valid_leftcol = curwin->w_leftcol;
|
||||||
|
|
||||||
curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
|
curwin->w_valid |= VALID_WCOL|VALID_WROW|VALID_VIRTCOL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,6 +226,7 @@ void pum_display(pumitem_T *array, int size, int selected, bool array_changed,
|
|||||||
pum_above = false;
|
pum_above = false;
|
||||||
|
|
||||||
// Leave two lines of context if possible
|
// Leave two lines of context if possible
|
||||||
|
validate_cheight();
|
||||||
if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) {
|
if (curwin->w_cline_row + curwin->w_cline_height - curwin->w_wrow >= 3) {
|
||||||
context_lines = 3;
|
context_lines = 3;
|
||||||
} else {
|
} else {
|
||||||
|
@ -698,8 +698,10 @@ static void win_update(win_T *wp)
|
|||||||
int didline = FALSE; /* if TRUE, we finished the last line */
|
int didline = FALSE; /* if TRUE, we finished the last line */
|
||||||
int i;
|
int i;
|
||||||
long j;
|
long j;
|
||||||
static int recursive = FALSE; /* being called recursively */
|
static bool recursive = false; // being called recursively
|
||||||
int old_botline = wp->w_botline;
|
const linenr_T old_botline = wp->w_botline;
|
||||||
|
const int old_wrow = wp->w_wrow;
|
||||||
|
const int old_wcol = wp->w_wcol;
|
||||||
// Remember what happened to the previous line.
|
// Remember what happened to the previous line.
|
||||||
#define DID_NONE 1 // didn't update a line
|
#define DID_NONE 1 // didn't update a line
|
||||||
#define DID_LINE 2 // updated a normal line
|
#define DID_LINE 2 // updated a normal line
|
||||||
@ -1639,18 +1641,51 @@ static void win_update(win_T *wp)
|
|||||||
wp->w_valid |= VALID_BOTLINE;
|
wp->w_valid |= VALID_BOTLINE;
|
||||||
wp->w_viewport_invalid = true;
|
wp->w_viewport_invalid = true;
|
||||||
if (wp == curwin && wp->w_botline != old_botline && !recursive) {
|
if (wp == curwin && wp->w_botline != old_botline && !recursive) {
|
||||||
recursive = TRUE;
|
const linenr_T old_topline = wp->w_topline;
|
||||||
|
const int new_wcol = wp->w_wcol;
|
||||||
|
recursive = true;
|
||||||
curwin->w_valid &= ~VALID_TOPLINE;
|
curwin->w_valid &= ~VALID_TOPLINE;
|
||||||
update_topline(); /* may invalidate w_botline again */
|
update_topline(); // may invalidate w_botline again
|
||||||
if (must_redraw != 0) {
|
|
||||||
/* Don't update for changes in buffer again. */
|
if (old_wcol != new_wcol
|
||||||
|
&& (wp->w_valid & (VALID_WCOL|VALID_WROW))
|
||||||
|
!= (VALID_WCOL|VALID_WROW)) {
|
||||||
|
// A win_line() call applied a fix to screen cursor column to
|
||||||
|
// accomodate concealment of cursor line, but in this call to
|
||||||
|
// update_topline() the cursor's row or column got invalidated.
|
||||||
|
// If they are left invalid, setcursor() will recompute them
|
||||||
|
// but there won't be any further win_line() call to re-fix the
|
||||||
|
// column and the cursor will end up misplaced. So we call
|
||||||
|
// cursor validation now and reapply the fix again (or call
|
||||||
|
// win_line() to do it for us).
|
||||||
|
validate_cursor();
|
||||||
|
if (wp->w_wcol == old_wcol
|
||||||
|
&& wp->w_wrow == old_wrow
|
||||||
|
&& old_topline == wp->w_topline) {
|
||||||
|
wp->w_wcol = new_wcol;
|
||||||
|
} else {
|
||||||
|
redrawWinline(wp, wp->w_cursor.lnum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// New redraw either due to updated topline or due to wcol fix.
|
||||||
|
if (wp->w_redr_type != 0) {
|
||||||
|
// Don't update for changes in buffer again.
|
||||||
i = curbuf->b_mod_set;
|
i = curbuf->b_mod_set;
|
||||||
curbuf->b_mod_set = false;
|
curbuf->b_mod_set = false;
|
||||||
|
j = curbuf->b_mod_xlines;
|
||||||
|
curbuf->b_mod_xlines = 0;
|
||||||
win_update(curwin);
|
win_update(curwin);
|
||||||
must_redraw = 0;
|
|
||||||
curbuf->b_mod_set = i;
|
curbuf->b_mod_set = i;
|
||||||
|
curbuf->b_mod_xlines = j;
|
||||||
}
|
}
|
||||||
recursive = FALSE;
|
// Other windows might have w_redr_type raised in update_topline().
|
||||||
|
must_redraw = 0;
|
||||||
|
FOR_ALL_WINDOWS_IN_TAB(wwp, curtab) {
|
||||||
|
if (wwp->w_redr_type > must_redraw) {
|
||||||
|
must_redraw = wwp->w_redr_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
recursive = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3690,7 +3725,7 @@ win_line (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// At end of the text line or just after the last character.
|
// At end of the text line or just after the last character.
|
||||||
if (c == NUL) {
|
if (c == NUL && eol_hl_off == 0) {
|
||||||
long prevcol = (long)(ptr - line) - 1;
|
long prevcol = (long)(ptr - line) - 1;
|
||||||
|
|
||||||
// we're not really at that column when skipping some text
|
// we're not really at that column when skipping some text
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
source screendump.vim
|
||||||
|
source check.vim
|
||||||
|
|
||||||
" Test for insert expansion
|
" Test for insert expansion
|
||||||
func Test_ins_complete()
|
func Test_ins_complete()
|
||||||
@ -338,3 +340,27 @@ func Test_compl_in_cmdwin()
|
|||||||
delcom GetInput
|
delcom GetInput
|
||||||
set wildmenu& wildchar&
|
set wildmenu& wildchar&
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_pum_with_folds_two_tabs()
|
||||||
|
CheckScreendump
|
||||||
|
|
||||||
|
let lines =<< trim END
|
||||||
|
set fdm=marker
|
||||||
|
call setline(1, ['" x {{{1', '" a some text'])
|
||||||
|
call setline(3, range(&lines)->map({_, val -> '" a' .. val}))
|
||||||
|
norm! zm
|
||||||
|
tab sp
|
||||||
|
call feedkeys('2Gzv', 'xt')
|
||||||
|
call feedkeys("0fa", 'xt')
|
||||||
|
END
|
||||||
|
|
||||||
|
call writefile(lines, 'Xpumscript')
|
||||||
|
let buf = RunVimInTerminal('-S Xpumscript', #{rows: 10})
|
||||||
|
call term_wait(buf, 100)
|
||||||
|
call term_sendkeys(buf, "a\<C-N>")
|
||||||
|
call VerifyScreenDump(buf, 'Test_pum_with_folds_two_tabs', {})
|
||||||
|
|
||||||
|
call term_sendkeys(buf, "\<Esc>")
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('Xpumscript')
|
||||||
|
endfunc
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
" Test for matchadd() and conceal feature
|
" Test for matchadd() and conceal feature
|
||||||
if !has('conceal')
|
|
||||||
finish
|
source check.vim
|
||||||
endif
|
CheckFeature conceal
|
||||||
|
|
||||||
source shared.vim
|
source shared.vim
|
||||||
|
source term_util.vim
|
||||||
|
source view_util.vim
|
||||||
|
|
||||||
function! Test_simple_matchadd()
|
function! Test_simple_matchadd()
|
||||||
new
|
new
|
||||||
@ -273,3 +275,70 @@ function! Test_matchadd_and_syn_conceal()
|
|||||||
call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
|
call assert_notequal(screenattr(1, 11) , screenattr(1, 12))
|
||||||
call assert_equal(screenattr(1, 11) , screenattr(1, 32))
|
call assert_equal(screenattr(1, 11) , screenattr(1, 32))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
func Test_cursor_column_in_concealed_line_after_window_scroll()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
" Test for issue #5012 fix.
|
||||||
|
" For a concealed line with cursor, there should be no window's cursor
|
||||||
|
" position invalidation during win_update() after scrolling attempt that is
|
||||||
|
" not successful and no real topline change happens. The invalidation would
|
||||||
|
" cause a window's cursor position recalc outside of win_line() where it's
|
||||||
|
" not possible to take conceal into account.
|
||||||
|
let lines =<< trim END
|
||||||
|
3split
|
||||||
|
let m = matchadd('Conceal', '=')
|
||||||
|
setl conceallevel=2 concealcursor=nc
|
||||||
|
normal gg
|
||||||
|
"==expr==
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xcolesearch')
|
||||||
|
let buf = RunVimInTerminal('Xcolesearch', {})
|
||||||
|
call term_wait(buf, 100)
|
||||||
|
|
||||||
|
" Jump to something that is beyond the bottom of the window,
|
||||||
|
" so there's a scroll down.
|
||||||
|
call term_sendkeys(buf, ":so %\<CR>")
|
||||||
|
call term_wait(buf, 100)
|
||||||
|
call term_sendkeys(buf, "/expr\<CR>")
|
||||||
|
call term_wait(buf, 100)
|
||||||
|
|
||||||
|
" Are the concealed parts of the current line really hidden?
|
||||||
|
let cursor_row = term_scrape(buf, '.')->map({_, e -> e.chars})->join('')
|
||||||
|
call assert_equal('"expr', cursor_row)
|
||||||
|
|
||||||
|
" BugFix check: Is the window's cursor column properly updated for hidden
|
||||||
|
" parts of the current line?
|
||||||
|
call assert_equal(2, term_getcursor(buf)[1])
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('Xcolesearch')
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_cursor_column_in_concealed_line_after_leftcol_change()
|
||||||
|
CheckRunVimInTerminal
|
||||||
|
|
||||||
|
" Test for issue #5214 fix.
|
||||||
|
let lines =<< trim END
|
||||||
|
0put = 'ab' .. repeat('-', &columns) .. 'c'
|
||||||
|
call matchadd('Conceal', '-')
|
||||||
|
set nowrap ss=0 cole=3 cocu=n
|
||||||
|
END
|
||||||
|
call writefile(lines, 'Xcurs-columns')
|
||||||
|
let buf = RunVimInTerminal('-S Xcurs-columns', {})
|
||||||
|
|
||||||
|
" Go to the end of the line (3 columns beyond the end of the screen).
|
||||||
|
" Horizontal scroll would center the cursor in the screen line, but conceal
|
||||||
|
" makes it go to screen column 1.
|
||||||
|
call term_sendkeys(buf, "$")
|
||||||
|
call term_wait(buf)
|
||||||
|
|
||||||
|
" Are the concealed parts of the current line really hidden?
|
||||||
|
call WaitForAssert({-> assert_equal('c', term_getline(buf, '.'))})
|
||||||
|
|
||||||
|
" BugFix check: Is the window's cursor column properly updated for conceal?
|
||||||
|
call assert_equal(1, term_getcursor(buf)[1])
|
||||||
|
|
||||||
|
call StopVimInTerminal(buf)
|
||||||
|
call delete('Xcurs-columns')
|
||||||
|
endfunc
|
||||||
|
Loading…
Reference in New Issue
Block a user