summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-06-04 17:28:44 +0200
committerBram Moolenaar <Bram@vim.org>2018-06-04 17:28:44 +0200
commit6b810d92a9cd9378ab46ea0db07079cb789f9faa (patch)
tree3d1f644261263fa755234cdab14a717c2647ca12
parentc8523e2e6cd072d86a9412f465aa9eef53f5675e (diff)
patch 8.1.0032: BS in prompt buffer starts new linev8.1.0032
Problem: BS in prompt buffer starts new line. Solution: Do not allows BS over the prompt. Make term_sendkeys() handle special keys. Add a test.
-rw-r--r--src/option.c4
-rw-r--r--src/terminal.c15
-rw-r--r--src/testdir/test_prompt_buffer.vim56
-rw-r--r--src/version.c2
4 files changed, 68 insertions, 9 deletions
diff --git a/src/option.c b/src/option.c
index 16d05d8b50..7d79b3ca1c 100644
--- a/src/option.c
+++ b/src/option.c
@@ -12439,6 +12439,10 @@ check_opt_wim(void)
can_bs(
int what) /* BS_INDENT, BS_EOL or BS_START */
{
+#ifdef FEAT_JOB_CHANNEL
+ if (what == BS_START && bt_prompt(curbuf))
+ return FALSE;
+#endif
switch (*p_bs)
{
case '2': return TRUE;
diff --git a/src/terminal.c b/src/terminal.c
index 6967df73c7..275a5a7ba3 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -5094,8 +5094,19 @@ f_term_sendkeys(typval_T *argvars, typval_T *rettv)
while (*msg != NUL)
{
- send_keys_to_term(term, PTR2CHAR(msg), FALSE);
- msg += MB_CPTR2LEN(msg);
+ int c;
+
+ if (*msg == K_SPECIAL && msg[1] != NUL && msg[2] != NUL)
+ {
+ c = TO_SPECIAL(msg[1], msg[2]);
+ msg += 3;
+ }
+ else
+ {
+ c = PTR2CHAR(msg);
+ msg += MB_CPTR2LEN(msg);
+ }
+ send_keys_to_term(term, c, FALSE);
}
}
diff --git a/src/testdir/test_prompt_buffer.vim b/src/testdir/test_prompt_buffer.vim
index f7363d9ad5..a6269dec49 100644
--- a/src/testdir/test_prompt_buffer.vim
+++ b/src/testdir/test_prompt_buffer.vim
@@ -7,16 +7,20 @@ endif
source shared.vim
source screendump.vim
-func Test_prompt_basic()
+func CanTestPromptBuffer()
" We need to use a terminal window to be able to feed keys without leaving
" Insert mode.
if !has('terminal')
- return
+ return 0
endif
if has('win32')
- " TODO: make this work on MS-Windows
- return
+ " TODO: make the tests work on MS-Windows
+ return 0
endif
+ return 1
+endfunc
+
+func WriteScript(name)
call writefile([
\ 'func TextEntered(text)',
\ ' if a:text == "exit"',
@@ -44,8 +48,17 @@ func Test_prompt_basic()
\ 'set buftype=prompt',
\ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
\ 'startinsert',
- \ ], 'Xpromptscript')
- let buf = RunVimInTerminal('-S Xpromptscript', {})
+ \ ], a:name)
+endfunc
+
+func Test_prompt_basic()
+ if !CanTestPromptBuffer()
+ return
+ endif
+ let scriptName = 'XpromptscriptBasic'
+ call WriteScript(scriptName)
+
+ let buf = RunVimInTerminal('-S ' . scriptName, {})
call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
call term_sendkeys(buf, "hello\<CR>")
@@ -57,5 +70,34 @@ func Test_prompt_basic()
call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
call StopVimInTerminal(buf)
- call delete('Xpromptscript')
+ call delete(scriptName)
+endfunc
+
+func Test_prompt_editing()
+ if !CanTestPromptBuffer()
+ return
+ endif
+ let scriptName = 'XpromptscriptEditing'
+ call WriteScript(scriptName)
+
+ let buf = RunVimInTerminal('-S ' . scriptName, {})
+ call WaitForAssert({-> assert_equal('%', term_getline(buf, 1))})
+
+ let bs = "\<BS>"
+ call term_sendkeys(buf, "hello" . bs . bs)
+ call WaitForAssert({-> assert_equal('% hel', term_getline(buf, 1))})
+
+ let left = "\<Left>"
+ call term_sendkeys(buf, left . left . left . bs . '-')
+ call WaitForAssert({-> assert_equal('% -hel', term_getline(buf, 1))})
+
+ let end = "\<End>"
+ call term_sendkeys(buf, end . "x")
+ call WaitForAssert({-> assert_equal('% -helx', term_getline(buf, 1))})
+
+ call term_sendkeys(buf, "\<C-U>exit\<CR>")
+ call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
+
+ call StopVimInTerminal(buf)
+ call delete(scriptName)
endfunc
diff --git a/src/version.c b/src/version.c
index 846ac70c28..a0aaf866e6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 32,
+/**/
31,
/**/
30,