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}
prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
printf({fmt}, {expr1}...) String format text
prompt_getprompt({buf}) String get prompt text
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
@@ -6746,6 +6747,13 @@ printf({fmt}, {expr1} ...) *printf()*
of "%" items. If there are not sufficient or too many
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()*
Set prompt callback for buffer {buf} to {expr}. When {expr}
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
Prompt Buffer: *promptbuffer-functions*
prompt_getprompt() get the effective prompt text for a buffer
prompt_setcallback() set prompt callback for a buffer
prompt_setinterrupt() set interrupt callback 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.
char_u *prompt_text(void)
/// Return the effective prompt for the specified buffer.
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) {
return (char_u *)"% ";
}
return curbuf->b_prompt_text;
if (buf->b_prompt_text == NULL) {
return (char_u *)"% ";
}
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.

View File

@@ -251,6 +251,7 @@ return {
pow={args=2},
prevnonblank={args=1},
printf={args=varargs(1)},
prompt_getprompt={args=1},
prompt_setcallback={args={2, 2}},
prompt_setinterrupt={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;
}
/// "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
static void f_prompt_setprompt(typval_T *argvars,
typval_T *rettv, FunPtr fptr)

View File

@@ -156,4 +156,40 @@ func Test_prompt_buffer_edit()
call assert_equal(0, prompt_setprompt([], ''))
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