diff --git a/ui/terminal_panel.py b/ui/terminal_panel.py index a7bd02c..7b53bcc 100644 --- a/ui/terminal_panel.py +++ b/ui/terminal_panel.py @@ -571,24 +571,32 @@ class TerminalPanel(QWidget): self._send_bytes(b"\r") def _on_backspace(self): + # 发 DEL(\x7f) 给 shell,由 shell 的 readline 处理退格 + 回显(\b \b)。 + # 这样 shell 在输入行首会忽略退格,不会删除提示符 root@host:~#。 + # 旧方案是本地 deletePreviousChar(),但 _current_line_start 在提示符 + # 之前,导致退到输入行首后还能继续删提示符。 + if self.chan and self._connected: + self._send_bytes(b"\x7f") + return + # 未连接时 fallback:本地删除 cursor = self.term.textCursor() if cursor.position() <= self._current_line_start: - return # 已到行首,不删 - # 不能跨行删(保持当前行) - if self._is_at_line_start(cursor): return cursor.deletePreviousChar() def _on_delete(self): + # 发 Delete 转义序列给 shell,由 shell 处理 + if self.chan and self._connected: + self._send_bytes(b"\x1b[3~") + return + # 未连接时 fallback:本地删除 cursor = self.term.textCursor() if cursor.atEnd(): return - # 不允许删除当前输入行之前的内容(提示符 root@host:~# 等) if cursor.position() < self._current_line_start: cursor.setPosition(self._current_line_start) self.term.setTextCursor(cursor) return - # 如果有选区且选区起点在当前输入行之前,不允许 if cursor.hasSelection(): sel_start = cursor.selectionStart() if sel_start < self._current_line_start: