summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-04-07 15:08:01 +0100
committerBram Moolenaar <Bram@vim.org>2022-04-07 15:08:01 +0100
commit8c9796085071950f9a03ca0fe116608e4f86aac2 (patch)
tree0a7ccec814f261a3ee1a30d6ab4ff67fda734d57
parent6a06940f8ae7283999c83ccdf268540220573105 (diff)
downloadvim-git-8c9796085071950f9a03ca0fe116608e4f86aac2.tar.gz
patch 8.2.4707: redrawing could be a bit more efficientv8.2.4707
Problem: Redrawing could be a bit more efficient. Solution: Optimize redrawing. (closes #10105)
-rw-r--r--src/change.c8
-rw-r--r--src/edit.c39
-rw-r--r--src/testdir/dumps/Test_cursorcolumn_insert_on_tab_3.dump8
-rw-r--r--src/testdir/test_highlight.vim8
-rw-r--r--src/version.c2
5 files changed, 41 insertions, 24 deletions
diff --git a/src/change.c b/src/change.c
index afc32b724..bc9195be4 100644
--- a/src/change.c
+++ b/src/change.c
@@ -640,9 +640,13 @@ changed_common(
if (hasAnyFolding(wp))
set_topline(wp, wp->w_topline);
#endif
- // Relative numbering may require updating more.
+ // If lines have been added or removed, relative numbering always
+ // requires a redraw.
if (wp->w_p_rnu && xtra != 0)
- redraw_win_later(wp, SOME_VALID);
+ {
+ wp->w_last_cursor_lnum_rnu = 0;
+ redraw_win_later(wp, VALID);
+ }
#ifdef FEAT_SYN_HL
// Cursor line highlighting probably need to be updated with
// "VALID" if it's below the change.
diff --git a/src/edit.c b/src/edit.c
index c52583a8b..53e86ff18 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -293,14 +293,9 @@ edit(
conceal_check_cursor_line(cursor_line_was_concealed);
#endif
- // Need to recompute the cursor position, it might move when the cursor
- // is on a TAB or special character.
- // ptr2cells() treats a TAB character as double-width.
- if (ptr2cells(ml_get_cursor()) > 1)
- {
- curwin->w_valid &= ~VALID_VIRTCOL;
- curs_columns(TRUE);
- }
+ // need to position cursor again when on a TAB
+ if (gchar_cursor() == TAB)
+ curwin->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL);
/*
* Enable langmap or IME, indicated by 'iminsert'.
@@ -3149,21 +3144,20 @@ mb_replace_pop_ins(int cc)
replace_push(c);
break;
}
+
+ buf[0] = c;
+ for (i = 1; i < n; ++i)
+ buf[i] = replace_pop();
+ if (utf_iscomposing(utf_ptr2char(buf)))
+ ins_bytes_len(buf, n);
else
{
- buf[0] = c;
- for (i = 1; i < n; ++i)
- buf[i] = replace_pop();
- if (utf_iscomposing(utf_ptr2char(buf)))
- ins_bytes_len(buf, n);
- else
- {
- // Not a composing char, put it back.
- for (i = n - 1; i >= 0; --i)
- replace_push(buf[i]);
- break;
- }
+ // Not a composing char, put it back.
+ for (i = n - 1; i >= 0; --i)
+ replace_push(buf[i]);
+ break;
}
+
}
}
@@ -3702,8 +3696,9 @@ ins_esc(
State = NORMAL;
trigger_modechanged();
- // need to position cursor again (e.g. when on a TAB )
- changed_cline_bef_curs();
+ // need to position cursor again when on a TAB
+ if (gchar_cursor() == TAB)
+ curwin->w_valid &= ~(VALID_WROW|VALID_WCOL|VALID_VIRTCOL);
setmouse();
#ifdef CURSOR_SHAPE
diff --git a/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_3.dump b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_3.dump
new file mode 100644
index 000000000..9d0cbed96
--- /dev/null
+++ b/src/testdir/dumps/Test_cursorcolumn_insert_on_tab_3.dump
@@ -0,0 +1,8 @@
+|1+0&#ffffff0|2|3|4|5|6|7|8+0&#e0e0e08|9+0&#ffffff0| @65
+|a| @5> |b| @65
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|-+2#0000000&@1| |(|i|n|s|e|r|t|)| |-@1| +0&&@42|2|,|2|-|8| @8|A|l@1|
diff --git a/src/testdir/test_highlight.vim b/src/testdir/test_highlight.vim
index 51a25242f..3400052a7 100644
--- a/src/testdir/test_highlight.vim
+++ b/src/testdir/test_highlight.vim
@@ -610,6 +610,14 @@ func Test_cursorcolumn_insert_on_tab()
call TermWait(buf)
call VerifyScreenDump(buf, 'Test_cursorcolumn_insert_on_tab_2', {})
+ call term_sendkeys(buf, "\<C-O>")
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_cursorcolumn_insert_on_tab_3', {})
+
+ call term_sendkeys(buf, 'i')
+ call TermWait(buf)
+ call VerifyScreenDump(buf, 'Test_cursorcolumn_insert_on_tab_2', {})
+
call StopVimInTerminal(buf)
call delete('Xcuc_insert_on_tab')
endfunc
diff --git a/src/version.c b/src/version.c
index d0205d7e3..bd63e9317 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4707,
+/**/
4706,
/**/
4705,