Fix backspacing over control visualizers (#16400)

During `!measureOnly` the old code would increment `distance` twice.
Now it doesn't. :)

Closes #16356

## Validation Steps Performed
See updated test instructions in `doc/COOKED_READ_DATA.md`
This commit is contained in:
Leonard Hecker
2023-12-04 21:14:26 +01:00
committed by GitHub
parent be9fc200c7
commit 654b755161
2 changed files with 20 additions and 5 deletions

View File

@@ -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 ✅

View File

@@ -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 });
}