# HG changeset patch # User Christian Brabandt # Date 1705259702 -3600 # Node ID 2ead2e7321c85e32d553899fbc20c9d8553754d9 # Parent aa539262b6a750ad291df889f4a5d90b63a63e9a patch 9.1.0028: win32: Ctrl-D cannot be used to close a pipe Commit: https://github.com/vim/vim/commit/1f13fcc9342e66842bf9847d01e585ea2c2b6b30 Author: GuyBrush Date: Sun Jan 14 20:08:40 2024 +0100 patch 9.1.0028: win32: Ctrl-D cannot be used to close a pipe Problem: win32: Ctrl-D cannot be used to close a pipe Solution: Properly detect Ctrl-D when reading from a pipe (GuyBrush) Enabling Ctrl-D for gvim pipeline input and apply defensive programming on account of PR #12752 so that once PR 12752 is merged, CTRL-D will keep on working closes: #13849 Signed-off-by: GuyBrush Signed-off-by: Christian Brabandt diff --git a/src/os_win32.c b/src/os_win32.c --- a/src/os_win32.c +++ b/src/os_win32.c @@ -5176,7 +5176,7 @@ mch_system_piped(char *cmd, int options) { /* * For pipes: Check for CTRL-C: send interrupt signal to - * child. Check for CTRL-D: EOF, close pipe to child. + * child. */ if (len == 1 && cmd != NULL) { @@ -5186,10 +5186,22 @@ mch_system_piped(char *cmd, int options) // now put 9 as SIGKILL TerminateProcess(pi.hProcess, 9); } - if (ta_buf[ta_len] == Ctrl_D) + } + + /* + * Check for CTRL-D: EOF, close pipe to child. + * Ctrl_D may be decorated by _OnChar() + */ + if ((len == 1 || len == 4 ) && cmd != NULL) + { + if (ta_buf[0] == Ctrl_D + || (ta_buf[0] == CSI + && ta_buf[1] == KS_MODIFIER + && ta_buf[3] == Ctrl_D)) { CloseHandle(g_hChildStd_IN_Wr); g_hChildStd_IN_Wr = NULL; + len = 0; } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 28, +/**/ 27, /**/ 26,