patch 9.1.1160: Ctrl-Y does not work well with "preinsert" when completing items
Commit: https://github.com/vim/vim/commit/a2c5559f297a18dc1ce3c4f1f9fd6204aed321c9 Author: glepnir <glephun...@gmail.com> Date: Fri Feb 28 17:43:42 2025 +0100 patch 9.1.1160: Ctrl-Y does not work well with "preinsert" when completing items Problem: The 'preinsert' feature requires Ctrl-Y to confirm insertion, but Ctrl-Y only works when the popup menu (pum) is displayed. Without enforcing this dependency, it could lead to confusing behavior or non-functional features. Solution: Modify ins_compl_has_preinsert() to check for both 'menu' and 'menuone' flags when 'preinsert' is set. Update documentation to clarify this requirement. This avoids adding complex conditional behaviors. (glepnir) fixes: #16728 closes: #16753 Signed-off-by: glepnir <glephun...@gmail.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index cbd532262..48b4b599a 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1,4 +1,4 @@ -*options.txt* For Vim version 9.1. Last change: 2025 Feb 27 +*options.txt* For Vim version 9.1. Last change: 2025 Feb 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -2120,6 +2120,17 @@ A jump table for the options with a short description can be found at |Q_op|. A comma-separated list of options for Insert mode completion |ins-completion|. The supported values are: + fuzzy Enable |fuzzy-matching| for completion candidates. This + allows for more flexible and intuitive matching, where + characters can be skipped and matches can be found even + if the exact sequence is not typed. + + longest Only insert the longest common text of the matches. If + the menu is displayed you can use CTRL-L to add more + characters. Whether case is ignored depends on the kind + of completion. For buffer text the 'ignorecase' option is + used. + menu Use a popup menu to show the possible completions. The menu is only shown when there is more than one match and sufficient colors are available. |ins-completion-menu| @@ -2128,15 +2139,17 @@ A jump table for the options with a short description can be found at |Q_op|. Useful when there is additional information about the match, e.g., what file it comes from. - longest Only insert the longest common text of the matches. If - the menu is displayed you can use CTRL-L to add more - characters. Whether case is ignored depends on the kind - of completion. For buffer text the 'ignorecase' option is - used. + noinsert Do not insert any text for a match until the user selects + a match from the menu. Only works in combination with + "menu" or "menuone". No effect if "longest" is present. - preview Show extra information about the currently selected - completion in the preview window. Only works in - combination with "menu" or "menuone". + noselect Same as "noinsert", except that no menu item is + pre-selected. If both "noinsert" and "noselect" are + present, "noselect" has precedence. + + nosort Disable sorting of completion candidates based on fuzzy + scores when "fuzzy" is enabled. Candidates will appear + in their original order. popup Show extra information about the currently selected completion in a popup window. Only works in combination @@ -2151,28 +2164,16 @@ A jump table for the options with a short description can be found at |Q_op|. See the example at |complete-popuphidden|. {only works when compiled with the |+textprop| feature} - noinsert Do not insert any text for a match until the user selects - a match from the menu. Only works in combination with - "menu" or "menuone". No effect if "longest" is present. - - noselect Same as "noinsert", except that no menu item is - pre-selected. If both "noinsert" and "noselect" are - present, "noselect" has precedence. - - fuzzy Enable |fuzzy-matching| for completion candidates. This - allows for more flexible and intuitive matching, where - characters can be skipped and matches can be found even - if the exact sequence is not typed. - - nosort Disable sorting of completion candidates based on fuzzy - scores when "fuzzy" is enabled. Candidates will appear - in their original order. - preinsert Preinsert the portion of the first candidate word that is not part of the current completion leader and using the |hl-ComplMatchIns| highlight group. Does not work when - "fuzzy" is also included. + "fuzzy" is set. Requires both "menu" and "menuone" to be + set. + + preview Show extra information about the currently selected + completion in the preview window. Only works in + combination with "menu" or "menuone". *'completepopup'* *'cpp'* 'completepopup' 'cpp' string (default empty) diff --git a/src/edit.c b/src/edit.c index 6f22b4311..808aae141 100644 --- a/src/edit.c +++ b/src/edit.c @@ -146,7 +146,6 @@ edit( #ifdef FEAT_CONCEAL int cursor_line_was_concealed; #endif - int ins_completion = FALSE; // Remember whether editing was restarted after CTRL-O. did_restart_edit = restart_edit; @@ -637,11 +636,8 @@ edit( * and the cursor is still in the completed word. Only when there is * a match, skip this when no matches were found. */ - ins_completion = ins_compl_active() - && curwin->w_cursor.col >= ins_compl_col() - && ins_compl_has_shown_match(); - - if (ins_completion && pum_wanted()) + if (ins_compl_active() && curwin->w_cursor.col >= ins_compl_col() + && ins_compl_has_shown_match() && pum_wanted()) { // BS: Delete one character from "compl_leader". if ((c == K_BS || c == Ctrl_H) @@ -699,8 +695,6 @@ edit( ins_compl_delete(); } } - else if (ins_completion && !pum_wanted() && ins_compl_preinsert_effect()) - ins_compl_delete(); // Prepare for or stop CTRL-X mode. This doesn't do completion, but // it does fix up the text when finishing completion. diff --git a/src/insexpand.c b/src/insexpand.c index edc4265e4..8a6f8afd8 100644 --- a/src/insexpand.c +++ b/src/insexpand.c @@ -1985,12 +1985,15 @@ ins_compl_len(void) } /* - * Return TRUE when preinsert is set otherwise FALSE. + * Return TRUE when preinsert is set AND both 'menu' and 'menuone' flags + * are also set, otherwise return FALSE. */ static int ins_compl_has_preinsert(void) { - return (get_cot_flags() & (COT_PREINSERT | COT_FUZZY)) == COT_PREINSERT; + int cur_cot_flags = get_cot_flags(); + return (cur_cot_flags & (COT_PREINSERT | COT_FUZZY | COT_MENU | COT_MENUONE)) + == (COT_PREINSERT | COT_MENU | COT_MENUONE); } /* diff --git a/src/testdir/test_ins_complete.vim b/src/testdir/test_ins_complete.vim index b302a3ee7..e91a99e7c 100644 --- a/src/testdir/test_ins_complete.vim +++ b/src/testdir/test_ins_complete.vim @@ -3217,10 +3217,11 @@ function Test_completeopt_preinsert() call assert_equal("fobar", getline('.')) call assert_equal(5, col('.')) + " When the pum is not visible, the preinsert has no effect set cot=preinsert call feedkeys("Sfoo1 foo2\<CR>f\<C-X>\<C-N>bar", 'tx') - call assert_equal("fbar", getline('.')) - call assert_equal(4, col('.')) + call assert_equal("foo1bar", getline('.')) + call assert_equal(7, col('.')) bw! set cot& diff --git a/src/version.c b/src/version.c index f29e1f3eb..12d4434ec 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1160, /**/ 1159, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1to3iW-000pfc-4V%40256bit.org.