1
0
mirror of https://github.com/tw93/Mole.git synced 2026-02-04 12:41:46 +00:00

fix: use \033[2K to fully clear spinner lines and prevent text remnants

Fixes text remnants and extra blank lines when spinner messages change.

Issues fixed:
1. Text remnants when switching from longer to shorter messages (e.g., 'Cleaning...ems...')
2. Extra blank lines appearing after section headers

Root causes:
- \033[K only clears from cursor to end of line, leaving remnants when new messages are shorter
- stop_section_spinner was clearing lines even when no spinner was running

Changes:
- lib/core/base.sh:
  - Changed stop_section_spinner(), safe_clear_line(), safe_clear_lines() to use \033[2K
  - Added guard in stop_section_spinner to only clear when spinner is actually running
- lib/core/ui.sh:
  - Clear line once when starting spinner (before loop) to ensure clean start
  - Normal spinner rotation uses \r without clearing (performance optimization)

Performance: Line clearing happens only once per spinner start, not on every loop iteration.

Fixes #390
This commit is contained in:
tw93
2026-01-30 18:16:31 +08:00
parent e81be16031
commit e12a40f6bf
3 changed files with 11 additions and 9 deletions

View File

@@ -142,10 +142,6 @@ cleanup() {
stop_inline_spinner 2> /dev/null || true stop_inline_spinner 2> /dev/null || true
if [[ -t 1 ]]; then
printf "\r\033[K" >&2 || true
fi
cleanup_temp_files cleanup_temp_files
stop_sudo_session stop_sudo_session

View File

@@ -626,9 +626,12 @@ start_section_spinner() {
# Stop spinner and clear the line # Stop spinner and clear the line
# Usage: stop_section_spinner # Usage: stop_section_spinner
stop_section_spinner() { stop_section_spinner() {
# Only clear line if spinner was actually running
if [[ -n "${INLINE_SPINNER_PID:-}" ]]; then
stop_inline_spinner 2> /dev/null || true stop_inline_spinner 2> /dev/null || true
if [[ -t 1 ]]; then if [[ -t 1 ]]; then
echo -ne "\r\033[K" >&2 || true echo -ne "\r\033[2K" >&2 || true
fi
fi fi
} }
@@ -646,7 +649,7 @@ safe_clear_lines() {
# Clear lines one by one (more reliable than multi-line sequences) # Clear lines one by one (more reliable than multi-line sequences)
local i local i
for ((i = 0; i < lines; i++)); do for ((i = 0; i < lines; i++)); do
printf "\033[1A\r\033[K" > "$tty_device" 2> /dev/null || return 1 printf "\033[1A\r\033[2K" > "$tty_device" 2> /dev/null || return 1
done done
return 0 return 0
@@ -660,7 +663,7 @@ safe_clear_line() {
# Use centralized ANSI support check # Use centralized ANSI support check
is_ansi_supported 2> /dev/null || return 1 is_ansi_supported 2> /dev/null || return 1
printf "\r\033[K" > "$tty_device" 2> /dev/null || return 1 printf "\r\033[2K" > "$tty_device" 2> /dev/null || return 1
return 0 return 0
} }

View File

@@ -301,6 +301,9 @@ start_inline_spinner() {
[[ -z "$chars" ]] && chars="|/-\\" [[ -z "$chars" ]] && chars="|/-\\"
local i=0 local i=0
# Clear line on first output to prevent text remnants from previous messages
printf "\r\033[2K" >&2 || true
# Cooperative exit: check for stop file instead of relying on signals # Cooperative exit: check for stop file instead of relying on signals
while [[ ! -f "$stop_file" ]]; do while [[ ! -f "$stop_file" ]]; do
local c="${chars:$((i % ${#chars})):1}" local c="${chars:$((i % ${#chars})):1}"