summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-09-04 16:35:35 +0200
committerBram Moolenaar <Bram@vim.org>2020-09-04 16:35:35 +0200
commit077cc7aa0e0c431e97795612374fe17fe7c88803 (patch)
tree80843d4928d91ca5f9d4c38d37807e0eb17bc4be
parenteadee486c70946ad0e1746d77898d6f4f4acc817 (diff)
patch 8.2.1588: cannot read back the prompt of a prompt bufferv8.2.1588
Problem: Cannot read back the prompt of a prompt buffer. Solution: Add prompt_getprompt(). (Ben Jackson, closes #6851)
-rw-r--r--runtime/doc/channel.txt10
-rw-r--r--runtime/doc/eval.txt14
-rw-r--r--runtime/doc/usr_41.txt1
-rw-r--r--src/channel.c23
-rw-r--r--src/edit.c16
-rw-r--r--src/evalfunc.c1
-rw-r--r--src/proto/channel.pro1
-rw-r--r--src/proto/edit.pro1
-rw-r--r--src/testdir/test_prompt_buffer.vim34
-rw-r--r--src/version.c2
10 files changed, 97 insertions, 6 deletions
diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt
index 84a344fa95..18b0232dfa 100644
--- a/runtime/doc/channel.txt
+++ b/runtime/doc/channel.txt
@@ -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
@@ -608,6 +608,10 @@ ch_logfile({fname} [, {mode}]) *ch_logfile()*
after every message, on Unix you can use "tail -f" to see what
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|.
NOTE: the channel communication is stored in the file, be
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
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
useful to see older output or copy text.
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index a2e1af919f..130e6423b9 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2684,6 +2684,7 @@ popup_show({id}) none unhide popup window {id}
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
@@ -7835,6 +7836,17 @@ printf({fmt}, {expr1} ...) *printf()*
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()*
Set prompt callback for buffer {buf} to {expr}. When {expr}
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|: >
GetBuffer()->prompt_setprompt('command: ')
-prop_ functions are documented here: |text-prop-functions|.
+prop_ functions are documented here: |text-prop-functions|
pum_getpos() *pum_getpos()*
If the popup menu (see |ins-completion-menu|) is not visible,
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
index ff223e6aef..b11f0134f6 100644
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1118,6 +1118,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
diff --git a/src/channel.c b/src/channel.c
index 1a899e8aa8..5bf561e220 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -6368,6 +6368,29 @@ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
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
*/
diff --git a/src/edit.c b/src/edit.c
index dc0b45082d..bc74f44bb4 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1682,16 +1682,26 @@ edit_putchar(int c, int highlight)
#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.
*/
char_u *
prompt_text(void)
{
- if (curbuf->b_prompt_text == NULL)
- return (char_u *)"% ";
- return curbuf->b_prompt_text;
+ return buf_prompt_text(curbuf);
}
+
/*
* Prepare for prompt mode: Make sure the last line has the prompt text.
* Move the cursor to this line.
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 91fbc675ce..ac75a7d567 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -806,6 +806,7 @@ static funcentry_T global_functions[] =
{"pow", 2, 2, FEARG_1, ret_float, FLOAT_FUNC(f_pow)},
{"prevnonblank", 1, 1, FEARG_1, ret_number, f_prevnonblank},
{"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_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)},
diff --git a/src/proto/channel.pro b/src/proto/channel.pro
index 56a0167b82..a402177cfb 100644
--- a/src/proto/channel.pro
+++ b/src/proto/channel.pro
@@ -56,6 +56,7 @@ char *job_status(job_T *job);
int job_stop(job_T *job, typval_T *argvars, char *type);
void invoke_prompt_callback(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_setinterrupt(typval_T *argvars, typval_T *rettv);
void f_prompt_setprompt(typval_T *argvars, typval_T *rettv);
diff --git a/src/proto/edit.pro b/src/proto/edit.pro
index 6efe537151..e2ec8dc869 100644
--- a/src/proto/edit.pro
+++ b/src/proto/edit.pro
@@ -4,6 +4,7 @@ int ins_need_undo_get(void);
void ins_redraw(int ready);
int decodeModifyOtherKeys(int c);
void edit_putchar(int c, int highlight);
+char_u *buf_prompt_text(buf_T* buf);
char_u *prompt_text(void);
int prompt_curpos_editable(void);
void edit_unputchar(void);
diff --git a/src/testdir/test_prompt_buffer.vim b/src/testdir/test_prompt_buffer.vim
index 45eb1c907a..365687511d 100644
--- a/src/testdir/test_prompt_buffer.vim
+++ b/src/testdir/test_prompt_buffer.vim
@@ -148,4 +148,38 @@ 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( '%' ), '' )
+ 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
diff --git a/src/version.c b/src/version.c
index 92ff1e9bb5..2c6e47efc0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1588,
+/**/
1587,
/**/
1586,