Patch 8.1.0069
Problem:    Cannot handle pressing CTRL-C in a prompt buffer.
Solution:   Add prompt_setinterrupt().
Files:      runtime/doc/eval.txt, src/edit.c, src/evalfunc.c, src/channel.c,
            src/proto/channel.pro


*** ../vim-8.1.0068/runtime/doc/eval.txt        2018-06-07 18:17:42.274227515 
+0200
--- runtime/doc/eval.txt        2018-06-17 18:12:12.760548966 +0200
***************
*** 2297,2304 ****
  prevnonblank({lnum})          Number  line nr of non-blank line <= {lnum}
  printf({fmt}, {expr1}...)     String  format text
  prompt_addtext({buf}, {expr}) none    add text to a prompt buffer
- prompt_setprompt({buf}, {text}) none  set prompt text
  prompt_setcallback({buf}, {expr}) none        set prompt callback function
  pumvisible()                  Number  whether popup menu is visible
  pyeval({expr})                        any     evaluate |Python| expression
  py3eval({expr})                       any     evaluate |python3| expression
--- 2297,2305 ----
  prevnonblank({lnum})          Number  line nr of non-blank line <= {lnum}
  printf({fmt}, {expr1}...)     String  format text
  prompt_addtext({buf}, {expr}) none    add text to a prompt buffer
  prompt_setcallback({buf}, {expr}) none        set prompt callback function
+ prompt_setinterrupt({buf}, {text}) none       set prompt interrupt function
+ prompt_setprompt({buf}, {text}) none  set prompt text
  pumvisible()                  Number  whether popup menu is visible
  pyeval({expr})                        any     evaluate |Python| expression
  py3eval({expr})                       any     evaluate |python3| expression
***************
*** 6506,6522 ****
                arguments an error is given.  Up to 18 arguments can be used.
  
  
- prompt_setprompt({buf}, {text})                               
*prompt_setprompt()*
-               Set prompt for buffer {buf} to {text}.  You most likely want
-               {text} to end in a space.
-               The result is only visible if {buf} has 'buftype' set to
-               "prompt".  Example: >
-                       call prompt_setprompt(bufnr(''), 'command: ')
- 
- 
  prompt_setcallback({buf}, {expr})                     *prompt_setcallback()*
!               Set prompt callback for buffer {buf} to {expr}.  This has only
                effect if {buf} has 'buftype' set to "prompt".
                The callback is invoked when pressing Enter.  The current
                buffer will always be the prompt buffer.  A new line for a
                prompt is added before invoking the callback, thus the prompt
--- 6507,6517 ----
                arguments an error is given.  Up to 18 arguments can be used.
  
  
  prompt_setcallback({buf}, {expr})                     *prompt_setcallback()*
!               Set prompt callback for buffer {buf} to {expr}.  When {expr}
!               is an empty string the callback is removed.  This has only
                effect if {buf} has 'buftype' set to "prompt".
+ 
                The callback is invoked when pressing Enter.  The current
                buffer will always be the prompt buffer.  A new line for a
                prompt is added before invoking the callback, thus the prompt
***************
*** 6541,6546 ****
--- 6536,6557 ----
                     endif
                   endfunc
  
+ prompt_setinterrupt({buf}, {expr})                    *prompt_setinterrupt()*
+               Set a callback for buffer {buf} to {expr}.  When {expr} is an
+               empty string the callback is removed.  This has only effect if
+               {buf} has 'buftype' set to "prompt".
+ 
+               This callback will be invoked when pressing CTRL-C in Insert
+               mode.  Without setting a callback Vim will exit Insert mode,
+               as in any buffer.
+ 
+ prompt_setprompt({buf}, {text})                               
*prompt_setprompt()*
+               Set prompt for buffer {buf} to {text}.  You most likely want
+               {text} to end in a space.
+               The result is only visible if {buf} has 'buftype' set to
+               "prompt".  Example: >
+                       call prompt_setprompt(bufnr(''), 'command: ')
+ 
  
  pumvisible()                                          *pumvisible()*
                Returns non-zero when the popup menu is visible, zero
***************
*** 8563,8569 ****
                                     instead of using 'termwinsize'
                   "term_cols"       horizontal size to use for the terminal,
                                     instead of using 'termwinsize'
!                  "vertical"        split the window vertically
                   "curwin"          use the current window, do not split the
                                     window; fails if the current buffer
                                     cannot be |abandon|ed
--- 8574,8582 ----
                                     instead of using 'termwinsize'
                   "term_cols"       horizontal size to use for the terminal,
                                     instead of using 'termwinsize'
!                  "vertical"        split the window vertically; note that
!                                    other window position can be defined with
!                                    command modifiers, such as |:belowright|.
                   "curwin"          use the current window, do not split the
                                     window; fails if the current buffer
                                     cannot be |abandon|ed
***************
*** 9392,9402 ****
                        out if it works in the current console).
  wildignore            Compiled with 'wildignore' option.
  wildmenu              Compiled with 'wildmenu' option.
  win32                 Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
  win32unix             Win32 version of Vim, using Unix files (Cygwin)
  win64                 Win64 version of Vim (MS-Windows 64 bit).
! win95                 Win32 version for MS-Windows 95/98/ME.
  winaltkeys            Compiled with 'winaltkeys' option.
  windows                       Compiled with support for more than one window.
  writebackup           Compiled with 'writebackup' default on.
--- 9405,9416 ----
                        out if it works in the current console).
  wildignore            Compiled with 'wildignore' option.
  wildmenu              Compiled with 'wildmenu' option.
+ win16                 old version for MS-Windows 3.1 (always False)
  win32                 Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
  win32unix             Win32 version of Vim, using Unix files (Cygwin)
  win64                 Win64 version of Vim (MS-Windows 64 bit).
! win95                 Win32 version for MS-Windows 95/98/ME (always False)
  winaltkeys            Compiled with 'winaltkeys' option.
  windows                       Compiled with support for more than one window.
  writebackup           Compiled with 'writebackup' default on.
*** ../vim-8.1.0068/src/edit.c  2018-06-17 16:23:29.337140663 +0200
--- src/edit.c  2018-06-17 19:32:54.656479224 +0200
***************
*** 1016,1021 ****
--- 1016,1034 ----
                goto doESCkey;
            }
  #endif
+ #ifdef FEAT_JOB_CHANNEL
+           if (c == Ctrl_C && bt_prompt(curbuf))
+           {
+               if (invoke_prompt_interrupt())
+               {
+                   if (!bt_prompt(curbuf))
+                       // buffer changed to a non-prompt buffer, get out of
+                       // Insert mode
+                       goto doESCkey;
+                   break;
+               }
+           }
+ #endif
  
  #ifdef UNIX
  do_intr:
*** ../vim-8.1.0068/src/evalfunc.c      2018-06-17 19:22:48.343603795 +0200
--- src/evalfunc.c      2018-06-17 19:16:21.949606435 +0200
***************
*** 298,303 ****
--- 298,304 ----
  static void f_printf(typval_T *argvars, typval_T *rettv);
  #ifdef FEAT_JOB_CHANNEL
  static void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
+ static void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
  static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
  #endif
  static void f_pumvisible(typval_T *argvars, typval_T *rettv);
***************
*** 754,759 ****
--- 755,761 ----
      {"printf",                1, 19, f_printf},
  #ifdef FEAT_JOB_CHANNEL
      {"prompt_setcallback", 2, 2, f_prompt_setcallback},
+     {"prompt_setinterrupt", 2, 2, f_prompt_setinterrupt},
      {"prompt_setprompt", 2, 2, f_prompt_setprompt},
  #endif
      {"pumvisible",    0, 0, f_pumvisible},
***************
*** 8622,8627 ****
--- 8624,8658 ----
  }
  
  /*
+  * "prompt_setinterrupt({buffer}, {callback})" function
+  */
+     static void
+ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
+ {
+     buf_T     *buf;
+     char_u    *callback;
+     partial_T *partial;
+ 
+     if (check_secure())
+       return;
+     buf = get_buf_tv(&argvars[0], FALSE);
+     if (buf == NULL)
+       return;
+ 
+     callback = get_callback(&argvars[1], &partial);
+     if (callback == NULL)
+       return;
+ 
+     free_callback(buf->b_prompt_interrupt, buf->b_prompt_int_partial);
+     if (partial == NULL)
+       buf->b_prompt_interrupt = vim_strsave(callback);
+     else
+       /* pointer into the partial */
+       buf->b_prompt_interrupt = callback;
+     buf->b_prompt_int_partial = partial;
+ }
+ 
+ /*
   * "prompt_setprompt({buffer}, {text})" function
   */
      static void
*** ../vim-8.1.0068/src/channel.c       2018-06-12 20:25:47.883923416 +0200
--- src/channel.c       2018-06-17 19:33:49.264186387 +0200
***************
*** 5856,5862 ****
      curwin->w_cursor.lnum = lnum + 1;
      curwin->w_cursor.col = 0;
  
!     if (curbuf->b_prompt_callback == NULL)
        return;
      text = ml_get(lnum);
      prompt = prompt_text();
--- 5856,5862 ----
      curwin->w_cursor.lnum = lnum + 1;
      curwin->w_cursor.col = 0;
  
!     if (curbuf->b_prompt_callback == NULL || *curbuf->b_prompt_callback == 
NUL)
        return;
      text = ml_get(lnum);
      prompt = prompt_text();
***************
*** 5874,5877 ****
--- 5874,5901 ----
      clear_tv(&rettv);
  }
  
+ /*
+  * Return TRUE when the interrupt callback was invoked.
+  */
+     int
+ invoke_prompt_interrupt(void)
+ {
+     typval_T  rettv;
+     int               dummy;
+     typval_T  argv[1];
+ 
+     if (curbuf->b_prompt_interrupt == NULL
+                                       || *curbuf->b_prompt_interrupt == NUL)
+       return FALSE;
+     argv[0].v_type = VAR_UNKNOWN;
+ 
+     got_int = FALSE; // don't skip executing commands
+     call_func(curbuf->b_prompt_interrupt,
+             (int)STRLEN(curbuf->b_prompt_interrupt),
+             &rettv, 0, argv, NULL, 0L, 0L, &dummy, TRUE,
+             curbuf->b_prompt_int_partial, NULL);
+     clear_tv(&rettv);
+     return TRUE;
+ }
+ 
  #endif /* FEAT_JOB_CHANNEL */
*** ../vim-8.1.0068/src/proto/channel.pro       2018-06-12 20:25:47.883923416 
+0200
--- src/proto/channel.pro       2018-06-17 19:34:32.267954974 +0200
***************
*** 72,75 ****
--- 72,76 ----
  void job_info_all(list_T *l);
  int job_stop(job_T *job, typval_T *argvars, char *type);
  void invoke_prompt_callback(void);
+ int invoke_prompt_interrupt(void);
  /* vim: set ft=c : */
*** ../vim-8.1.0068/src/version.c       2018-06-17 19:22:48.343603795 +0200
--- src/version.c       2018-06-17 19:34:40.111912692 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     69,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
64. The remote to the T.V. is missing...and you don't even care.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui