aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/edit.c
diff options
context:
space:
mode:
authorSean Dewar <seandewar@users.noreply.github.com>2021-08-14 00:35:51 +0100
committerSean Dewar <seandewar@users.noreply.github.com>2021-09-17 02:10:39 +0100
commit423150dfa000be58c5084871e560fc1287839457 (patch)
tree9cb0b6e8b7a32d16b4890c72f293e45567d99824 /src/nvim/edit.c
parent7ff5f02821dadb35b560650e35c90f74878a962d (diff)
downloadrneovim-423150dfa000be58c5084871e560fc1287839457.tar.gz
rneovim-423150dfa000be58c5084871e560fc1287839457.tar.bz2
rneovim-423150dfa000be58c5084871e560fc1287839457.zip
vim-patch:8.2.3293: finding completions may cause an endless loop
Problem: Finding completions may cause an endless loop. Solution: Use a better way to check coming back where the search started. (Andy Gozas, closes vim/vim#8672, closes vim/vim#8671) https://github.com/vim/vim/commit/6a230c6b32695393785ae64b440ce5f023a22382
Diffstat (limited to 'src/nvim/edit.c')
-rw-r--r--src/nvim/edit.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index a19adca942..f02d957079 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -4127,6 +4127,7 @@ static int ins_compl_get_exp(pos_T *ini)
char_u *dict = NULL;
int dict_f = 0;
bool set_match_pos;
+ pos_T prev_pos = { 0, 0, 0 };
int l_ctrl_x_mode = ctrl_x_mode;
assert(curbuf != NULL);
@@ -4365,6 +4366,7 @@ static int ins_compl_get_exp(pos_T *ini)
} else if (*e_cpt == '.') {
p_ws = true;
}
+ bool looped_around = false;
for (;; ) {
bool cont_s_ipos = false;
@@ -4393,7 +4395,26 @@ static int ins_compl_get_exp(pos_T *ini)
} else if (first_match_pos.lnum == last_match_pos.lnum
&& first_match_pos.col == last_match_pos.col) {
found_new_match = FAIL;
+ } else if ((compl_direction == FORWARD)
+ && (prev_pos.lnum > pos->lnum
+ || (prev_pos.lnum == pos->lnum
+ && prev_pos.col >= pos->col))) {
+ if (looped_around) {
+ found_new_match = FAIL;
+ } else {
+ looped_around = true;
+ }
+ } else if ((compl_direction != FORWARD)
+ && (prev_pos.lnum < pos->lnum
+ || (prev_pos.lnum == pos->lnum
+ && prev_pos.col <= pos->col))) {
+ if (looped_around) {
+ found_new_match = FAIL;
+ } else {
+ looped_around = true;
+ }
}
+ prev_pos = *pos;
if (found_new_match == FAIL) {
if (ins_buf == curbuf) {
found_all = true;