aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/eval.c11
-rw-r--r--src/nvim/getchar.c5
-rw-r--r--src/nvim/globals.h2
-rw-r--r--src/nvim/testdir/test_cursor_func.vim27
-rw-r--r--src/nvim/version.c2
5 files changed, 42 insertions, 5 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 9553c7a7ed..60ebc34ea9 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -6707,6 +6707,7 @@ static struct fst {
{ "did_filetype", 0, 0, f_did_filetype },
{ "diff_filler", 1, 1, f_diff_filler },
{ "diff_hlID", 2, 2, f_diff_hlID },
+ {"disable_char_avail_for_testing", 1, 1, f_disable_char_avail_for_testing},
{ "empty", 1, 1, f_empty },
{ "escape", 2, 2, f_escape },
{ "eval", 1, 1, f_eval },
@@ -8582,6 +8583,15 @@ static void f_diff_hlID(typval_T *argvars, typval_T *rettv)
rettv->vval.v_number = hlID == (hlf_T)0 ? 0 : (int)hlID;
}
+//
+// "disable_char_avail_for_testing({expr})" function
+//
+static void f_disable_char_avail_for_testing(typval_T *argvars, typval_T *rettv)
+ FUNC_ATTR_NONNULL_ARG(1)
+{
+ disable_char_avail_for_testing = get_tv_number(&argvars[0]);
+}
+
/*
* "empty({expr})" function
*/
@@ -10173,6 +10183,7 @@ static void getpos_both(typval_T *argvars, typval_T *rettv, bool getcurpos)
list_append_number(l,
(fp != NULL) ? (varnumber_T)fp->coladd : (varnumber_T)0);
if (getcurpos) {
+ update_curswant();
list_append_number(l, curwin->w_curswant == MAXCOL
? (varnumber_T)MAXCOL
: (varnumber_T)curwin->w_curswant + 1);
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 437495faa4..74e5526caa 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1562,6 +1562,11 @@ int char_avail(void)
{
int retval;
+ // When disable_char_avail_for_testing(1) was called pretend
+ // there is no typeahead
+ if (disable_char_avail_for_testing) {
+ return FALSE;
+ }
++no_mapping;
retval = vpeekc();
--no_mapping;
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index 49d1de21d9..d8331d608c 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -1239,6 +1239,8 @@ EXTERN FILE *time_fd INIT(= NULL); /* where to write startup timing */
EXTERN int ignored;
EXTERN char *ignoredp;
+EXTERN int disable_char_avail_for_testing INIT(= 0);
+
// If a msgpack-rpc channel should be started over stdin/stdout
EXTERN bool embedded_mode INIT(= false);
EXTERN Loop loop;
diff --git a/src/nvim/testdir/test_cursor_func.vim b/src/nvim/testdir/test_cursor_func.vim
index 684391e2a5..d3236e6e01 100644
--- a/src/nvim/testdir/test_cursor_func.vim
+++ b/src/nvim/testdir/test_cursor_func.vim
@@ -20,16 +20,35 @@ func Test_move_cursor()
call assert_equal([4, 3, 0, 3], getcurpos()[1:])
call cursor(2, 2)
- call assert_equal([2, 2, 0, 3], getcurpos()[1:])
+ call assert_equal([2, 2, 0, 2], getcurpos()[1:])
" line number zero keeps the line number
call cursor(0, 1)
- call assert_equal([2, 1, 0, 3], getcurpos()[1:])
+ call assert_equal([2, 1, 0, 1], getcurpos()[1:])
" col number zero keeps the column
call cursor(3, 0)
- call assert_equal([3, 1, 0, 3], getcurpos()[1:])
+ call assert_equal([3, 1, 0, 1], getcurpos()[1:])
" below last line goes to last line
call cursor(9, 1)
- call assert_equal([4, 1, 0, 3], getcurpos()[1:])
+ call assert_equal([4, 1, 0, 1], getcurpos()[1:])
quit!
endfunc
+
+" Very short version of what matchparen does.
+function s:Highlight_Matching_Pair()
+ let save_cursor = getcurpos()
+ call setpos('.', save_cursor)
+endfunc
+
+func Test_curswant_with_autocommand()
+ new
+ call setline(1, ['func()', '{', '}', '----'])
+ autocmd! CursorMovedI * call s:Highlight_Matching_Pair()
+ call disable_char_avail_for_testing(1)
+ exe "normal! 3Ga\<Down>X\<Esc>"
+ call disable_char_avail_for_testing(0)
+ call assert_equal('-X---', getline(4))
+ autocmd! CursorMovedI *
+ quit!
+endfunc
+
diff --git a/src/nvim/version.c b/src/nvim/version.c
index a492c8d7ec..ed16b1b0d5 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -377,7 +377,7 @@ static int included_patches[] = {
// 1303 NA
// 1302 NA
// 1301 NA
- // 1300,
+ 1300,
// 1299 NA
// 1298 NA
// 1297 NA