Repository: microsoft/terminal (language: cpp)

Issue:
COOKED_READ: Backspacing over control visualizers (^W) deletes 4 glyphs
### Windows Terminal version

63b3820

### Windows build number

_No response_

### Other Software

_No response_

### Steps to reproduce

* Launch cmd
* Ctrl+W
* Backspace

### Expected Behavior

Deletes 2 glyphs.

### Actual Behavior

Deletes 4 glyphs


Discussion / hints:

Fix patch:
diff --git a/doc/COOKED_READ_DATA.md b/doc/COOKED_READ_DATA.md
index 113a51bb749..f4b463f7aa6 100644
--- a/doc/COOKED_READ_DATA.md
+++ b/doc/COOKED_READ_DATA.md
@@ -15,6 +15,12 @@ All of the following ✅ marks must be fulfilled during manual testing:
   * Press tab: Autocomplete to "a😊b.txt" ✅
   * Navigate the cursor right past the "a"
   * Press tab twice: Autocomplete to "a😟b.txt" ✅
+* Execute `printf("    "); gets(buffer);` in C (or equivalent)
+  * Press Tab, A, Ctrl+V, Tab, A ✅
+  * The prompt is "        A^V     A" ✅
+  * Cursor navigation works ✅
+  * Backspacing/Deleting random parts of it works ✅
+  * It never deletes the initial 4 spaces ✅
 * Backspace deletes preceding glyphs ✅
 * Ctrl+Backspace deletes preceding words ✅
 * Escape clears input ✅
diff --git a/src/host/readDataCooked.cpp b/src/host/readDataCooked.cpp
index c842bab312d..4869e2ad91a 100644
--- a/src/host/readDataCooked.cpp
+++ b/src/host/readDataCooked.cpp
@@ -938,22 +938,31 @@ ptrdiff_t COOKED_READ_DATA::_writeCharsImpl(const std::wstring_view& text, const
         const auto wch = *it;
         if (wch == UNICODE_TAB)
         {
-            const auto col = _getColumnAtRelativeCursorPosition(distance + cursorOffset);
-            const auto remaining = width - col;
-            distance += std::min(remaining, 8 - (col & 7));
             buf[0] = L'\t';
             len = 1;
         }
         else
         {
             // In the interactive mode we replace C0 control characters (0x00-0x1f) with ASCII representations like ^C (= 0x03).
-            distance += 2;
             buf[0] = L'^';
             buf[1] = gsl::narrow_cast<wchar_t>(wch + L'@');
             len = 2;
         }
 
-        if (!measureOnly)
+        if (measureOnly)
+        {
+            if (wch == UNICODE_TAB)
+            {
+                const auto col = _getColumnAtRelativeCursorPosition(distance + cursorOffset);
+                const auto remaining = width - col;
+                distance += std::min(remaining, 8 - (col & 7));
+            }
+            else
+            {
+                distance += 2;
+            }
+        }
+        else
         {
             distance += _writeCharsUnprocessed({ &buf[0], len });
         }


Test patch: