mirror of
https://github.com/vim/vim.git
synced 2025-09-28 04:24:06 -04:00
patch 8.2.1588: cannot read back the prompt of a prompt buffer
Problem: Cannot read back the prompt of a prompt buffer. Solution: Add prompt_getprompt(). (Ben Jackson, closes #6851)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
*channel.txt* For Vim version 8.2. Last change: 2020 Jul 10
|
*channel.txt* For Vim version 8.2. Last change: 2020 Sep 03
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -608,6 +608,10 @@ ch_logfile({fname} [, {mode}]) *ch_logfile()*
|
|||||||
after every message, on Unix you can use "tail -f" to see what
|
after every message, on Unix you can use "tail -f" to see what
|
||||||
is going on in real time.
|
is going on in real time.
|
||||||
|
|
||||||
|
To enable the log very early, to see what is received from a
|
||||||
|
terminal during startup, use |--cmd|: >
|
||||||
|
vim --cmd "call ch_logfile('logfile', 'w')"
|
||||||
|
<
|
||||||
This function is not available in the |sandbox|.
|
This function is not available in the |sandbox|.
|
||||||
NOTE: the channel communication is stored in the file, be
|
NOTE: the channel communication is stored in the file, be
|
||||||
aware that this may contain confidential and privacy sensitive
|
aware that this may contain confidential and privacy sensitive
|
||||||
@@ -1256,7 +1260,9 @@ After setting 'buftype' to "prompt" Vim does not automatically start Insert
|
|||||||
mode, use `:startinsert` if you want to enter Insert mode, so that the user
|
mode, use `:startinsert` if you want to enter Insert mode, so that the user
|
||||||
can start typing a line.
|
can start typing a line.
|
||||||
|
|
||||||
The text of the prompt can be set with the |prompt_setprompt()| function.
|
The text of the prompt can be set with the |prompt_setprompt()| function. If
|
||||||
|
no prompt is set with |prompt_setprompt()|, "% " is used. You can get the
|
||||||
|
effective prompt text for a buffer, with |prompt_getprompt()|.
|
||||||
|
|
||||||
The user can go to Normal mode and navigate through the buffer. This can be
|
The user can go to Normal mode and navigate through the buffer. This can be
|
||||||
useful to see older output or copy text.
|
useful to see older output or copy text.
|
||||||
|
@@ -2684,6 +2684,7 @@ popup_show({id}) none unhide popup window {id}
|
|||||||
pow({x}, {y}) Float {x} to the power of {y}
|
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_getprompt({buf}) String get 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_setinterrupt({buf}, {text}) none set prompt interrupt function
|
||||||
prompt_setprompt({buf}, {text}) none set prompt text
|
prompt_setprompt({buf}, {text}) none set prompt text
|
||||||
@@ -7835,6 +7836,17 @@ 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_getprompt({buf}) *prompt_getprompt()*
|
||||||
|
Returns the effective prompt text for buffer {buf}. {buf} can
|
||||||
|
be a buffer name or number. |prompt-buffer|.
|
||||||
|
|
||||||
|
If the buffer doesn't exist or isn't a prompt buffer, an empty
|
||||||
|
string is returned.
|
||||||
|
|
||||||
|
Can also be used as a |method|: >
|
||||||
|
GetBuffer()->prompt_getprompt()
|
||||||
|
|
||||||
|
|
||||||
prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
|
prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
|
||||||
Set prompt callback for buffer {buf} to {expr}. When {expr}
|
Set prompt callback for buffer {buf} to {expr}. When {expr}
|
||||||
is an empty string the callback is removed. This has only
|
is an empty string the callback is removed. This has only
|
||||||
@@ -7890,7 +7902,7 @@ prompt_setprompt({buf}, {text}) *prompt_setprompt()*
|
|||||||
Can also be used as a |method|: >
|
Can also be used as a |method|: >
|
||||||
GetBuffer()->prompt_setprompt('command: ')
|
GetBuffer()->prompt_setprompt('command: ')
|
||||||
|
|
||||||
prop_ functions are documented here: |text-prop-functions|.
|
prop_ functions are documented here: |text-prop-functions|
|
||||||
|
|
||||||
pum_getpos() *pum_getpos()*
|
pum_getpos() *pum_getpos()*
|
||||||
If the popup menu (see |ins-completion-menu|) is not visible,
|
If the popup menu (see |ins-completion-menu|) is not visible,
|
||||||
|
@@ -1118,6 +1118,7 @@ Tags: *tag-functions*
|
|||||||
settagstack() modify the tag stack of a window
|
settagstack() modify the tag stack of a window
|
||||||
|
|
||||||
Prompt Buffer: *promptbuffer-functions*
|
Prompt Buffer: *promptbuffer-functions*
|
||||||
|
prompt_getprompt() get the effective prompt text for a buffer
|
||||||
prompt_setcallback() set prompt callback for a buffer
|
prompt_setcallback() set prompt callback for a buffer
|
||||||
prompt_setinterrupt() set interrupt callback for a buffer
|
prompt_setinterrupt() set interrupt callback for a buffer
|
||||||
prompt_setprompt() set the prompt text for a buffer
|
prompt_setprompt() set the prompt text for a buffer
|
||||||
|
@@ -6368,6 +6368,29 @@ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
|
|||||||
set_callback(&buf->b_prompt_interrupt, &callback);
|
set_callback(&buf->b_prompt_interrupt, &callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* "prompt_getprompt({buffer})" function
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
f_prompt_getprompt(typval_T *argvars, typval_T *rettv)
|
||||||
|
{
|
||||||
|
buf_T *buf;
|
||||||
|
|
||||||
|
// return an empty string by default, e.g. it's not a prompt buffer
|
||||||
|
rettv->v_type = VAR_STRING;
|
||||||
|
rettv->vval.v_string = NULL;
|
||||||
|
|
||||||
|
buf = tv_get_buf_from_arg(&argvars[0]);
|
||||||
|
if (buf == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!bt_prompt(buf))
|
||||||
|
return;
|
||||||
|
|
||||||
|
rettv->vval.v_string = vim_strsave(buf_prompt_text(buf));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "prompt_setprompt({buffer}, {text})" function
|
* "prompt_setprompt({buffer}, {text})" function
|
||||||
*/
|
*/
|
||||||
|
16
src/edit.c
16
src/edit.c
@@ -1681,17 +1681,27 @@ edit_putchar(int c, int highlight)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
|
#if defined(FEAT_JOB_CHANNEL) || defined(PROTO)
|
||||||
|
/*
|
||||||
|
* Return the effective prompt for the specified buffer.
|
||||||
|
*/
|
||||||
|
char_u *
|
||||||
|
buf_prompt_text(buf_T* buf)
|
||||||
|
{
|
||||||
|
if (buf->b_prompt_text == NULL)
|
||||||
|
return (char_u *)"% ";
|
||||||
|
return buf->b_prompt_text;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the effective prompt for the current buffer.
|
* Return the effective prompt for the current buffer.
|
||||||
*/
|
*/
|
||||||
char_u *
|
char_u *
|
||||||
prompt_text(void)
|
prompt_text(void)
|
||||||
{
|
{
|
||||||
if (curbuf->b_prompt_text == NULL)
|
return buf_prompt_text(curbuf);
|
||||||
return (char_u *)"% ";
|
|
||||||
return curbuf->b_prompt_text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prepare for prompt mode: Make sure the last line has the prompt text.
|
* Prepare for prompt mode: Make sure the last line has the prompt text.
|
||||||
* Move the cursor to this line.
|
* Move the cursor to this line.
|
||||||
|
@@ -806,6 +806,7 @@ static funcentry_T global_functions[] =
|
|||||||
{"pow", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_pow)},
|
{"pow", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_pow)},
|
||||||
{"prevnonblank", 1, 1, FEARG_1, ret_number, f_prevnonblank},
|
{"prevnonblank", 1, 1, FEARG_1, ret_number, f_prevnonblank},
|
||||||
{"printf", 1, 19, FEARG_2, ret_string, f_printf},
|
{"printf", 1, 19, FEARG_2, ret_string, f_printf},
|
||||||
|
{"prompt_getprompt", 1, 1, FEARG_1, ret_string, JOB_FUNC(f_prompt_getprompt)},
|
||||||
{"prompt_setcallback", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setcallback)},
|
{"prompt_setcallback", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setcallback)},
|
||||||
{"prompt_setinterrupt", 2, 2, FEARG_1,ret_void, JOB_FUNC(f_prompt_setinterrupt)},
|
{"prompt_setinterrupt", 2, 2, FEARG_1,ret_void, JOB_FUNC(f_prompt_setinterrupt)},
|
||||||
{"prompt_setprompt", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setprompt)},
|
{"prompt_setprompt", 2, 2, FEARG_1, ret_void, JOB_FUNC(f_prompt_setprompt)},
|
||||||
|
@@ -56,6 +56,7 @@ char *job_status(job_T *job);
|
|||||||
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);
|
int invoke_prompt_interrupt(void);
|
||||||
|
void f_prompt_getprompt(typval_T *argvars, typval_T *rettv);
|
||||||
void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
|
void f_prompt_setcallback(typval_T *argvars, typval_T *rettv);
|
||||||
void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
|
void f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv);
|
||||||
void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
|
void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
|
||||||
|
@@ -4,6 +4,7 @@ int ins_need_undo_get(void);
|
|||||||
void ins_redraw(int ready);
|
void ins_redraw(int ready);
|
||||||
int decodeModifyOtherKeys(int c);
|
int decodeModifyOtherKeys(int c);
|
||||||
void edit_putchar(int c, int highlight);
|
void edit_putchar(int c, int highlight);
|
||||||
|
char_u *buf_prompt_text(buf_T* buf);
|
||||||
char_u *prompt_text(void);
|
char_u *prompt_text(void);
|
||||||
int prompt_curpos_editable(void);
|
int prompt_curpos_editable(void);
|
||||||
void edit_unputchar(void);
|
void edit_unputchar(void);
|
||||||
|
@@ -148,4 +148,38 @@ func Test_prompt_buffer_edit()
|
|||||||
call assert_equal(0, prompt_setprompt([], ''))
|
call assert_equal(0, prompt_setprompt([], ''))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_prompt_buffer_getbufinfo()
|
||||||
|
new
|
||||||
|
call assert_equal('', prompt_getprompt('%'))
|
||||||
|
call assert_equal('', prompt_getprompt(bufnr('%')))
|
||||||
|
let another_buffer = bufnr('%')
|
||||||
|
|
||||||
|
set buftype=prompt
|
||||||
|
call assert_equal('% ', prompt_getprompt('%'))
|
||||||
|
call prompt_setprompt( bufnr( '%' ), 'This is a test: ' )
|
||||||
|
call assert_equal('This is a test: ', prompt_getprompt('%'))
|
||||||
|
|
||||||
|
call prompt_setprompt( bufnr( '%' ), '' )
|
||||||
|
call assert_equal('', '%'->prompt_getprompt())
|
||||||
|
|
||||||
|
call prompt_setprompt( bufnr( '%' ), 'Another: ' )
|
||||||
|
call assert_equal('Another: ', prompt_getprompt('%'))
|
||||||
|
let another = bufnr('%')
|
||||||
|
|
||||||
|
new
|
||||||
|
|
||||||
|
call assert_equal('', prompt_getprompt('%'))
|
||||||
|
call assert_equal('Another: ', prompt_getprompt(another))
|
||||||
|
|
||||||
|
" Doesn't exist
|
||||||
|
let buffers_before = len( getbufinfo() )
|
||||||
|
call assert_equal('', prompt_getprompt( bufnr('$') + 1))
|
||||||
|
call assert_equal(buffers_before, len( getbufinfo()))
|
||||||
|
|
||||||
|
" invalid type
|
||||||
|
call assert_fails('call prompt_getprompt({})', 'E728:')
|
||||||
|
|
||||||
|
%bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1588,
|
||||||
/**/
|
/**/
|
||||||
1587,
|
1587,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user