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