mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
Merge pull request #34294 from glepnir/vim-9.1.1426
vim-patch:9.1.{1426,1428}: register completion improve
This commit is contained in:
@@ -146,7 +146,7 @@ commands in CTRL-X submode *i_CTRL-X_index*
|
|||||||
|i_CTRL-X_CTRL-N| CTRL-X CTRL-N next completion
|
|i_CTRL-X_CTRL-N| CTRL-X CTRL-N next completion
|
||||||
|i_CTRL-X_CTRL-O| CTRL-X CTRL-O omni completion
|
|i_CTRL-X_CTRL-O| CTRL-X CTRL-O omni completion
|
||||||
|i_CTRL-X_CTRL-P| CTRL-X CTRL-P previous completion
|
|i_CTRL-X_CTRL-P| CTRL-X CTRL-P previous completion
|
||||||
|i_CTRL-X_CTRL-R| CTRL-X CTRL-R complete words from registers
|
|i_CTRL-X_CTRL-R| CTRL-X CTRL-R complete contents from registers
|
||||||
|i_CTRL-X_CTRL-S| CTRL-X CTRL-S spelling suggestions
|
|i_CTRL-X_CTRL-S| CTRL-X CTRL-S spelling suggestions
|
||||||
|i_CTRL-X_CTRL-T| CTRL-X CTRL-T complete identifiers from thesaurus
|
|i_CTRL-X_CTRL-T| CTRL-X CTRL-T complete identifiers from thesaurus
|
||||||
|i_CTRL-X_CTRL-Y| CTRL-X CTRL-Y scroll down
|
|i_CTRL-X_CTRL-Y| CTRL-X CTRL-Y scroll down
|
||||||
|
@@ -629,7 +629,7 @@ Completion can be done for:
|
|||||||
11. omni completion |i_CTRL-X_CTRL-O|
|
11. omni completion |i_CTRL-X_CTRL-O|
|
||||||
12. Spelling suggestions |i_CTRL-X_s|
|
12. Spelling suggestions |i_CTRL-X_s|
|
||||||
13. keywords in 'complete' |i_CTRL-N| |i_CTRL-P|
|
13. keywords in 'complete' |i_CTRL-N| |i_CTRL-P|
|
||||||
14. words from registers |i_CTRL-X_CTRL-R|
|
14. contents from registers |i_CTRL-X_CTRL-R|
|
||||||
|
|
||||||
Additionally, |i_CTRL-X_CTRL-Z| stops completion without changing the text.
|
Additionally, |i_CTRL-X_CTRL-Z| stops completion without changing the text.
|
||||||
|
|
||||||
@@ -1000,7 +1000,7 @@ CTRL-X CTRL-V Guess what kind of item is in front of the cursor and
|
|||||||
completion, for example: >
|
completion, for example: >
|
||||||
:imap <Tab> <C-X><C-V>
|
:imap <Tab> <C-X><C-V>
|
||||||
|
|
||||||
Completing words from registers *compl-register-words*
|
Completing contents from registers *compl-register-words*
|
||||||
*i_CTRL-X_CTRL-R*
|
*i_CTRL-X_CTRL-R*
|
||||||
CTRL-X CTRL-R Guess what kind of item is in front of the cursor from
|
CTRL-X CTRL-R Guess what kind of item is in front of the cursor from
|
||||||
all registers and find the first match for it.
|
all registers and find the first match for it.
|
||||||
@@ -1014,6 +1014,11 @@ CTRL-X CTRL-R Guess what kind of item is in front of the cursor from
|
|||||||
CTRL-P Search backwards for previous match. This match
|
CTRL-P Search backwards for previous match. This match
|
||||||
replaces the previous one.
|
replaces the previous one.
|
||||||
|
|
||||||
|
CTRL-X CTRL-R Further use of CTRL-X CTRL-R will copy the line
|
||||||
|
following the previous expansion in other contexts
|
||||||
|
unless a double CTRL-X is used (e.g. this switches
|
||||||
|
from completing register words to register contents).
|
||||||
|
|
||||||
User defined completion *compl-function*
|
User defined completion *compl-function*
|
||||||
|
|
||||||
Completion is done by a function that can be defined by the user with the
|
Completion is done by a function that can be defined by the user with the
|
||||||
|
@@ -187,7 +187,7 @@ with a certain type of item:
|
|||||||
CTRL-X CTRL-D macro definitions (also in included files)
|
CTRL-X CTRL-D macro definitions (also in included files)
|
||||||
CTRL-X CTRL-I current and included files
|
CTRL-X CTRL-I current and included files
|
||||||
CTRL-X CTRL-K words from a dictionary
|
CTRL-X CTRL-K words from a dictionary
|
||||||
CTRL-X CTRL-R words from registers
|
CTRL-X CTRL-R contents from registers
|
||||||
CTRL-X CTRL-T words from a thesaurus
|
CTRL-X CTRL-T words from a thesaurus
|
||||||
CTRL-X CTRL-] tags
|
CTRL-X CTRL-] tags
|
||||||
CTRL-X CTRL-V Vim command line
|
CTRL-X CTRL-V Vim command line
|
||||||
|
@@ -230,7 +230,7 @@ Insert-mode completion. |ins-completion|
|
|||||||
|i_CTRL-X_CTRL-D| definitions or macros
|
|i_CTRL-X_CTRL-D| definitions or macros
|
||||||
|i_CTRL-X_CTRL-O| Omni completion: clever completion
|
|i_CTRL-X_CTRL-O| Omni completion: clever completion
|
||||||
specifically for a file type
|
specifically for a file type
|
||||||
|i_CTRL-X_CTRL-R| words from registers
|
|i_CTRL-X_CTRL-R| contents from registers
|
||||||
etc.
|
etc.
|
||||||
|
|
||||||
Long line support. |'wrap'| |'linebreak'|
|
Long line support. |'wrap'| |'linebreak'|
|
||||||
|
@@ -4193,6 +4193,7 @@ static int get_next_default_completion(ins_compl_next_state_T *st, pos_T *start_
|
|||||||
static void get_register_completion(void)
|
static void get_register_completion(void)
|
||||||
{
|
{
|
||||||
Direction dir = compl_direction;
|
Direction dir = compl_direction;
|
||||||
|
bool adding_mode = compl_status_adding();
|
||||||
|
|
||||||
for (int i = 0; i < NUM_REGISTERS; i++) {
|
for (int i = 0; i < NUM_REGISTERS; i++) {
|
||||||
int regname = get_register_name(i);
|
int regname = get_register_name(i);
|
||||||
@@ -4215,17 +4216,45 @@ static void get_register_completion(void)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (adding_mode) {
|
||||||
|
int str_len = (int)strlen(str);
|
||||||
|
if (str_len == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!compl_orig_text.data
|
||||||
|
|| (p_ic ? STRNICMP(str, compl_orig_text.data,
|
||||||
|
compl_orig_text.size) == 0
|
||||||
|
: strncmp(str, compl_orig_text.data,
|
||||||
|
compl_orig_text.size) == 0)) {
|
||||||
|
if (ins_compl_add_infercase(str, str_len, p_ic, NULL, dir, false, 0) == OK) {
|
||||||
|
dir = FORWARD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Calculate the safe end of string to avoid null byte issues
|
||||||
|
char *str_end = str + strlen(str);
|
||||||
char *p = str;
|
char *p = str;
|
||||||
while (*p != NUL) {
|
|
||||||
|
// Safely iterate through the string
|
||||||
|
while (p < str_end && *p != NUL) {
|
||||||
|
char *old_p = p;
|
||||||
p = find_word_start(p);
|
p = find_word_start(p);
|
||||||
if (*p == NUL) {
|
if (p >= str_end || *p == NUL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *word_end = find_word_end(p);
|
char *word_end = find_word_end(p);
|
||||||
int len = (int)(word_end - p);
|
|
||||||
|
|
||||||
// Add the word to the completion list
|
if (word_end <= p) {
|
||||||
|
word_end = p + utfc_ptr2len(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (word_end > str_end) {
|
||||||
|
word_end = str_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int len = (int)(word_end - p);
|
||||||
if (len > 0 && (!compl_orig_text.data
|
if (len > 0 && (!compl_orig_text.data
|
||||||
|| (p_ic ? STRNICMP(p, compl_orig_text.data,
|
|| (p_ic ? STRNICMP(p, compl_orig_text.data,
|
||||||
compl_orig_text.size) == 0
|
compl_orig_text.size) == 0
|
||||||
@@ -4236,7 +4265,13 @@ static void get_register_completion(void)
|
|||||||
dir = FORWARD;
|
dir = FORWARD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p = word_end;
|
p = word_end;
|
||||||
|
|
||||||
|
if (p <= old_p) {
|
||||||
|
p = old_p + utfc_ptr2len(old_p);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5468,7 +5503,7 @@ static int get_spell_compl_info(int startcol, colnr_T curs_col)
|
|||||||
/// @return OK on success.
|
/// @return OK on success.
|
||||||
static int compl_get_info(char *line, int startcol, colnr_T curs_col, bool *line_invalid)
|
static int compl_get_info(char *line, int startcol, colnr_T curs_col, bool *line_invalid)
|
||||||
{
|
{
|
||||||
if (ctrl_x_mode_normal()
|
if (ctrl_x_mode_normal() || ctrl_x_mode_register()
|
||||||
|| ((ctrl_x_mode & CTRL_X_WANT_IDENT)
|
|| ((ctrl_x_mode & CTRL_X_WANT_IDENT)
|
||||||
&& !thesaurus_func_complete(ctrl_x_mode))) {
|
&& !thesaurus_func_complete(ctrl_x_mode))) {
|
||||||
return get_normal_compl_info(line, startcol, curs_col);
|
return get_normal_compl_info(line, startcol, curs_col);
|
||||||
@@ -5489,8 +5524,6 @@ static int compl_get_info(char *line, int startcol, colnr_T curs_col, bool *line
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
*line_invalid = true; // "line" may have become invalid
|
*line_invalid = true; // "line" may have become invalid
|
||||||
} else if (ctrl_x_mode_register()) {
|
|
||||||
return get_normal_compl_info(line, startcol, curs_col);
|
|
||||||
} else {
|
} else {
|
||||||
internal_error("ins_complete()");
|
internal_error("ins_complete()");
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@@ -5546,7 +5579,7 @@ static void ins_compl_continue_search(char *line)
|
|||||||
if (compl_length < 1) {
|
if (compl_length < 1) {
|
||||||
compl_cont_status &= CONT_LOCAL;
|
compl_cont_status &= CONT_LOCAL;
|
||||||
}
|
}
|
||||||
} else if (ctrl_x_mode_line_or_eval()) {
|
} else if (ctrl_x_mode_line_or_eval() || ctrl_x_mode_register()) {
|
||||||
compl_cont_status = CONT_ADDING | CONT_N_ADDS;
|
compl_cont_status = CONT_ADDING | CONT_N_ADDS;
|
||||||
} else {
|
} else {
|
||||||
compl_cont_status = 0;
|
compl_cont_status = 0;
|
||||||
|
@@ -4751,6 +4751,27 @@ func Test_register_completion()
|
|||||||
call feedkeys("Sze\<C-X>\<C-R>\<C-R>=string(complete_info(['mode']))\<CR>\<ESC>", "tx")
|
call feedkeys("Sze\<C-X>\<C-R>\<C-R>=string(complete_info(['mode']))\<CR>\<ESC>", "tx")
|
||||||
call assert_equal("zero{'mode': 'register'}", getline(1))
|
call assert_equal("zero{'mode': 'register'}", getline(1))
|
||||||
|
|
||||||
|
" Test consecutive CTRL-X CTRL-R (adding mode)
|
||||||
|
" First CTRL-X CTRL-R should split into words, second should use full content
|
||||||
|
let @f = "hello world test complete"
|
||||||
|
call setline(1, "hel")
|
||||||
|
call cursor(1, 3)
|
||||||
|
call feedkeys("a\<C-X>\<C-R>\<C-N>\<Esc>", 'tx')
|
||||||
|
call assert_equal("hello", getline(1))
|
||||||
|
|
||||||
|
" Second consecutive CTRL-X CTRL-R should complete with full content
|
||||||
|
call setline(1, "hello")
|
||||||
|
call cursor(1, 5)
|
||||||
|
call feedkeys("a\<C-X>\<C-R>\<C-X>\<C-R>\<Esc>", 'tx')
|
||||||
|
call assert_equal("hello world test complete", getline(1))
|
||||||
|
|
||||||
|
" Test consecutive completion with multi-line register
|
||||||
|
let @g = "first line content\nsecond line here\nthird line data"
|
||||||
|
call setline(1, "first")
|
||||||
|
call cursor(1, 5)
|
||||||
|
call feedkeys("a\<C-X>\<C-R>\<C-X>\<C-R>\<Esc>", 'tx')
|
||||||
|
call assert_equal("first line content", getline(1))
|
||||||
|
|
||||||
" Clean up
|
" Clean up
|
||||||
bwipe!
|
bwipe!
|
||||||
delfunc GetItems
|
delfunc GetItems
|
||||||
|
Reference in New Issue
Block a user