Я пишу программу, которая печатает цветные линии, и чем больше я с ней работаю, тем больше сталкиваюсь с проблемами переноса строк.
Это своего рода терминал, написанный на PHP, вот приглашение:
$return = readline("\033[44m\033[1;37m{$this->text}>>\033[0m ");
Если я прокручиваю историю, мой текст смещается на 10 символов, а если я ввожу 21 символ и удаляю один, то он очищает всю строку и начинает удалять символы из строки выше. Это на консоли шириной 47 столбцов
Если я попытаюсь добавить экранирования
$return = readline("\[\033[44m\033[1;37m\]{$this->text}>>\[\033[0m\] ");
затем он выводит скобки...даже если я добавляю двойные обратные косые черты.
\[\][timer]>>\[\]
То же самое я обнаружил и у echo -e
, я действительно не уверен, что происходит.
Наконец, если я модифицирую PS1, то все работает нормально.
[mike@crest ~]$ export PS1="\[\033[44m\033[1;37m\][timer]>>\[\033[0m\] "
[timer]>>
Что я здесь упускаю?
решение1
В соответствии сhttp://mywiki.wooledge.org/BashFAQ/053опция checkwinsize
может быть необходима при прокрутке истории команд:
shopt -s checkwinsize