mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 18:55:14 -07:00
feat(complete): support f flag for complete buffer part
This commit is contained in:
parent
195301c609
commit
ae4ca4edf8
@ -195,6 +195,8 @@ The following new APIs and features were added.
|
|||||||
|
|
||||||
• Added |vim.snippet| for snippet expansion support.
|
• Added |vim.snippet| for snippet expansion support.
|
||||||
|
|
||||||
|
• 'complete' option supports "f" flag for completing buffer names.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
CHANGED FEATURES *news-changed*
|
CHANGED FEATURES *news-changed*
|
||||||
|
|
||||||
|
@ -1458,6 +1458,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
|i_CTRL-X_CTRL-D|
|
|i_CTRL-X_CTRL-D|
|
||||||
] tag completion
|
] tag completion
|
||||||
t same as "]"
|
t same as "]"
|
||||||
|
f scan the buffer names (as opposed to buffer contents)
|
||||||
|
|
||||||
Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
|
Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
|
||||||
not executed, this may lead to unexpected completions from some files
|
not executed, this may lead to unexpected completions from some files
|
||||||
|
1
runtime/lua/vim/_meta/options.lua
generated
1
runtime/lua/vim/_meta/options.lua
generated
@ -998,6 +998,7 @@ vim.bo.cms = vim.bo.commentstring
|
|||||||
--- `i_CTRL-X_CTRL-D`
|
--- `i_CTRL-X_CTRL-D`
|
||||||
--- ] tag completion
|
--- ] tag completion
|
||||||
--- t same as "]"
|
--- t same as "]"
|
||||||
|
--- f scan the buffer names (as opposed to buffer contents)
|
||||||
---
|
---
|
||||||
--- Unloaded buffers are not loaded, thus their autocmds `:autocmd` are
|
--- Unloaded buffers are not loaded, thus their autocmds `:autocmd` are
|
||||||
--- not executed, this may lead to unexpected completions from some files
|
--- not executed, this may lead to unexpected completions from some files
|
||||||
|
@ -91,6 +91,7 @@ enum {
|
|||||||
CTRL_X_LOCAL_MSG = 15, ///< only used in "ctrl_x_msgs"
|
CTRL_X_LOCAL_MSG = 15, ///< only used in "ctrl_x_msgs"
|
||||||
CTRL_X_EVAL = 16, ///< for builtin function complete()
|
CTRL_X_EVAL = 16, ///< for builtin function complete()
|
||||||
CTRL_X_CMDLINE_CTRL_X = 17, ///< CTRL-X typed in CTRL_X_CMDLINE
|
CTRL_X_CMDLINE_CTRL_X = 17, ///< CTRL-X typed in CTRL_X_CMDLINE
|
||||||
|
CTRL_X_BUFNAMES = 18,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
|
#define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
|
||||||
@ -536,6 +537,8 @@ bool vim_is_ctrl_x_key(int c)
|
|||||||
return c == Ctrl_S || c == Ctrl_P || c == Ctrl_N;
|
return c == Ctrl_S || c == Ctrl_P || c == Ctrl_N;
|
||||||
case CTRL_X_EVAL:
|
case CTRL_X_EVAL:
|
||||||
return (c == Ctrl_P || c == Ctrl_N);
|
return (c == Ctrl_P || c == Ctrl_N);
|
||||||
|
case CTRL_X_BUFNAMES:
|
||||||
|
return (c == Ctrl_P || c == Ctrl_N);
|
||||||
}
|
}
|
||||||
internal_error("vim_is_ctrl_x_key()");
|
internal_error("vim_is_ctrl_x_key()");
|
||||||
return false;
|
return false;
|
||||||
@ -2917,6 +2920,8 @@ static int process_next_cpt_value(ins_compl_next_state_T *st, int *compl_type_ar
|
|||||||
compl_type = CTRL_X_PATH_PATTERNS;
|
compl_type = CTRL_X_PATH_PATTERNS;
|
||||||
} else if (*st->e_cpt == 'd') {
|
} else if (*st->e_cpt == 'd') {
|
||||||
compl_type = CTRL_X_PATH_DEFINES;
|
compl_type = CTRL_X_PATH_DEFINES;
|
||||||
|
} else if (*st->e_cpt == 'f') {
|
||||||
|
compl_type = CTRL_X_BUFNAMES;
|
||||||
} else if (*st->e_cpt == ']' || *st->e_cpt == 't') {
|
} else if (*st->e_cpt == ']' || *st->e_cpt == 't') {
|
||||||
compl_type = CTRL_X_TAGS;
|
compl_type = CTRL_X_TAGS;
|
||||||
if (!shortmess(SHM_COMPLETIONSCAN)) {
|
if (!shortmess(SHM_COMPLETIONSCAN)) {
|
||||||
@ -3274,6 +3279,9 @@ static bool get_next_completion_match(int type, ins_compl_next_state_T *st, pos_
|
|||||||
case CTRL_X_SPELL:
|
case CTRL_X_SPELL:
|
||||||
get_next_spell_completion(st->first_match_pos.lnum);
|
get_next_spell_completion(st->first_match_pos.lnum);
|
||||||
break;
|
break;
|
||||||
|
case CTRL_X_BUFNAMES:
|
||||||
|
get_next_bufname_token();
|
||||||
|
break;
|
||||||
|
|
||||||
default: // normal ^P/^N and ^X^L
|
default: // normal ^P/^N and ^X^L
|
||||||
found_new_match = get_next_default_completion(st, ini);
|
found_new_match = get_next_default_completion(st, ini);
|
||||||
@ -3291,6 +3299,33 @@ static bool get_next_completion_match(int type, ins_compl_next_state_T *st, pos_
|
|||||||
return found_new_match;
|
return found_new_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_next_bufname_token(void)
|
||||||
|
{
|
||||||
|
FOR_ALL_BUFFERS(b) {
|
||||||
|
if (b->b_p_bl) {
|
||||||
|
char *start = get_past_head(b->b_sfname);
|
||||||
|
char *current = start;
|
||||||
|
char *p = (char *)path_next_component(start);
|
||||||
|
while (true) {
|
||||||
|
int len = (int)(p - current) - (*p == NUL ? 0 : 1);
|
||||||
|
// treat . as a separator, unless it is the first char in a filename
|
||||||
|
char *dot = strchr(current, '.');
|
||||||
|
if (dot && *p == NUL && *current != '.') {
|
||||||
|
len = (int)(dot - current);
|
||||||
|
p = dot + 1;
|
||||||
|
}
|
||||||
|
ins_compl_add(current, len, NULL, NULL, false, NULL, 0,
|
||||||
|
p_ic ? CP_ICASE : 0, false);
|
||||||
|
if (*p == NUL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
current = p;
|
||||||
|
p = (char *)path_next_component(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the next expansion(s), using "compl_pattern".
|
/// Get the next expansion(s), using "compl_pattern".
|
||||||
/// The search starts at position "ini" in curbuf and in the direction
|
/// The search starts at position "ini" in curbuf and in the direction
|
||||||
/// compl_direction.
|
/// compl_direction.
|
||||||
|
@ -1370,6 +1370,7 @@ return {
|
|||||||
|i_CTRL-X_CTRL-D|
|
|i_CTRL-X_CTRL-D|
|
||||||
] tag completion
|
] tag completion
|
||||||
t same as "]"
|
t same as "]"
|
||||||
|
f scan the buffer names (as opposed to buffer contents)
|
||||||
|
|
||||||
Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
|
Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
|
||||||
not executed, this may lead to unexpected completions from some files
|
not executed, this may lead to unexpected completions from some files
|
||||||
|
@ -1171,7 +1171,7 @@ const char *did_set_complete(optset_T *args)
|
|||||||
if (!*s) {
|
if (!*s) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (vim_strchr(".wbuksid]tU", (uint8_t)(*s)) == NULL) {
|
if (vim_strchr(".wbuksid]tUf", (uint8_t)(*s)) == NULL) {
|
||||||
return illegal_char(args->os_errbuf, args->os_errbuflen, (uint8_t)(*s));
|
return illegal_char(args->os_errbuf, args->os_errbuflen, (uint8_t)(*s));
|
||||||
}
|
}
|
||||||
if (*++s != NUL && *s != ',' && *s != ' ') {
|
if (*++s != NUL && *s != ',' && *s != ' ') {
|
||||||
@ -1200,7 +1200,7 @@ const char *did_set_complete(optset_T *args)
|
|||||||
int expand_set_complete(optexpand_T *args, int *numMatches, char ***matches)
|
int expand_set_complete(optexpand_T *args, int *numMatches, char ***matches)
|
||||||
{
|
{
|
||||||
static char *(p_cpt_values[]) = {
|
static char *(p_cpt_values[]) = {
|
||||||
".", "w", "b", "u", "k", "kspell", "s", "i", "d", "]", "t", "U", NULL
|
".", "w", "b", "u", "k", "kspell", "s", "i", "d", "]", "t", "U", "f", NULL
|
||||||
};
|
};
|
||||||
return expand_set_opt_string(args,
|
return expand_set_opt_string(args,
|
||||||
p_cpt_values,
|
p_cpt_values,
|
||||||
|
@ -1228,4 +1228,28 @@ describe('completion', function()
|
|||||||
expect('colorscheme NOSUCHCOLORSCHEME')
|
expect('colorscheme NOSUCHCOLORSCHEME')
|
||||||
assert_alive()
|
assert_alive()
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('complete with f flag #25598', function()
|
||||||
|
screen:try_resize(20, 9)
|
||||||
|
local bufname = 'foo/bar.txt'
|
||||||
|
local hidden = 'fooA/.hidden'
|
||||||
|
if helpers.is_os('win') then
|
||||||
|
bufname = 'C:\\foo\\bar.txt'
|
||||||
|
hidden = 'C:\\fooA\\.hidden'
|
||||||
|
end
|
||||||
|
command('set complete+=f | edit '.. bufname ..' | edit '..hidden)
|
||||||
|
feed('i<C-n>')
|
||||||
|
|
||||||
|
screen:expect{grid=[[
|
||||||
|
foo^ |
|
||||||
|
{2:foo }{0: }|
|
||||||
|
{1:bar }{0: }|
|
||||||
|
{1:txt }{0: }|
|
||||||
|
{1:fooA }{0: }|
|
||||||
|
{1:.hidden }{0: }|
|
||||||
|
{0:~ }|
|
||||||
|
{0:~ }|
|
||||||
|
{3:-- }{4:match 1 of 5} |
|
||||||
|
]]}
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user