Перемещение курсора
Экранированные последовательности можно использовать для позиционирования курсора. Этот прием часто используется для отображения времени или другой информации в разных местах на экране, например вверху, при каждом выводе приглашения к вводу. В табл. 13.4 перечислены экранированные последовательности, управляющие позицией курсора.
Таблица 13.4. Экранированные последовательности, управляющие позицией курсора
Последовательность
Действие
33[l;cH
Перемещает курсор в строку l и позицию c
33[nA
Перемещает курсор вверх на n строк
33[nB
Перемещает курсор вниз на n строк
33[nC
Перемещает курсор вперед на n символов
33[nD
Перемещает курсор назад на n символов
33[2J
Очищает экран и помещает курсор в левый верхний угол (строка 0, позиция 0)
33[K
Очищает экран от позиции курсора до конца текущей строки
33[s
Сохраняет текущую позицию курсора
33[u
Восстанавливает сохраненную позицию курсора
Используя эти коды, можно сконструировать строку приглашения, рисующую красный прямоугольник с часами в верхней части экрана (время отображается желтым цветом). Код, определяющий строку приглашения, на этот раз выглядит немного устрашающе:
PS1="[33[s33[0;0H33[0;41m33[K33[1;33m 33[0m33[u]<u@h W>$ "
В табл. 13.5 приведены отдельные части этого определения, они помогут понять, как это работает.
Таблица 13.5. Экранированные последовательности, управляющие позицией курсора
Последовательность
Действие
[
Начинает последовательность непечатаемых символов. Истинное назначение этой последовательности — позволить bash правильно вычислить длину строки приглашения на экране. Без этого функция редактирования командной строки неправильно позиционировала бы курсор
33[s
Сохраняет позицию курсора. Это необходимо, чтобы вернуться в местоположение строки приглашения после вывода прямоугольника с часами в верхней части экрана. Будьте внимательны: некоторые эмуляторы терминалов не поддерживают эту последовательность
33[0;0H
Перемещает курсор в левый верхний угол, в строку 0, позицию 0
33[0;41m
Устанавливает красный цвет фона
33[K
Очищает экран от текущей позиции курсора (в левом верхнем углу) до конца строки. Поскольку теперь установлен красный цвет фона, строка окрашивается в красный цвет. Обратите внимание, что последовательность очистки экрана до конца строки не изменяет позицию курсора, который остается в левом верхнем углу
33[1;33m
Устанавливает желтый цвет текста
Выводит текущее время. Хотя это «печатаемый» элемент, он находится в непечатаемом блоке строки приглашения, потому что нам не нужно, чтобы командная оболочка bash учитывала размер часов при расчете истинного размера отображаемой строки приглашения
33[0m
Выключает цвет. Сбрасывает настройки цвета для текста и фона
33[u
Восстанавливает позицию курсора, сохраненную ранее
]
Завершает последовательность непечатаемых символов
<u@h W>$
Строка приглашения