fix: _write closure bug + strip \r instead of line-delete

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Андрей Бобырев
2026-05-21 00:06:57 +03:00
parent 6ea2257a0c
commit 09a0fc29b3

View File

@@ -816,35 +816,27 @@ class TerminalWidget(tk.Frame):
self.after(100, self.on_close)
def _write(self, text, tag=None):
# Strip \r before closure (SSH sends \r\n)
clean = text.replace("\r", "") if not tag else text
def _do():
self.text.configure(state=tk.NORMAL)
if tag:
self.text.insert(tk.END, text, tag)
elif "\x08" not in text and "\x7f" not in text and "\r" not in text:
# Fast path: no control chars
self.text.insert(tk.END, text)
self.text.insert(tk.END, clean, tag)
elif "\x08" not in clean and "\x7f" not in clean:
# Fast path: no backspace chars
self.text.insert(tk.END, clean)
else:
# Slow path: handle backspace/DEL/CR char by char
# Handle backspace/DEL char by char
buf = []
for ch in text:
for ch in clean:
if ch == "\x08" or ch == "\x7f":
# Flush buffer first
if buf:
self.text.insert(tk.END, "".join(buf))
buf.clear()
# Delete char before cursor
pos = self.text.index(tk.END + "-2c")
if self.text.compare(pos, ">", "1.0"):
self.text.delete(pos)
elif ch == "\r":
if buf:
self.text.insert(tk.END, "".join(buf))
buf.clear()
# CR: delete current line content for overwrite
line_start = self.text.index(tk.END + "-1c linestart")
line_end = self.text.index(tk.END + "-1c")
if self.text.compare(line_start, "<", line_end):
self.text.delete(line_start, line_end)
else:
buf.append(ch)
if buf: