aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/edit.c10
-rw-r--r--src/nvim/regexp.c18
-rw-r--r--src/nvim/screen.c82
-rw-r--r--src/nvim/testdir/Makefile1
-rw-r--r--src/nvim/testdir/test39.in8
-rw-r--r--src/nvim/testdir/test39.okbin481 -> 514 bytes
-rw-r--r--src/nvim/testdir/test63.in23
-rw-r--r--src/nvim/testdir/test63.ok2
-rw-r--r--src/nvim/testdir/test_changelist.in22
-rw-r--r--src/nvim/testdir/test_changelist.ok1
-rw-r--r--src/nvim/version.c10
-rw-r--r--src/nvim/window.c3
-rw-r--r--third-party/CMakeLists.txt6
13 files changed, 140 insertions, 46 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 3b450e5245..5131dc3b38 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -5610,12 +5610,18 @@ static void spell_back_to_badword(void)
int stop_arrow(void)
{
if (arrow_used) {
+ Insstart = curwin->w_cursor; //new insertion starts here
+ if (Insstart.col > Insstart_orig.col && !ins_need_undo) {
+ // Don't update the original insert position when moved to the
+ // right, except when nothing was inserted yet.
+ update_Insstart_orig = FALSE;
+ }
+ Insstart_textlen = (colnr_T)linetabsize(get_cursor_line_ptr());
+
if (u_save_cursor() == OK) {
arrow_used = FALSE;
ins_need_undo = FALSE;
}
- Insstart = curwin->w_cursor; /* new insertion starts here */
- Insstart_textlen = (colnr_T)linetabsize(get_cursor_line_ptr());
ai_col = 0;
if (State & VREPLACE_FLAG) {
orig_line_count = curbuf->b_ml.ml_line_count;
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index 193c68860d..90da02bb1b 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -2790,17 +2790,29 @@ static int peekchr(void)
* either "\|", "\)", "\&", or "\n" */
if (reg_magic >= MAGIC_OFF) {
char_u *p = regparse + 1;
+ bool is_magic_all = (reg_magic == MAGIC_ALL);
- /* ignore \c \C \m and \M after '$' */
+ // ignore \c \C \m \M \v \V and \Z after '$'
while (p[0] == '\\' && (p[1] == 'c' || p[1] == 'C'
- || p[1] == 'm' || p[1] == 'M' || p[1] == 'Z'))
+ || p[1] == 'm' || p[1] == 'M'
+ || p[1] == 'v' || p[1] == 'V'
+ || p[1] == 'Z')) {
+ if (p[1] == 'v') {
+ is_magic_all = true;
+ } else if (p[1] == 'm' || p[1] == 'M' || p[1] == 'V') {
+ is_magic_all = false;
+ }
p += 2;
+ }
if (p[0] == NUL
|| (p[0] == '\\'
&& (p[1] == '|' || p[1] == '&' || p[1] == ')'
|| p[1] == 'n'))
- || reg_magic == MAGIC_ALL)
+ || (is_magic_all
+ && (p[0] == '|' || p[0] == '&' || p[0] == ')'))
+ || reg_magic == MAGIC_ALL) {
curchr = Magic('$');
+ }
}
break;
case '\\':
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index e882935e39..c46b5fa48c 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -346,7 +346,7 @@ int redraw_asap(int type)
* Note that when also inserting/deleting lines w_redraw_top and w_redraw_bot
* may become invalid and the whole window will have to be redrawn.
*/
-void
+void
redrawWinline (
linenr_T lnum,
int invalid /* window line height is invalid now */
@@ -2114,7 +2114,7 @@ static void copy_text_attr(int off, char_u *buf, int len, int attr)
* Fill the foldcolumn at "p" for window "wp".
* Only to be called when 'foldcolumn' > 0.
*/
-static void
+static void
fill_foldcolumn (
char_u *p,
win_T *wp,
@@ -2166,7 +2166,7 @@ fill_foldcolumn (
*
* Return the number of last row the line occupies.
*/
-static int
+static int
win_line (
win_T *wp,
linenr_T lnum,
@@ -2655,8 +2655,8 @@ win_line (
}
next_search_hl(wp, shl, lnum, (colnr_T)v, cur);
- // Need to get the line again, a multi-line regexp may have made it
- // invalid.
+ // Need to get the line again, a multi-line regexp may have made it
+ // invalid.
line = ml_get_buf(wp->w_buffer, lnum, false);
ptr = line + v;
@@ -2672,7 +2672,7 @@ win_line (
} else {
shl->endcol = MAXCOL;
}
- // Highlight one character for an empty match.
+ // Highlight one character for an empty match.
if (shl->startcol == shl->endcol) {
if (has_mbyte && line[shl->endcol] != NUL) {
shl->endcol += (*mb_ptr2len)(line + shl->endcol);
@@ -2680,7 +2680,7 @@ win_line (
++shl->endcol;
}
}
- if ((long)shl->startcol < v) { // match at leftcol
+ if ((long)shl->startcol < v) { // match at leftcol
shl->attr_cur = shl->attr;
search_attr = shl->attr;
}
@@ -2830,9 +2830,12 @@ win_line (
if (wp->w_p_bri && n_extra == 0 && row != startrow && filler_lines == 0) {
char_attr = 0; // was: hl_attr(HLF_AT);
- if (diff_hlf != (hlf_T)0)
+ if (diff_hlf != (hlf_T)0) {
char_attr = hl_attr(diff_hlf);
-
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
+ char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
+ }
+ }
p_extra = NULL;
c_extra = ' ';
n_extra = get_breakindent_win(wp, ml_get_buf(wp->w_buffer, lnum, FALSE));
@@ -2869,8 +2872,9 @@ win_line (
if (tocol == vcol)
tocol += n_extra;
/* combine 'showbreak' with 'cursorline' */
- if (wp->w_p_cul && lnum == wp->w_cursor.lnum)
- char_attr = hl_combine_attr(char_attr, HLF_CLN);
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
+ char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
+ }
}
}
@@ -2948,7 +2952,7 @@ win_line (
&& v >= (long)shl->startcol
&& v < (long)shl->endcol) {
shl->attr_cur = shl->attr;
- } else if (v >= (long)shl->endcol) {
+ } else if (v >= (long)shl->endcol && shl->lnum == lnum) {
shl->attr_cur = 0;
next_search_hl(wp, shl, lnum, (colnr_T)v, cur);
@@ -3016,6 +3020,9 @@ win_line (
&& n_extra == 0)
diff_hlf = HLF_CHD; /* changed line */
line_attr = hl_attr(diff_hlf);
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
+ line_attr = hl_combine_attr(line_attr, hl_attr(HLF_CUL));
+ }
}
/* Decide which of the highlight attributes to use. */
@@ -3620,8 +3627,12 @@ win_line (
char_attr = line_attr;
if (diff_hlf == HLF_TXD) {
diff_hlf = HLF_CHD;
- if (attr == 0 || char_attr != attr)
+ if (attr == 0 || char_attr != attr) {
char_attr = hl_attr(diff_hlf);
+ if (wp->w_p_cul && lnum == wp->w_cursor.lnum) {
+ char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUL));
+ }
+ }
}
}
}
@@ -4676,7 +4687,7 @@ static int skip_status_match_char(expand_T *xp, char_u *s)
*
* If inversion is possible we use it. Else '=' characters are used.
*/
-void
+void
win_redr_status_matches (
expand_T *xp,
int num_matches,
@@ -4962,7 +4973,7 @@ void win_redr_status(win_T *wp)
fillchar = fillchar_status(&attr, wp == curwin);
else
fillchar = fillchar_vsep(&attr);
- screen_putchar(fillchar, wp->w_winrow + wp->w_height,
+ screen_putchar(fillchar, wp->w_winrow + wp->w_height,
W_ENDCOL(wp), attr);
}
busy = FALSE;
@@ -5024,7 +5035,7 @@ int stl_connected(win_T *wp)
/*
* Get the value to show for the language mappings, active 'keymap'.
*/
-int
+int
get_keymap_str (
win_T *wp,
char_u *buf, /* buffer for the result */
@@ -5068,7 +5079,7 @@ get_keymap_str (
* Redraw the status line or ruler of window "wp".
* When "wp" is NULL redraw the tab pages line from 'tabline'.
*/
-static void
+static void
win_redr_custom (
win_T *wp,
int draw_ruler /* TRUE or FALSE */
@@ -5606,7 +5617,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
if (cur != NULL) {
cur->pos.cur = 0;
}
- bool pos_inprogress = true; // mark that a position match search is
+ bool pos_inprogress = true; // mark that a position match search is
// in progress
n = 0;
while (shl->first_lnum < lnum && (shl->rm.regprog != NULL
@@ -5637,7 +5648,7 @@ static void prepare_search_hl(win_T *wp, linenr_T lnum)
* shl->lnum is zero.
* Careful: Any pointers for buffer lines will become invalid.
*/
-static void
+static void
next_search_hl (
win_T *win,
match_T *shl, /* points to search_hl or a match */
@@ -5705,9 +5716,9 @@ next_search_hl (
if (shl->rm.regprog != NULL) {
nmatched = vim_regexec_multi(&shl->rm, win, shl->buf, lnum, matchcol, &(shl->tm));
if (called_emsg || got_int) {
- // Error while handling regexp: stop using this regexp.
+ // Error while handling regexp: stop using this regexp.
if (shl == &search_hl) {
- // don't free regprog in the match list, it's a copy
+ // don't free regprog in the match list, it's a copy
vim_regfree(shl->rm.regprog);
SET_NO_HLSEARCH(TRUE);
}
@@ -5735,11 +5746,11 @@ next_search_hl (
static int
next_search_hl_pos(
- match_T *shl, // points to a match
+ match_T *shl, // points to a match
linenr_T lnum,
- posmatch_T *posmatch, // match positions
+ posmatch_T *posmatch, // match positions
colnr_T mincol // minimal column for a match
-)
+)
{
int i;
int bot = -1;
@@ -5754,8 +5765,8 @@ next_search_hl_pos(
}
if (posmatch->pos[i].lnum == lnum) {
if (shl->lnum == lnum) {
- // partially sort positions by column numbers
- // on the same line
+ // partially sort positions by column numbers
+ // on the same line
if (posmatch->pos[i].col < posmatch->pos[bot].col) {
llpos_T tmp = posmatch->pos[i];
@@ -5772,7 +5783,7 @@ next_search_hl_pos(
if (shl->lnum == lnum) {
colnr_T start = posmatch->pos[bot].col == 0
? 0: posmatch->pos[bot].col - 1;
- colnr_T end = posmatch->pos[bot].col == 0
+ colnr_T end = posmatch->pos[bot].col == 0
? MAXCOL : start + posmatch->pos[bot].len;
shl->rm.startpos[0].lnum = 0;
@@ -7091,7 +7102,7 @@ static void win_rest_invalid(win_T *wp)
*
* return FAIL for failure, OK for success.
*/
-int
+int
screen_ins_lines (
int off,
int row,
@@ -7264,7 +7275,7 @@ screen_ins_lines (
*
* Return OK for success, FAIL if the lines are not deleted.
*/
-int
+int
screen_del_lines (
int off,
int row,
@@ -7630,7 +7641,7 @@ void unshowmode(int force)
static void draw_tabline(void)
{
int tabcount = 0;
- int tabwidth;
+ int tabwidth = 0;
int col = 0;
int scol = 0;
int attr;
@@ -7676,9 +7687,13 @@ static void draw_tabline(void)
++tabcount;
}
- tabwidth = (Columns - 1 + tabcount / 2) / tabcount;
- if (tabwidth < 6)
+ if (tabcount > 0) {
+ tabwidth = (Columns - 1 + tabcount / 2) / tabcount;
+ }
+
+ if (tabwidth < 6) {
tabwidth = 6;
+ }
attr = attr_nosel;
tabcount = 0;
@@ -7720,8 +7735,7 @@ static void draw_tabline(void)
if (col + len >= Columns - 3)
break;
screen_puts_len(NameBuff, len, 0, col,
- hl_combine_attr(attr, hl_attr(HLF_T))
- );
+ hl_combine_attr(attr, hl_attr(HLF_T)));
col += len;
}
if (modified)
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index 81dc49e800..9f04f880b5 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -33,6 +33,7 @@ SCRIPTS := test_autoformat_join.out \
test106.out test107.out \
test_options.out \
test_listlbr.out test_listlbr_utf8.out \
+ test_changelist.out \
test_breakindent.out \
test_insertcount.out
diff --git a/src/nvim/testdir/test39.in b/src/nvim/testdir/test39.in
index c1e1cc49a6..7d1c672522 100644
--- a/src/nvim/testdir/test39.in
+++ b/src/nvim/testdir/test39.in
@@ -23,6 +23,9 @@ G$khhhhhkkcmno
/^aaaa/
:exe ":norm! l\<C-V>jjjlllI\<Right>\<Right> \<Esc>"
:/^aa/,/^$/w >> test.out
+/xaaa$/
+:exe ":norm! \<C-V>jjjI<>\<Left>p\<Esc>"
+:/xaaa$/,/^$/w >> test.out
:" Test for Visual block was created with the last <C-v>$
/^A23$/
:exe ":norm! l\<C-V>j$Aab\<Esc>"
@@ -77,6 +80,11 @@ bbbbbb
cccccc
dddddd
+xaaa
+bbbb
+cccc
+dddd
+
A23
4567
diff --git a/src/nvim/testdir/test39.ok b/src/nvim/testdir/test39.ok
index ef7a2c6442..d8e901563a 100644
--- a/src/nvim/testdir/test39.ok
+++ b/src/nvim/testdir/test39.ok
Binary files differ
diff --git a/src/nvim/testdir/test63.in b/src/nvim/testdir/test63.in
index ea66ee6dea..ff05afbf81 100644
--- a/src/nvim/testdir/test63.in
+++ b/src/nvim/testdir/test63.in
@@ -3,6 +3,7 @@ Test for ":match", ":2match", ":3match", "clearmatches()", "getmatches()",
STARTTEST
:so small.vim
+:set encoding=utf8
:" --- Check that "matcharg()" returns the correct group and pattern if a match
:" --- is defined.
:let @r = "*** Test 1: "
@@ -164,7 +165,27 @@ STARTTEST
:if v1 != v5 && v6 == v1 && v8 == v5 && v10 == v5 && v11 == v1
: let @r .= "OK\n"
:else
-: let @r .= "FAILED\n"
+: let @r .= "FAILED: " . v5 . "/" . v6 . "/" . v8 . "/" . v10 . "/" . v11 . "\n"
+:endif
+:call clearmatches()
+:"
+:call setline(1, 'abcdΣabcdef')
+:call matchaddpos("MyGroup1", [[1, 4, 2], [1, 9, 2]])
+:1
+:redraw!
+:let v1 = screenattr(1, 1)
+:let v4 = screenattr(1, 4)
+:let v5 = screenattr(1, 5)
+:let v6 = screenattr(1, 6)
+:let v7 = screenattr(1, 7)
+:let v8 = screenattr(1, 8)
+:let v9 = screenattr(1, 9)
+:let v10 = screenattr(1, 10)
+:let @r .= string(getmatches())."\n"
+:if v1 != v4 && v5 == v4 && v6 == v1 && v7 == v1 && v8 == v4 && v9 == v4 && v10 == v1
+: let @r .= "OK\n"
+:else
+: let @r .= "FAILED: " . v4 . "/" . v5 . "/" . v6 . "/" . v7 . "/" . v8 . "/" . v9 . "/" . v10 . "\n"
:endif
:call clearmatches()
G"rp
diff --git a/src/nvim/testdir/test63.ok b/src/nvim/testdir/test63.ok
index f804b693ac..5d619395b7 100644
--- a/src/nvim/testdir/test63.ok
+++ b/src/nvim/testdir/test63.ok
@@ -12,3 +12,5 @@ Results of test63:
*** Test 11:
[{'group': 'MyGroup1', 'id': 3, 'priority': 10, 'pos1': [1, 5, 1], 'pos2': [1, 8, 3]}]
OK
+[{'group': 'MyGroup1', 'id': 11, 'priority': 10, 'pos1': [1, 4, 2], 'pos2': [1, 9, 2]}]
+OK
diff --git a/src/nvim/testdir/test_changelist.in b/src/nvim/testdir/test_changelist.in
new file mode 100644
index 0000000000..6c7c4306c3
--- /dev/null
+++ b/src/nvim/testdir/test_changelist.in
@@ -0,0 +1,22 @@
+Test changelist position after splitting window
+Set 'undolevels' to make changelist for sourced file
+
+STARTTEST
+:so small.vim
+Gkylp:set ul=100
+Gylp:set ul=100
+gg
+:vsplit
+:try
+: normal g;
+: normal ggVGcpass
+:catch
+: normal ggVGcfail
+:finally
+: %w! test.out
+:endtry
+:qa!
+ENDTEST
+
+1
+2
diff --git a/src/nvim/testdir/test_changelist.ok b/src/nvim/testdir/test_changelist.ok
new file mode 100644
index 0000000000..2ae28399f5
--- /dev/null
+++ b/src/nvim/testdir/test_changelist.ok
@@ -0,0 +1 @@
+pass
diff --git a/src/nvim/version.c b/src/nvim/version.c
index cf88c237ef..12dde9a6c7 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -221,9 +221,9 @@ static int included_patches[] = {
410,
//409 NA
//408,
- //407,
+ 407,
//406,
- //405,
+ 405,
//404 NA
//403 NA
//402,
@@ -237,12 +237,12 @@ static int included_patches[] = {
//394,
//393,
392,
- //391,
+ 391,
//390,
//389,
388,
387,
- //386,
+ 386,
//385,
//384 NA
383,
@@ -268,7 +268,7 @@ static int included_patches[] = {
//363,
362,
361,
- //360,
+ 360,
359,
358,
357,
diff --git a/src/nvim/window.c b/src/nvim/window.c
index ebce53cdf4..5ed145573d 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -948,6 +948,9 @@ int win_split_ins(int size, int flags, win_T *new_wp, int dir)
p_wh = size;
}
+ // Keep same changelist position in new window.
+ wp->w_changelistidx = oldwin->w_changelistidx;
+
/*
* make the new window the current window
*/
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index 66d43ff7ca..793be3172d 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -43,7 +43,11 @@ if(CMAKE_GENERATOR MATCHES "Makefiles")
set(MAKE_PRG "$(MAKE)")
endif()
-set(DEPS_C_COMPILER "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
+if(CMAKE_C_COMPILER_ARG1)
+ set(DEPS_C_COMPILER "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
+else()
+ set(DEPS_C_COMPILER "${CMAKE_C_COMPILER}")
+endif()
include(ExternalProject)