aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-09-24 21:13:32 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-09-24 21:16:43 +0800
commit57b731818d3d54dacdace081f6db4a8ce813173d (patch)
treea9b49cf3524d12368532697fffd81c7677ec3bcf
parent291a6496327e90056ea68085ad52ab74ca1df752 (diff)
downloadrneovim-57b731818d3d54dacdace081f6db4a8ce813173d.tar.gz
rneovim-57b731818d3d54dacdace081f6db4a8ce813173d.tar.bz2
rneovim-57b731818d3d54dacdace081f6db4a8ce813173d.zip
vim-patch:9.0.0567: 'completeopt' "longest" is not used for complete()
Problem: 'completeopt' "longest" is not used for complete(). Solution: Also use "longest" for complete(). (Bjorn Linse, closes vim/vim#11206) https://github.com/vim/vim/commit/87af60c91503e37c9144f8e48022b12994ce2c85
-rw-r--r--src/nvim/insexpand.c14
-rw-r--r--src/nvim/testdir/test_ins_complete.vim20
2 files changed, 31 insertions, 3 deletions
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c
index a4b0d68ffe..1426f28453 100644
--- a/src/nvim/insexpand.c
+++ b/src/nvim/insexpand.c
@@ -199,6 +199,8 @@ static bool compl_no_insert = false; ///< false: select & insert
///< true: noinsert
static bool compl_no_select = false; ///< false: select & insert
///< true: noselect
+static bool compl_longest = false; ///< false: insert full match
+ ///< true: insert longest prefix
/// Selected one of the matches. When false the match was edited or using the
/// longest common string.
@@ -1006,12 +1008,16 @@ void completeopt_was_set(void)
{
compl_no_insert = false;
compl_no_select = false;
+ compl_longest = false;
if (strstr(p_cot, "noselect") != NULL) {
compl_no_select = true;
}
if (strstr(p_cot, "noinsert") != NULL) {
compl_no_insert = true;
}
+ if (strstr(p_cot, "longest") != NULL) {
+ compl_longest = true;
+ }
}
/// "compl_match_array" points the currently displayed list of entries in the
@@ -2103,7 +2109,7 @@ bool ins_compl_prep(int c)
// Set "compl_get_longest" when finding the first matches.
if (ctrl_x_mode_not_defined_yet()
|| (ctrl_x_mode_normal() && !compl_started)) {
- compl_get_longest = (strstr(p_cot, "longest") != NULL);
+ compl_get_longest = compl_longest;
compl_used_match = true;
}
@@ -2420,6 +2426,7 @@ static void set_completion(colnr_T startcol, list_T *list)
}
ins_compl_clear();
ins_compl_free();
+ compl_get_longest = compl_longest;
compl_direction = FORWARD;
if (startcol > curwin->w_cursor.col) {
@@ -2449,9 +2456,10 @@ static void set_completion(colnr_T startcol, list_T *list)
int save_w_leftcol = curwin->w_leftcol;
compl_curr_match = compl_first_match;
- if (compl_no_insert || compl_no_select) {
+ bool no_select = compl_no_select || compl_longest;
+ if (compl_no_insert || no_select) {
ins_complete(K_DOWN, false);
- if (compl_no_select) {
+ if (no_select) {
ins_complete(K_UP, false);
}
} else {
diff --git a/src/nvim/testdir/test_ins_complete.vim b/src/nvim/testdir/test_ins_complete.vim
index 3e563f29f9..0810bd4adc 100644
--- a/src/nvim/testdir/test_ins_complete.vim
+++ b/src/nvim/testdir/test_ins_complete.vim
@@ -702,6 +702,26 @@ func Test_recursive_complete_func()
bw!
endfunc
+" Test for using complete() with completeopt+=longest
+func Test_complete_with_longest()
+ inoremap <f3> <cmd>call complete(1, ["iaax", "iaay", "iaaz"])<cr>
+ new
+
+ " default: insert first match
+ set completeopt&
+ call setline(1, ['i'])
+ exe "normal Aa\<f3>\<esc>"
+ call assert_equal('iaax', getline(1))
+
+ " with longest: insert longest prefix
+ set completeopt+=longest
+ call setline(1, ['i'])
+ exe "normal Aa\<f3>\<esc>"
+ call assert_equal('iaa', getline(1))
+ set completeopt&
+endfunc
+
+
" Test for completing words following a completed word in a line
func Test_complete_wrapscan()
" complete words from another buffer