aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2018-06-16 12:01:09 +0200
committerGitHub <noreply@github.com>2018-06-16 12:01:09 +0200
commit4bb039e2257ede3faf968ef9adcb786e2f41ffe5 (patch)
tree03105b8ecf733088c0745b8524a11c27b42e92b7 /src
parent4c3c04d03cc0cdbccfb71b534fc3cd238fd3974d (diff)
parent3462acbbff7a56abf7abc1393e6b212332adecdb (diff)
downloadrneovim-4bb039e2257ede3faf968ef9adcb786e2f41ffe5.tar.gz
rneovim-4bb039e2257ede3faf968ef9adcb786e2f41ffe5.tar.bz2
rneovim-4bb039e2257ede3faf968ef9adcb786e2f41ffe5.zip
Merge #8543 from janlazo/vim-8.0.0596
Diffstat (limited to 'src')
-rw-r--r--src/nvim/edit.c36
-rw-r--r--src/nvim/testdir/test_popup.vim43
2 files changed, 67 insertions, 12 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index cf6167c6ea..c20758cb0b 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -138,6 +138,7 @@ struct compl_S {
static compl_T *compl_first_match = NULL;
static compl_T *compl_curr_match = NULL;
static compl_T *compl_shown_match = NULL;
+static compl_T *compl_old_match = NULL;
/* After using a cursor key <Enter> selects a match in the popup menu,
* otherwise it inserts a line break. */
@@ -2935,6 +2936,7 @@ static void ins_compl_free(void)
} while (compl_curr_match != NULL && compl_curr_match != compl_first_match);
compl_first_match = compl_curr_match = NULL;
compl_shown_match = NULL;
+ compl_old_match = NULL;
}
static void ins_compl_clear(void)
@@ -3672,7 +3674,6 @@ static int ins_compl_get_exp(pos_T *ini)
char_u *ptr;
char_u *dict = NULL;
int dict_f = 0;
- compl_T *old_match;
int set_match_pos;
int l_ctrl_x_mode = ctrl_x_mode;
@@ -3687,7 +3688,7 @@ static int ins_compl_get_exp(pos_T *ini)
last_match_pos = first_match_pos = *ini;
}
- old_match = compl_curr_match; /* remember the last current match */
+ compl_old_match = compl_curr_match; // remember the last current match
pos = (compl_direction == FORWARD) ? &last_match_pos : &first_match_pos;
/* For ^N/^P loop over all the flags/windows/buffers in 'complete' */
for (;; ) {
@@ -3776,6 +3777,12 @@ static int ins_compl_get_exp(pos_T *ini)
}
}
+ // If complete() was called then compl_pattern has been reset.
+ // The following won't work then, bail out.
+ if (compl_pattern == NULL) {
+ break;
+ }
+
switch (type) {
case -1:
break;
@@ -3982,10 +3989,11 @@ static int ins_compl_get_exp(pos_T *ini)
p_ws = save_p_ws;
}
- /* check if compl_curr_match has changed, (e.g. other type of
- * expansion added something) */
- if (type != 0 && compl_curr_match != old_match)
+ // check if compl_curr_match has changed, (e.g. other type of
+ // expansion added something)
+ if (type != 0 && compl_curr_match != compl_old_match) {
found_new_match = OK;
+ }
/* break the loop for specialized modes (use 'complete' just for the
* generic l_ctrl_x_mode == 0) or when we've found a new match */
@@ -4025,13 +4033,17 @@ static int ins_compl_get_exp(pos_T *ini)
i = ins_compl_make_cyclic();
}
- /* If several matches were added (FORWARD) or the search failed and has
- * just been made cyclic then we have to move compl_curr_match to the next
- * or previous entry (if any) -- Acevedo */
- compl_curr_match = compl_direction == FORWARD ? old_match->cp_next
- : old_match->cp_prev;
- if (compl_curr_match == NULL)
- compl_curr_match = old_match;
+ if (compl_old_match != NULL) {
+ // If several matches were added (FORWARD) or the search failed and has
+ // just been made cyclic then we have to move compl_curr_match to the
+ // next or previous entry (if any) -- Acevedo
+ compl_curr_match = compl_direction == FORWARD
+ ? compl_old_match->cp_next
+ : compl_old_match->cp_prev;
+ if (compl_curr_match == NULL) {
+ compl_curr_match = compl_old_match;
+ }
+ }
return i;
}
diff --git a/src/nvim/testdir/test_popup.vim b/src/nvim/testdir/test_popup.vim
index f5bdd717dd..ea98379f04 100644
--- a/src/nvim/testdir/test_popup.vim
+++ b/src/nvim/testdir/test_popup.vim
@@ -608,4 +608,47 @@ func Test_popup_and_preview_autocommand()
bw!
endfunc
+fun MessCompleteMonths()
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep")
+ call complete_add(m)
+ if complete_check()
+ break
+ endif
+ endfor
+ return []
+endfun
+
+fun MessCompleteMore()
+ call complete(1, split("Oct Nov Dec"))
+ return []
+endfun
+
+fun MessComplete(findstart, base)
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ else
+ call MessCompleteMonths()
+ call MessCompleteMore()
+ return []
+ endif
+endf
+
+func Test_complete_func_mess()
+ " Calling complete() after complete_add() in 'completefunc' is wrong, but it
+ " should not crash.
+ set completefunc=MessComplete
+ new
+ call setline(1, 'Ju')
+ call feedkeys("A\<c-x>\<c-u>/\<esc>", 'tx')
+ call assert_equal('Oct/Oct', getline(1))
+ bwipe!
+ set completefunc=
+endfunc
+
+
" vim: shiftwidth=2 sts=2 expandtab