Я знаю, что могу вернуться в строку и перезаписать ее содержимое с помощью \r
.
Теперь, как я могу перейти в предыдущую строку, чтобы изменить это?
Или есть даже способ печати в определенном месте курсора в окне консоли?
Моя цель – создать некоторое самообновляющееся многострочное консольное приложение с PHP.
Для перемещения курсора используйте escape-коды ANSI . Например: Esc [ 1 F
Чтобы поместить символ Escape в строку, вам нужно будет указать его значение численно, например «\ x1B [1F»
Как можно предположить , вы можете использовать PHP ncurses для более абстрактного способа перемещения курсора.
В то время как большинство «консолей» разрешают коды выхода ANSI, другие типы терминалов используют разные последовательности символов, ncurses
предоставляет стандартизованный API, независимый от терминала. Быстро посмотрите на /etc/termcap
(а затем man terminfo
), если вы заинтересованы.
Обновление: ответ Ларса Вирценюса содержит полезное резюме фона. Несколько лет назад я также написал короткую статью о терминалах .
Виртуальные консоли Linux подражают терминалу отображения старого времени, хотя и не совсем. См. Википедию на VT-100 на примере аппаратного обеспечения.
Эти терминалы считывают данные с последовательного порта и отображают его на экране. Они также искали специальные байты в потоке ввода из последовательного порта и действовали на них другими способами. Например, символ новой строки ('\ n', значение байта 10) будет идти в начало следующей строки, а символ возврата каретки ('\ r', значение байта 13) будет начинаться с текущей строки.
Более интересно, что байт ASCII ESC (27) запускает последовательность команд, которая может почти что угодно перемещать или отображать. Одна такая последовательность может перемещать курсор в верхнюю левую часть экрана, другую – в заданную строку и столбец. Третий может очистить экран, а четвертый может отображать текст в обратных цветах.
Каждый производитель терминалов изобрел свои собственные командные последовательности (и они не всегда начинались с ESC), а затем изменяли их в зависимости от того, что они могли сделать для новых версий своего оборудования. Если производитель добавил цвета или простую графику, это привело к появлению новых последовательностей.
Адаптация каждого приложения к каждому терминалу и каждое изменение в командных последовательностях было бы большой задачей. Сравните это с адаптированием каждого веб-приложения к новой версии браузера.
Как обычно, решение состоит в том, чтобы добавить слой абстракции. В Unix начальная абстракция называлась termcap
и состояла из файла /etc/termcap
и библиотеки для чтения файла. Файл будет указывать фактические последовательности команд для отправки каждой логической операции для каждой модели терминала. Таким vt102
модель терминала vt102
отобразит операцию «очистить экран» от \033[2J
. Это позволило программистам приложений мыслить с точки зрения логических операций, что было намного проще.
Конечно, не достаточно просто … Библиотека termcap была не так хороша, как могла бы быть, поэтому были разработаны две другие библиотеки: curses
обеспечили более высокий уровень абстракции, включая пользовательский ввод, и terminfo сделали определения терминалов и их использование программистов проще.
В наше время ncurses
– это бесплатная повторная реализация curses
и terminfo
полностью заменил termcap
полностью. Кроме того, ANSI определила некоторые «стандартные» последовательности, основанные на цифровых терминалах, и почти каждый эмулятор терминала использует их, по крайней мере в основном, и виртуальная консоль Linux является одной из них. Очень немногие люди имеют реальные физические терминалы.
Для того, что вы пытаетесь сделать, ncurses
или команда tput
могут быть наиболее полезными. Или вы можете решить, что просто очистить весь экран (см. clear
(1)) и написать вывод тогда проще всего.
Моя цель – создать некоторое самообновляющееся многострочное консольное приложение с PHP
То, что вы пытаетесь достичь ncurses
– это путь.
Вы прочитали о ncurses. В оболочке вы можете перейти в одну строку:
tput cuu1
См. man terminfo
для получения дополнительных параметров. Но выполнение команды оболочки для перемещения курсора довольно отчаянно.
Вы просто стрелки вверх и вниз на клавиатуре, чтобы прокручивать историю консоли, но есть также команда history. Узнайте больше об истории человечества