summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2015-07-10 18:18:40 +0200
committerBram Moolenaar <Bram@vim.org>2015-07-10 18:18:40 +0200
commitb6be1e2390485ff314022d2b7ce0307e42d7e2a6 (patch)
tree825fb32e5957ad9d5e7cb1f1652d2344e40eb6c3
parent42a4512f62322fcc12c0071037161d2079d98ba5 (diff)
downloadvim-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.txt8
-rw-r--r--src/edit.c44
-rw-r--r--src/option.c2
-rw-r--r--src/version.c2
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,