From: Bram Moolenaar Date: Mon, 4 Jun 2018 15:28:44 +0000 (+0200) Subject: patch 8.1.0032: BS in prompt buffer starts new line X-Git-Tag: v8.1.0032 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6b810d92a9cd9378ab46ea0db07079cb789f9faa;p=vim patch 8.1.0032: BS in prompt buffer starts new line 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. --- diff --git a/src/option.c b/src/option.c index 16d05d8b5..7d79b3ca1 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 6967df73c..275a5a7ba 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 f7363d9ad..a6269dec4 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\") @@ -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 = "\" + call term_sendkeys(buf, "hello" . bs . bs) + call WaitForAssert({-> assert_equal('% hel', term_getline(buf, 1))}) + + let left = "\" + call term_sendkeys(buf, left . left . left . bs . '-') + call WaitForAssert({-> assert_equal('% -hel', term_getline(buf, 1))}) + + let end = "\" + call term_sendkeys(buf, end . "x") + call WaitForAssert({-> assert_equal('% -helx', term_getline(buf, 1))}) + + call term_sendkeys(buf, "\exit\") + 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 846ac70c2..a0aaf866e 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 32, /**/ 31, /**/