]> granicus.if.org Git - vim/commitdiff
patch 8.1.0032: BS in prompt buffer starts new line v8.1.0032
authorBram Moolenaar <Bram@vim.org>
Mon, 4 Jun 2018 15:28:44 +0000 (17:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Mon, 4 Jun 2018 15:28:44 +0000 (17:28 +0200)
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.

src/option.c
src/terminal.c
src/testdir/test_prompt_buffer.vim
src/version.c

index 16d05d8b5095aa956de8a15b0e2bb82191faf7b5..7d79b3ca1c36ea9f0cf835f3d55b0f76f6554abb 100644 (file)
@@ -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;
index 6967df73c735df2671495077397a8fa7152e9671..275a5a7ba364084bb94fbe24338a4ce3a7437c30 100644 (file)
@@ -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);
     }
 }
 
index f7363d9ad5ac3e5f10ae9dcea6e4a25ff2000345..a6269dec49a9ded6710b31b72510bb81712074a7 100644 (file)
@@ -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
index 846ac70c2841df27a15cbeda18b58f38c741e8c1..a0aaf866e6e71e2ac09f8a3ee5ba963bec7e7d6d 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    32,
 /**/
     31,
 /**/