mirror of
https://github.com/microsoft/terminal.git
synced 2025-12-19 18:11:39 -05:00
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:
@@ -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 ✅
|
||||
|
||||
@@ -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 });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user