0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.1.0069: cannot handle pressing CTRL-C in a prompt buffer

Problem:    Cannot handle pressing CTRL-C in a prompt buffer.
Solution:   Add prompt_setinterrupt().
This commit is contained in:
Bram Moolenaar 2018-06-17 19:36:33 +02:00
parent 2f82ca7d79
commit 0e5979a6d4
6 changed files with 98 additions and 13 deletions

View File

@ -2297,8 +2297,9 @@ pow({x}, {y}) Float {x} to the power of {y}
prevnonblank({lnum}) Number line nr of non-blank line <= {lnum} prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
printf({fmt}, {expr1}...) String format text printf({fmt}, {expr1}...) String format text
prompt_addtext({buf}, {expr}) none add text to a prompt buffer 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 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 pumvisible() Number whether popup menu is visible
pyeval({expr}) any evaluate |Python| expression pyeval({expr}) any evaluate |Python| expression
py3eval({expr}) any evaluate |python3| expression py3eval({expr}) any evaluate |python3| expression
@ -6506,17 +6507,11 @@ printf({fmt}, {expr1} ...) *printf()*
arguments an error is given. Up to 18 arguments can be used. 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()* prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
Set prompt callback for buffer {buf} to {expr}. This has only 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". effect if {buf} has 'buftype' set to "prompt".
The callback is invoked when pressing Enter. The current The callback is invoked when pressing Enter. The current
buffer will always be the prompt buffer. A new line for a buffer will always be the prompt buffer. A new line for a
prompt is added before invoking the callback, thus the prompt prompt is added before invoking the callback, thus the prompt
@ -6541,6 +6536,22 @@ prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
endif endif
endfunc 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()* pumvisible() *pumvisible()*
Returns non-zero when the popup menu is visible, zero Returns non-zero when the popup menu is visible, zero
@ -8563,7 +8574,9 @@ term_start({cmd}, {options}) *term_start()*
instead of using 'termwinsize' instead of using 'termwinsize'
"term_cols" horizontal size to use for the terminal, "term_cols" horizontal size to use for the terminal,
instead of using 'termwinsize' instead of using 'termwinsize'
"vertical" split the window vertically "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 "curwin" use the current window, do not split the
window; fails if the current buffer window; fails if the current buffer
cannot be |abandon|ed cannot be |abandon|ed
@ -9392,11 +9405,12 @@ vtp Compiled for vcon support |+vtp| (check vcon to find
out if it works in the current console). out if it works in the current console).
wildignore Compiled with 'wildignore' option. wildignore Compiled with 'wildignore' option.
wildmenu Compiled with 'wildmenu' 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 win32 Win32 version of Vim (MS-Windows 95 and later, 32 or
64 bits) 64 bits)
win32unix Win32 version of Vim, using Unix files (Cygwin) win32unix Win32 version of Vim, using Unix files (Cygwin)
win64 Win64 version of Vim (MS-Windows 64 bit). win64 Win64 version of Vim (MS-Windows 64 bit).
win95 Win32 version for MS-Windows 95/98/ME. win95 Win32 version for MS-Windows 95/98/ME (always False)
winaltkeys Compiled with 'winaltkeys' option. winaltkeys Compiled with 'winaltkeys' option.
windows Compiled with support for more than one window. windows Compiled with support for more than one window.
writebackup Compiled with 'writebackup' default on. writebackup Compiled with 'writebackup' default on.

View File

@ -5856,7 +5856,7 @@ invoke_prompt_callback(void)
curwin->w_cursor.lnum = lnum + 1; curwin->w_cursor.lnum = lnum + 1;
curwin->w_cursor.col = 0; curwin->w_cursor.col = 0;
if (curbuf->b_prompt_callback == NULL) if (curbuf->b_prompt_callback == NULL || *curbuf->b_prompt_callback == NUL)
return; return;
text = ml_get(lnum); text = ml_get(lnum);
prompt = prompt_text(); prompt = prompt_text();
@ -5874,4 +5874,28 @@ invoke_prompt_callback(void)
clear_tv(&rettv); 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 */ #endif /* FEAT_JOB_CHANNEL */

View File

@ -1016,6 +1016,19 @@ edit(
goto doESCkey; goto doESCkey;
} }
#endif #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 #ifdef UNIX
do_intr: do_intr:

View File

@ -298,6 +298,7 @@ static void f_prevnonblank(typval_T *argvars, typval_T *rettv);
static void f_printf(typval_T *argvars, typval_T *rettv); static void f_printf(typval_T *argvars, typval_T *rettv);
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
static void f_prompt_setcallback(typval_T *argvars, typval_T *rettv); 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); static void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
#endif #endif
static void f_pumvisible(typval_T *argvars, typval_T *rettv); static void f_pumvisible(typval_T *argvars, typval_T *rettv);
@ -754,6 +755,7 @@ static struct fst
{"printf", 1, 19, f_printf}, {"printf", 1, 19, f_printf},
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
{"prompt_setcallback", 2, 2, f_prompt_setcallback}, {"prompt_setcallback", 2, 2, f_prompt_setcallback},
{"prompt_setinterrupt", 2, 2, f_prompt_setinterrupt},
{"prompt_setprompt", 2, 2, f_prompt_setprompt}, {"prompt_setprompt", 2, 2, f_prompt_setprompt},
#endif #endif
{"pumvisible", 0, 0, f_pumvisible}, {"pumvisible", 0, 0, f_pumvisible},
@ -8621,6 +8623,35 @@ f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED)
buf->b_prompt_partial = partial; buf->b_prompt_partial = partial;
} }
/*
* "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 * "prompt_setprompt({buffer}, {text})" function
*/ */

View File

@ -72,4 +72,5 @@ void job_info(job_T *job, dict_T *dict);
void job_info_all(list_T *l); void job_info_all(list_T *l);
int job_stop(job_T *job, typval_T *argvars, char *type); int job_stop(job_T *job, typval_T *argvars, char *type);
void invoke_prompt_callback(void); void invoke_prompt_callback(void);
int invoke_prompt_interrupt(void);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
69,
/**/ /**/
68, 68,
/**/ /**/