feat: прямая перерисовка статусной строки через TTY escape-коды
SIGWINCH и TIOCSWINSZ не заставляют Claude Code обновить статусную строку. Запускаем statusline-command.sh с кешем и пишем результат напрямую в TTY claude через \0337 (save cursor) / \033[999B / \033[2K / \0338. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -40,21 +40,22 @@ echo "$next" > "$CURRENT_FILE"
|
||||
|
||||
echo "Аккаунт: ${current:-?} -> ${next} (всего: ${#accounts[@]})" >&2
|
||||
|
||||
# Тригерим resize через TIOCSWINSZ на TTY claude (надёжнее чем kill -WINCH)
|
||||
# Обновляем статусную строку: перерисовываем последнюю строку напрямую в TTY
|
||||
sh_pid=$PPID
|
||||
claude_pid=$(awk '/PPid/{print $2}' /proc/$sh_pid/status 2>/dev/null)
|
||||
if [ -n "$claude_pid" ]; then
|
||||
tty_dev=$(ps -o tty= -p "$claude_pid" 2>/dev/null | tr -d ' ')
|
||||
if [ -n "$tty_dev" ] && [ "$tty_dev" != "?" ]; then
|
||||
( sleep 0.3 && python3 -c "
|
||||
import fcntl, termios, struct, sys
|
||||
try:
|
||||
fd = open('/dev/$tty_dev', 'rb+', buffering=0)
|
||||
ws = fcntl.ioctl(fd, termios.TIOCGWINSZ, bytes(8))
|
||||
fcntl.ioctl(fd, termios.TIOCSWINSZ, ws)
|
||||
fd.close()
|
||||
except: pass
|
||||
" ) &
|
||||
# Запускаем statusline-command.sh с кешированными данными и перерисовываем последнюю строку
|
||||
cache_file=$(ls "$HOME/.cache/ai-setup/rate_limits_"*.cache 2>/dev/null | head -1)
|
||||
model_id=$(basename "${cache_file}" .cache | sed 's/rate_limits_//')
|
||||
( sleep 0.2
|
||||
# Собираем данные из кеша для statusline
|
||||
mock_json="{\"cwd\":\"$(echo "$input" | jq -r '.cwd // empty')\",\"model\":{\"display_name\":\"\",\"id\":\"$model_id\"},\"rate_limits\":{},\"context_window\":{}}"
|
||||
new_line=$(echo "$mock_json" | bash "$HOME/.claude/statusline-command.sh" 2>/dev/null)
|
||||
# Перерисовываем последнюю строку через escape-коды
|
||||
printf '\0337\033[999B\033[2K%s\0338' "$new_line" > "/dev/$tty_dev"
|
||||
) &
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user