diff options
author | Bram Moolenaar <Bram@vim.org> | 2015-07-10 18:18:40 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2015-07-10 18:18:40 +0200 |
commit | b6be1e2390485ff314022d2b7ce0307e42d7e2a6 (patch) | |
tree | 825fb32e5957ad9d5e7cb1f1652d2344e40eb6c3 | |
parent | 42a4512f62322fcc12c0071037161d2079d98ba5 (diff) | |
download | vim-git-b6be1e2390485ff314022d2b7ce0307e42d7e2a6.tar.gz |
patch 7.4.775v7.4.775
Problem: It is not possible to avoid using the first item of completion.
Solution: Add the "noinsert" and "noselect" values to 'completeopt'. (Shougo
Matsu)
-rw-r--r-- | runtime/doc/options.txt | 8 | ||||
-rw-r--r-- | src/edit.c | 44 | ||||
-rw-r--r-- | src/option.c | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 49 insertions, 7 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index 320b1544c..e371a74ec 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1819,6 +1819,14 @@ A jump table for the options with a short description can be found at |Q_op|. completion in the preview window. Only works in combination with "menu" or "menuone". + 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 Do not select a match in the menu, force the user to + select one from the menu. Only works in combination with + "menu" or "menuone". + *'concealcursor'* *'cocu'* 'concealcursor' 'cocu' string (default: "") diff --git a/src/edit.c b/src/edit.c index 3e129cb62..086a5b99e 100644 --- a/src/edit.c +++ b/src/edit.c @@ -108,6 +108,11 @@ static char_u *compl_leader = NULL; static int compl_get_longest = FALSE; /* put longest common string in compl_leader */ +static int compl_no_insert = FALSE; /* FALSE: select & insert + TRUE: noinsert */ +static int compl_no_select = FALSE; /* FALSE: select & insert + TRUE: noselect */ + static int compl_used_match; /* Selected one of the matches. When FALSE the match was edited or using the longest common string. */ @@ -2788,7 +2793,17 @@ set_completion(startcol, list) compl_cont_status = 0; compl_curr_match = compl_first_match; - ins_complete(Ctrl_N); + if (compl_no_insert) + { + if (!compl_no_select) + ins_complete(K_DOWN); + } + else + { + ins_complete(Ctrl_N); + if (compl_no_select) + ins_complete(Ctrl_P); + } out_flush(); } @@ -3657,10 +3672,18 @@ ins_compl_prep(c) if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET || (ctrl_x_mode == 0 && !compl_started)) { - compl_get_longest = (vim_strchr(p_cot, 'l') != NULL); + compl_get_longest = (strstr((char *)p_cot, "longest") != NULL); compl_used_match = TRUE; + } + compl_no_insert = FALSE; + compl_no_select = FALSE; + if (strstr((char *)p_cot, "noselect") != NULL) + compl_no_select = TRUE; + if (strstr((char *)p_cot, "noinsert") != NULL) + compl_no_insert = TRUE; + if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET) { /* @@ -4672,6 +4695,7 @@ ins_compl_next(allow_get_expansion, count, insert_match) compl_T *found_compl = NULL; int found_end = FALSE; int advance; + int started = compl_started; /* When user complete function return -1 for findstart which is next * time of 'always', compl_shown_match become NULL. */ @@ -4753,7 +4777,7 @@ ins_compl_next(allow_get_expansion, count, insert_match) return -1; } - if (advance) + if (!compl_no_select && advance) { if (compl_shows_dir == BACKWARD) --compl_pending; @@ -4805,7 +4829,12 @@ ins_compl_next(allow_get_expansion, count, insert_match) } /* Insert the text of the new completion, or the compl_leader. */ - if (insert_match) + if (compl_no_insert && !started) + { + ins_bytes(compl_orig_text + ins_compl_len()); + compl_used_match = FALSE; + } + else if (insert_match) { if (!compl_get_longest || compl_used_match) ins_compl_insert(); @@ -4842,7 +4871,10 @@ ins_compl_next(allow_get_expansion, count, insert_match) /* Enter will select a match when the match wasn't inserted and the popup * menu is visible. */ - compl_enter_selects = !insert_match && compl_match_array != NULL; + if (compl_no_insert && !started) + compl_enter_selects = TRUE; + else + compl_enter_selects = !insert_match && compl_match_array != NULL; /* * Show the file name for the match (if any) @@ -4917,7 +4949,7 @@ ins_compl_check_keys(frequency) } } } - if (compl_pending != 0 && !got_int) + if (compl_pending != 0 && !got_int && !compl_no_insert) { int todo = compl_pending > 0 ? compl_pending : -compl_pending; diff --git a/src/option.c b/src/option.c index 69c6bf402..046a63f3f 100644 --- a/src/option.c +++ b/src/option.c @@ -3054,7 +3054,7 @@ static char *(p_fdm_values[]) = {"manual", "expr", "marker", "indent", "syntax", static char *(p_fcl_values[]) = {"all", NULL}; #endif #ifdef FEAT_INS_EXPAND -static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview", NULL}; +static char *(p_cot_values[]) = {"menu", "menuone", "longest", "preview", "noinsert", "noselect", NULL}; #endif static void set_option_default __ARGS((int, int opt_flags, int compatible)); diff --git a/src/version.c b/src/version.c index e19470784..9a7aa784e 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 775, +/**/ 774, /**/ 773, |