vim-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 vim/vim#6851)
077cc7aa0e

Updated prompt_getprompt() doc to cb80aa2d53
and removed mention of method syntax usage (not supported by Nvim).
This commit is contained in:
Sean Dewar
2021-04-14 20:13:22 +01:00
parent 805eb81ccd
commit 65f35e0c7d
6 changed files with 79 additions and 6 deletions

View File

@@ -2309,6 +2309,7 @@ perleval({expr}) any evaluate |perl| expression
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
@@ -6746,6 +6747,13 @@ printf({fmt}, {expr1} ...) *printf()*
of "%" items. If there are not sufficient or too many of "%" items. If there are not sufficient or too many
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. See |prompt-buffer|.
If the buffer doesn't exist or isn't a prompt buffer, an empty
string is returned.
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

View File

@@ -978,6 +978,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

View File

@@ -1604,13 +1604,20 @@ void edit_putchar(int c, bool highlight)
} }
} }
// Return the effective prompt for the current buffer. /// Return the effective prompt for the specified buffer.
char_u *prompt_text(void) char_u *buf_prompt_text(const buf_T *const buf)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{ {
if (curbuf->b_prompt_text == NULL) { if (buf->b_prompt_text == NULL) {
return (char_u *)"% "; return (char_u *)"% ";
} }
return curbuf->b_prompt_text; return buf->b_prompt_text;
}
// Return the effective prompt for the current buffer.
char_u *prompt_text(void) FUNC_ATTR_WARN_UNUSED_RESULT
{
return buf_prompt_text(curbuf);
} }
// 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.

View File

@@ -251,6 +251,7 @@ return {
pow={args=2}, pow={args=2},
prevnonblank={args=1}, prevnonblank={args=1},
printf={args=varargs(1)}, printf={args=varargs(1)},
prompt_getprompt={args=1},
prompt_setcallback={args={2, 2}}, prompt_setcallback={args={2, 2}},
prompt_setinterrupt={args={2, 2}}, prompt_setinterrupt={args={2, 2}},
prompt_setprompt={args={2, 2}}, prompt_setprompt={args={2, 2}},

View File

@@ -6491,6 +6491,26 @@ static void f_prompt_setinterrupt(typval_T *argvars,
buf->b_prompt_interrupt= interrupt_callback; buf->b_prompt_interrupt= interrupt_callback;
} }
/// "prompt_getprompt({buffer})" function
void f_prompt_getprompt(typval_T *argvars, typval_T *rettv, FunPtr fptr)
FUNC_ATTR_NONNULL_ALL
{
// 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_T *const 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
static void f_prompt_setprompt(typval_T *argvars, static void f_prompt_setprompt(typval_T *argvars,
typval_T *rettv, FunPtr fptr) typval_T *rettv, FunPtr fptr)

View File

@@ -156,4 +156,40 @@ 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( '%' ), '' )
" Nvim doesn't support method call syntax yet.
" call assert_equal('', '%'->prompt_getprompt())
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