patch 9.1.2048: MS-Windows: backspace behavior wrong with ConPTY
Commit:
https://github.com/vim/vim/commit/997952a512e077e719011862ce67807e771b129e
Author: Muraoka Taro <[email protected]>
Date: Sat Jan 3 17:06:03 2026 +0000
patch 9.1.2048: MS-Windows: backspace behavior wrong with ConPTY
Problem: Pressing backspace in ConPTY on Windows deletes an entire
word, not just a single character. This is the same as
pressing Alt + backspace in cmd.exe.
Solution: When using ConPTY on Windows, the `VTERM_KEY_BACKSPACE` key is
now sent when the Backspace key or Ctrl+H is detected.
(Muraoka Taro)
Historically, Windows has assigned the code 0x7F (DEL) to backspace, and
it seems necessary to follow that behavior when using ConPTY.
closes: #19065
Signed-off-by: Muraoka Taro <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/src/terminal.c b/src/terminal.c
index d2e20e251..138579ab3 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -1584,9 +1584,26 @@ term_convert_key(term_T *term, int c, int modmask, char
*buf)
{
// don't use VTERM_KEY_ENTER, it may do an unwanted conversion
- // don't use VTERM_KEY_BACKSPACE, it always
- // becomes 0x7f DEL
- case K_BS: c = term_backspace_char; break;
+ case K_BS:
+#ifdef MSWIN
+ // In ConPTY, we must use VTERM_KEY_BACKSPACE, otherwise it will
+ // delete one word, equivalent to Alt+Backspace.
+ if (term->tl_conpty)
+ key = VTERM_KEY_BACKSPACE;
+ else
+#endif
+ // don't use VTERM_KEY_BACKSPACE, it always becomes 0x7f DEL
+ c = term_backspace_char;
+ break;
+
+#ifdef MSWIN
+ case BS:
+ // In ConPTY, we must use VTERM_KEY_BACKSPACE, otherwise it will
+ // delete one word, equivalent to Alt+Backspace.
+ if (term->tl_conpty)
+ key = VTERM_KEY_BACKSPACE;
+ break;
+#endif
case ESC: key = VTERM_KEY_ESCAPE; break;
case K_DEL: key = VTERM_KEY_DEL; break;
diff --git a/src/testdir/test_terminal3.vim b/src/testdir/test_terminal3.vim
index b332ff4e6..ff8f8c206 100644
--- a/src/testdir/test_terminal3.vim
+++ b/src/testdir/test_terminal3.vim
@@ -1090,4 +1090,38 @@ func Test_terminal_ansi_color_windows_cui()
call assert_equal(expected_colors, term_scrape(buf,
1)[:len_to_check-1]->map({_, v -> v['bg']}))
endfunc
+func Test_terminal_backspace_on_windows()
+ if !has('win32')
+ throw 'Skipped: only for the Windows CUI'
+ endif
+ " Specify a simple prompt for easy comparison
+ let save_prompt = $PROMPT
+ let $PROMPT = '>'
+
+ " Return the prompt line before the cursor
+ func s:get_cmd_prompt(buf)
+ let cur = term_getcursor(a:buf)
+ return term_getline(a:buf, cur[0])[:cur[1]-2]
+ endfunc
+
+ let buf = term_start('cmd.exe')
+ call WaitForAssert({-> assert_equal('>', s:get_cmd_prompt(buf))}, 100)
+
+ " Verify sent characters are echoed back
+ call term_sendkeys(buf, 'foo bar')
+ call WaitForAssert({-> assert_equal('>foo bar', s:get_cmd_prompt(buf))}, 100)
+ " Backspace should delete a character in front of the cursor
+ call term_sendkeys(buf, "\<BS>")
+ call WaitForAssert({-> assert_equal('>foo ba', s:get_cmd_prompt(buf))}, 100)
+ " Ctrl+H behaves like Backspace
+ call term_sendkeys(buf, "\<C-H>")
+ call WaitForAssert({-> assert_equal('>foo b', s:get_cmd_prompt(buf))}, 100)
+ " Send a total of four BS and Ctrl+H to erase four characters.
+ call term_sendkeys(buf, "\<BS>\<BS>\<C-H>\<C-H>")
+ call WaitForAssert({-> assert_equal('>f', s:get_cmd_prompt(buf))}, 100)
+
+ delfunc s:get_cmd_prompt
+ let $PROMPT = save_prompt
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 163f4fb72..7375bfbb2 100644
--- a/src/version.c
+++ b/src/version.c
@@ -734,6 +734,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2048,
/**/
2047,
/**/
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1vc5DU-00CJk4-SJ%40256bit.org.