Mercurial > vim
changeset 36185:9a68d0ac2749 v9.1.0741
patch 9.1.0741: No way to get prompt for input()/confirm()
Commit: https://github.com/vim/vim/commit/6908428560a0d6ae27bf7af6fcb6dc362e31926c
Author: Shougo Matsushita <Shougo.Matsu@gmail.com>
Date: Mon Sep 23 20:34:47 2024 +0200
patch 9.1.0741: No way to get prompt for input()/confirm()
Problem: No way to get prompt for input()/confirm()
Solution: add getcmdprompt() function (Shougo Matsushita)
(Shougo Matsushita)
closes: #15667
Signed-off-by: Shougo Matsushita <Shougo.Matsu@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 23 Sep 2024 20:45:05 +0200 |
parents | 6aa0834a85e9 |
children | 631e068e17a9 |
files | runtime/doc/builtin.txt runtime/doc/tags runtime/doc/usr_41.txt runtime/doc/version9.txt src/evalfunc.c src/ex_getln.c src/proto/ex_getln.pro src/testdir/test_cmdline.vim src/version.c |
diffstat | 9 files changed, 88 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2024 Sep 10 +*builtin.txt* For Vim version 9.1. Last change: 2024 Sep 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -232,8 +232,9 @@ getcharsearch() Dict last character se 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 +getcmdline() String return the current command-line input getcmdpos() Number return cursor position in command-line +getcmdprompt() String return the current command-line prompt getcmdscreenpos() Number return cursor screen position in command-line getcmdtype() String return current command-line type @@ -3978,21 +3979,21 @@ getcmdcompltype() *getcmdcompltype() 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()|, |getcmdline()| and - |setcmdline()|. + Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()|, + |getcmdprompt()| and |setcmdline()|. Returns an empty string when completion is not defined. Return type: |String| getcmdline() *getcmdline()* - Return the current command-line. Only works when the command - line is being edited, thus requires use of |c_CTRL-\_e| or - |c_CTRL-R_=|. + Return the current command-line input. Only works when the + command line is being edited, thus requires use of + |c_CTRL-\_e| or |c_CTRL-R_=|. Example: > :cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR> -< Also see |getcmdtype()|, |getcmdpos()|, |setcmdpos()| and - |setcmdline()|. +< Also see |getcmdtype()|, |getcmdpos()|, |setcmdpos()|, + |getcmdprompt()| and |setcmdline()|. Returns an empty string when entering a password or using |inputsecret()|. @@ -4005,10 +4006,21 @@ getcmdpos() *getcmdpos()* 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 |getcmdtype()|, |setcmdpos()|, |getcmdline()| and - |setcmdline()|. - - Return type: |Number| + Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()|, + |getcmdprompt()| and |setcmdline()|. + + Return type: |Number| + + +getcmdprompt() *getcmdprompt()* + Return the current command-line prompt when using functions + like |input()| or |confirm()|. + Only works when the command line is being edited, thus + requires use of |c_CTRL-\_e| or |c_CTRL-R_=|. + Also see |getcmdtype()|, |getcmdline()|, |getcmdpos()|, + |setcmdpos()| and |setcmdline()|. + + Return type: |String| getcmdscreenpos() *getcmdscreenpos()*
--- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -7827,6 +7827,7 @@ getcharstr() builtin.txt /*getcharstr()* getcmdcompltype() builtin.txt /*getcmdcompltype()* getcmdline() builtin.txt /*getcmdline()* getcmdpos() builtin.txt /*getcmdpos()* +getcmdprompt() builtin.txt /*getcmdprompt()* getcmdscreenpos() builtin.txt /*getcmdscreenpos()* getcmdtype() builtin.txt /*getcmdtype()* getcmdwintype() builtin.txt /*getcmdwintype()*
--- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -1,4 +1,4 @@ -*usr_41.txt* For Vim version 9.1. Last change: 2024 Jun 09 +*usr_41.txt* For Vim version 9.1. Last change: 2024 Sep 23 VIM USER MANUAL - by Bram Moolenaar @@ -1070,7 +1070,8 @@ Buffers, windows and the argument list: Command line: *command-line-functions* getcmdcompltype() get the type of the current command line completion - getcmdline() get the current command line + getcmdline() get the current command line input + getcmdprompt() get the current command line prompt getcmdpos() get position of the cursor in the command line getcmdscreenpos() get screen position of the cursor in the command line
--- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -41608,6 +41608,7 @@ Functions: ~ |diff()| diff two Lists of strings |filecopy()| copy a file {from} to {to} |foreach()| apply function to List items +|getcmdprompt()| get prompt for input()/confirm() |getregion()| get a region of text from a buffer |getregionpos()| get a list of positions for a region |id()| get unique identifier for a Dict, List, Object,
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2097,6 +2097,8 @@ static funcentry_T global_functions[] = ret_string, f_getcmdline}, {"getcmdpos", 0, 0, 0, NULL, ret_number, f_getcmdpos}, + {"getcmdprompt", 0, 0, 0, NULL, + ret_string, f_getcmdprompt}, {"getcmdscreenpos", 0, 0, 0, NULL, ret_number, f_getcmdscreenpos}, {"getcmdtype", 0, 0, 0, NULL, @@ -3778,6 +3780,8 @@ f_confirm(typval_T *argvars UNUSED, typv message = tv_get_string_chk(&argvars[0]); if (message == NULL) error = TRUE; + else + set_prompt(message); if (argvars[1].v_type != VAR_UNKNOWN) { buttons = tv_get_string_buf_chk(&argvars[1], buf);
--- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -30,6 +30,7 @@ static cmdline_info_T ccline; #ifdef FEAT_EVAL static int new_cmdpos; // position set by set_cmdline_pos() +static char_u current_prompt[CMDBUFFSIZE + 1] = ""; #endif static int extra_char = NUL; // extra character to display when redrawing @@ -49,6 +50,9 @@ static void alloc_cmdbuff(int len); static void draw_cmdline(int start, int len); static void save_cmdline(cmdline_info_T *ccp); static void restore_cmdline(cmdline_info_T *ccp); +#ifdef FEAT_EVAL +static char_u *get_prompt(void); +#endif static int cmdline_paste(int regname, int literally, int remcr); static void redrawcmdprompt(void); static int ccheck_abbr(int); @@ -4232,6 +4236,24 @@ f_getcmdline(typval_T *argvars UNUSED, t } /* + * Get current command line prompt. + */ + static char_u * +get_prompt(void) +{ + return current_prompt; +} + +/* + * Set current command line prompt. + */ + void +set_prompt(char_u* str) +{ + vim_strncpy(current_prompt, str, sizeof(current_prompt) - 1); +} + +/* * "getcmdpos()" function */ void @@ -4243,6 +4265,17 @@ f_getcmdpos(typval_T *argvars UNUSED, ty } /* + * "getcmdprompt()" function + */ + void +f_getcmdprompt(typval_T *argvars UNUSED, typval_T *rettv) +{ + cmdline_info_T *p = get_ccline_ptr(); + rettv->v_type = VAR_STRING; + rettv->vval.v_string = p != NULL ? vim_strsave(get_prompt()) : NULL; +} + +/* * "getcmdscreenpos()" function */ void @@ -4865,6 +4898,8 @@ get_user_input( cmd_silent = FALSE; // Want to see the prompt. if (prompt != NULL) { + set_prompt(prompt); + // Only the part of the message after the last NL is considered as // prompt for the command line p = vim_strrchr(prompt, '\n');
--- a/src/proto/ex_getln.pro +++ b/src/proto/ex_getln.pro @@ -33,12 +33,14 @@ cmdline_info_T *get_cmdline_info(void); void f_getcmdcompltype(typval_T *argvars, typval_T *rettv); void f_getcmdline(typval_T *argvars, typval_T *rettv); void f_getcmdpos(typval_T *argvars, typval_T *rettv); +void f_getcmdprompt(typval_T *argvars, typval_T *rettv); void f_getcmdscreenpos(typval_T *argvars, typval_T *rettv); void f_getcmdtype(typval_T *argvars, typval_T *rettv); void f_setcmdline(typval_T *argvars, typval_T *rettv); void f_setcmdpos(typval_T *argvars, typval_T *rettv); int get_cmdline_firstc(void); int get_list_range(char_u **str, int *num1, int *num2); +void set_prompt(char_u* str); char *did_set_cedit(optset_T *args); int is_in_cmdwin(void); char_u *script_get(exarg_T *eap, char_u *cmd);
--- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -1617,7 +1617,7 @@ endfunc set cpo& -func Test_getcmdtype() +func Test_getcmdtype_getcmdprompt() call feedkeys(":MyCmd a\<C-R>=Check_cmdline(':')\<CR>\<Esc>", "xt") let cmdtype = '' @@ -1641,6 +1641,20 @@ func Test_getcmdtype() cunmap <F6> call assert_equal('', getcmdline()) + + call assert_equal('', getcmdprompt()) + augroup test_CmdlineEnter + autocmd! + autocmd CmdlineEnter * let g:cmdprompt=getcmdprompt() + augroup END + call feedkeys(":call input('Answer?')\<CR>a\<CR>\<ESC>", "xt") + call assert_equal('Answer?', g:cmdprompt) + call assert_equal('', getcmdprompt()) + + augroup test_CmdlineEnter + au! + augroup END + augroup! test_CmdlineEnter endfunc func Test_verbosefile()