diff options
Diffstat (limited to 'src/nvim/insexpand.c')
-rw-r--r-- | src/nvim/insexpand.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/src/nvim/insexpand.c b/src/nvim/insexpand.c index 2e3a2e39ac..5036ec5e45 100644 --- a/src/nvim/insexpand.c +++ b/src/nvim/insexpand.c @@ -256,6 +256,7 @@ static pos_T compl_startpos; static int compl_length = 0; static colnr_T compl_col = 0; ///< column where the text starts ///< that is being completed +static colnr_T compl_ins_end_col = 0; static char *compl_orig_text = NULL; ///< text as it was before ///< completion started /// Undo information to restore extmarks for original text. @@ -282,6 +283,11 @@ static size_t spell_bad_len = 0; // length of located bad word static int compl_selected_item = -1; +// "compl_match_array" points the currently displayed list of entries in the +// popup menu. It is NULL when there is no popup menu. +static pumitem_T *compl_match_array = NULL; +static int compl_match_arraysize; + /// CTRL-X pressed in Insert mode. void ins_ctrl_x(void) { @@ -943,6 +949,30 @@ static bool ins_compl_equal(compl_T *match, char *str, size_t len) return strncmp(match->cp_str, str, len) == 0; } +/// when len is -1 mean use whole length of p otherwise part of p +static void ins_compl_insert_bytes(char *p, int len) + FUNC_ATTR_NONNULL_ALL +{ + if (len == -1) { + len = (int)strlen(p); + } + assert(len >= 0); + ins_bytes_len(p, (size_t)len); + compl_ins_end_col = curwin->w_cursor.col - 1; +} + +/// Checks if the column is within the currently inserted completion text +/// column range. If it is, it returns a special highlight attribute. +/// -1 mean normal item. +int ins_compl_col_range_attr(int col) +{ + if (col >= compl_col && col < compl_ins_end_col) { + return syn_name2attr("ComplMatchIns"); + } + + return -1; +} + /// Reduce the longest common string for match "match". static void ins_compl_longest_match(compl_T *match) { @@ -952,7 +982,7 @@ static void ins_compl_longest_match(compl_T *match) bool had_match = (curwin->w_cursor.col > compl_col); ins_compl_delete(false); - ins_bytes(compl_leader + get_compl_len()); + ins_compl_insert_bytes(compl_leader + get_compl_len(), -1); ins_redraw(false); // When the match isn't there (to avoid matching itself) remove it @@ -986,7 +1016,7 @@ static void ins_compl_longest_match(compl_T *match) *p = NUL; bool had_match = (curwin->w_cursor.col > compl_col); ins_compl_delete(false); - ins_bytes(compl_leader + get_compl_len()); + ins_compl_insert_bytes(compl_leader + get_compl_len(), -1); ins_redraw(false); // When the match isn't there (to avoid matching itself) remove it @@ -1058,11 +1088,6 @@ unsigned get_cot_flags(void) return curbuf->b_cot_flags != 0 ? curbuf->b_cot_flags : cot_flags; } -/// "compl_match_array" points the currently displayed list of entries in the -/// popup menu. It is NULL when there is no popup menu. -static pumitem_T *compl_match_array = NULL; -static int compl_match_arraysize; - /// Remove any popup menu. static void ins_compl_del_pum(void) { @@ -1678,6 +1703,7 @@ void ins_compl_clear(void) compl_cont_status = 0; compl_started = false; compl_matches = 0; + compl_ins_end_col = 0; XFREE_CLEAR(compl_pattern); compl_patternlen = 0; XFREE_CLEAR(compl_leader); @@ -1802,7 +1828,7 @@ static void ins_compl_new_leader(void) { ins_compl_del_pum(); ins_compl_delete(true); - ins_bytes(compl_leader + get_compl_len()); + ins_compl_insert_bytes(compl_leader + get_compl_len(), -1); compl_used_match = false; if (compl_started) { @@ -2137,7 +2163,7 @@ static bool ins_compl_stop(const int c, const int prev_mode, bool retval) const int compl_len = get_compl_len(); const int len = (int)strlen(p); if (len > compl_len) { - ins_bytes_len(p + compl_len, (size_t)(len - compl_len)); + ins_compl_insert_bytes(p + compl_len, len - compl_len); } } restore_orig_extmarks(); @@ -3639,7 +3665,7 @@ void ins_compl_insert(bool in_compl_func) // Make sure we don't go over the end of the string, this can happen with // illegal bytes. if (compl_len < (int)strlen(compl_shown_match->cp_str)) { - ins_bytes(compl_shown_match->cp_str + compl_len); + ins_compl_insert_bytes(compl_shown_match->cp_str + compl_len, -1); } compl_used_match = !match_at_original_text(compl_shown_match); @@ -3888,14 +3914,15 @@ static int ins_compl_next(bool allow_get_expansion, int count, bool insert_match // Insert the text of the new completion, or the compl_leader. if (compl_no_insert && !started) { - ins_bytes(compl_orig_text + get_compl_len()); + ins_compl_insert_bytes(compl_orig_text + get_compl_len(), -1); compl_used_match = false; restore_orig_extmarks(); } else if (insert_match) { if (!compl_get_longest || compl_used_match) { ins_compl_insert(in_compl_func); } else { - ins_bytes(compl_leader + get_compl_len()); + assert(compl_leader != NULL); + ins_compl_insert_bytes(compl_leader + get_compl_len(), -1); } if (!strcmp(compl_curr_match->cp_str, compl_orig_text)) { restore_orig_extmarks(); |