]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0741: No way to get prompt for input()/confirm() v9.1.0741
authorShougo Matsushita <Shougo.Matsu@gmail.com>
Mon, 23 Sep 2024 18:34:47 +0000 (20:34 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 23 Sep 2024 18:34:47 +0000 (20:34 +0200)
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>
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

index af918d1a95955bb004836054fcbcd89a9c7403d2..fe0b9aa335a215aac154cfdb9a3012157394a3e0 100644 (file)
@@ -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 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
+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,12 +4006,23 @@ 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()|.
+               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()*
                Return the screen position of the cursor in the command line
                as a byte count.  The first column is 1.
index dd5a0a689463f0441ecfee702fb469cd2cfdeca0..fb6adf80210ccdec03b00377cfa787c72b84466e 100644 (file)
@@ -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()*
index 765eab50409fcd2a736831d79392b281caef6190..27df85ac76d6c4cd331796f16887e23f60d0917f 100644 (file)
@@ -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
index 9d225211fcf2d786e1d46621c2d6f818ffe03cd1..94e662d6d7bc05671d74f23dd9cc22ff50e30575 100644 (file)
@@ -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,
index 173b544b3219c2c799d4727a2218141826b66f06..7c096a261e60837a0e13b254bcb6c67c430d4f9c 100644 (file)
@@ -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, typval_T *rettv UNUSED)
     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);
index b4c7941013436f0f2921935449183870b3ccf6a6..61f8379df559e563247fd3dae8a98fb915625c5e 100644 (file)
@@ -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);
@@ -4231,6 +4235,24 @@ f_getcmdline(typval_T *argvars UNUSED, typval_T *rettv)
     rettv->vval.v_string = get_cmdline_str();
 }
 
+/*
+ * 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
  */
@@ -4242,6 +4264,17 @@ f_getcmdpos(typval_T *argvars UNUSED, typval_T *rettv)
     rettv->vval.v_number = p != NULL ? p->cmdpos + 1 : 0;
 }
 
+/*
+ * "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
  */
@@ -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');
index 956916dc54e1d9530c59790f6ecbd105ba1f83a4..8cf75b7d3663f040e4a2bf5349603b9739f3fede 100644 (file)
@@ -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);
index 3f6918a8cd848e29233792f259f80af81d7ee856..17717d2ab8409adc2a6240373df839b92bcdd857 100644 (file)
@@ -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()
index 4669e37def03a9c37dbe8424b6b6a98e3c34b56c..72e443aa00ed88420f1912cdfa9480d19524230a 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    741,
 /**/
     740,
 /**/