To: vim_dev@googlegroups.com Subject: Patch 8.1.0069 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- 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 ///