feat: cmdline funcs (#18284)

vim-patch:8.2.4903: cannot get the current cmdline completion type and position

Problem:    Cannot get the current cmdline completion type and position.
Solution:   Add getcmdcompltype() and getcmdscreenpos(). (Shougo Matsushita,
            closes vim/vim#10344)
79d599b877

vim-patch:8.2.4910: imperfect coding

Problem:    Imperfect coding.
Solution:   Make code nicer.
9ff7d717aa
This commit is contained in:
Shougo 2022-05-09 13:52:31 +09:00 committed by GitHub
parent f6be28c61a
commit dbdd58e548
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 82 additions and 1 deletions

View File

@ -179,8 +179,12 @@ getcharmod() Number modifiers for the last typed character
getcharpos({expr}) List position of cursor, mark, etc.
getcharsearch() Dict last character search
getcharstr([expr]) String get one character from the user
getcmdcompltype() String return the type of the current
command-line completion
getcmdline() String return the current command-line
getcmdpos() Number return cursor position in command-line
getcmdscreenpos() Number return cursor screen position in
command-line
getcmdtype() String return current command-line type
getcmdwintype() String return current command-line window type
getcompletion({pat}, {type} [, {filtered}])
@ -2792,6 +2796,13 @@ getcharstr([expr]) *getcharstr()*
Otherwise this works like |getchar()|, except that a number
result is converted to a string.
getcmdcompltype() *getcmdcompltype()*
Return the type of the current command-line completion.
Only works when the command line is being edited, thus
requires use of |c_CTRL-\_e| or |c_CTRL-R_=|.
See |command-completion| for the return string.
Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|.
Returns an empty string when completion is not defined.
getcmdline() *getcmdline()*
Return the current command-line. Only works when the command
@ -2811,6 +2822,15 @@ getcmdpos() *getcmdpos()*
Returns 0 otherwise.
Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|.
getcmdscreenpos() *getcmdscreenpos()*
Return the screen position of the cursor in the command line
as a byte count. The first column is 1.
Instead of |getcmdpos()|, it adds the prompt position.
Only works when editing the command line, thus requires use of
|c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
Returns 0 otherwise.
Also see |getcmdpos()|, |setcmdpos()|.
getcmdtype() *getcmdtype()*
Return the current command-line type. Possible return values
are:

View File

@ -855,8 +855,12 @@ Buffers, windows and the argument list:
swapname() get the swap file path of a buffer
Command line: *command-line-functions*
getcmdcompltype() get the type of the current command line
completion
getcmdline() get the current command line
getcmdpos() get position of the cursor in the command line
getcmdscreenpos() get screen position of the cursor in the
command line
setcmdpos() set position of the cursor in the command line
getcmdtype() return the current command-line type
getcmdwintype() return the current command-line window type

View File

@ -152,8 +152,10 @@ return {
getcharpos={args=1, base=1},
getcharsearch={},
getcharstr={args={0, 1}},
getcmdcompltype={},
getcmdline={},
getcmdpos={},
getcmdscreenpos={},
getcmdtype={},
getcmdwintype={},
getcompletion={args={2, 3}, base=1},

View File

@ -3175,6 +3175,13 @@ static void f_getcharsearch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
tv_dict_add_nr(dict, S_LEN("until"), last_csearch_until());
}
/// "getcmdcompltype()" function
static void f_getcmdcompltype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->v_type = VAR_STRING;
rettv->vval.v_string = (char *)get_cmdline_completion();
}
/// "getcmdline()" function
static void f_getcmdline(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
@ -3188,6 +3195,12 @@ static void f_getcmdpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = get_cmdline_pos() + 1;
}
/// "getcmdscreenpos()" function
static void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
rettv->vval.v_number = get_cmdline_screen_pos() + 1;
}
/// "getcmdtype()" function
static void f_getcmdtype(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{

View File

@ -4683,7 +4683,7 @@ char_u *addstar(char_u *fname, size_t len, int context)
* EXPAND_ENV_VARS Complete environment variable names
* EXPAND_USER Complete user names
*/
static void set_expand_context(expand_T *xp)
void set_expand_context(expand_T *xp)
{
// only expansion for ':', '>' and '=' command-lines
if (ccline.cmdfirstc != ':'
@ -5949,6 +5949,25 @@ static struct cmdline_info *get_ccline_ptr(void)
}
}
/// Get the current command-line completion type.
char_u *get_cmdline_completion(void)
{
if (cmdline_star > 0) {
return NULL;
}
struct cmdline_info *p = get_ccline_ptr();
if (p != NULL && p->xpc != NULL) {
set_expand_context(p->xpc);
char_u *cmd_compl = get_user_cmd_complete(p->xpc, p->xpc->xp_context);
if (cmd_compl != NULL) {
return vim_strsave(cmd_compl);
}
}
return NULL;
}
/*
* Get the current command line in allocated memory.
* Only works when the command line is being edited.
@ -5983,6 +6002,17 @@ int get_cmdline_pos(void)
return p->cmdpos;
}
/// Get the command line cursor screen position.
int get_cmdline_screen_pos(void)
{
struct cmdline_info *p = get_ccline_ptr();
if (p == NULL) {
return -1;
}
return p->cmdspos;
}
/*
* Set the command line byte position to "pos". Zero is the first position.
* Only works when the command line is being edited.

View File

@ -1212,4 +1212,16 @@ func Test_recalling_cmdline()
cunmap <Plug>(save-cmdline)
endfunc
func Check_completion()
call assert_equal('let a', getcmdline())
call assert_equal(6, getcmdpos())
call assert_equal(7, getcmdscreenpos())
call assert_equal('var', getcmdcompltype())
return ''
endfunc
func Test_screenpos_and_completion()
call feedkeys(":let a\<C-R>=Check_completion()\<CR>\<Esc>", "xt")
endfunc
" vim: shiftwidth=2 sts=2 expandtab