Вернуться на строку вверх в консоли Linux? - PullRequest
3 голосов
/ 04 августа 2011

Я знаю, что могу вернуться к строке и переписать ее содержимое с помощью \r.
Теперь, как я могу перейти в предыдущую строку, чтобы изменить это?
Или есть даже способ печати в определенном месте курсора в окне консоли?

Моя цель - создать самообновляющееся многострочное консольное приложение на PHP.

Ответы [ 5 ]

10 голосов
/ 04 августа 2011

Используйте Экранирующие коды ANSI для перемещения курсора.Например: Esc [ 1 F.Чтобы поместить символ Escape в строку, вам нужно указать его значение численно, например, "\ x1B [1F"

Как sujoy предлагает , вы можете использовать PHP ncurses для более абстрактного способа перемещения курсора.

В то время как большинство "консолей" допускают управляющие коды ANSI, другие виды терминалов используют разные последовательности символов, ncurses предоставляет стандартизированный API, который не зависит от терминала.Быстро посмотрите на /etc/termcap (а затем man terminfo), если вы заинтересованы.

Обновление: Ответ Ларса Вирзениуса содержит полезную сводку фона.Несколько лет назад я также написал небольшую статью о терминалах .

7 голосов
/ 04 августа 2011

Виртуальные консоли Linux эмулируют старый дисплейный терминал, хотя и не идеально.См. Wikipedia на VT-100 для примера аппаратного обеспечения.

Эти терминалы считывают данные с последовательного порта и отображают их на экране.Они также искали специальные байты во входном потоке от последовательного порта и действовали на них другими способами.Например, символ перевода строки ('\ n', значение байта 10) будет идти в начало следующей строки, а символ возврата каретки ('\ r', значение байта 13) будет идти в начало текущей строки.

Что еще интереснее, байт ASCII ESC (27) запускает последовательность команд, которая может почти что угодно для курсора или дисплея.Одна такая последовательность может перемещать курсор в верхний левый угол экрана, другая - в заданную строку и столбец.Третий может очистить экран, а четвертый может заставить текст отображаться в обратном цвете.

Каждый производитель терминалов изобрел свои собственные последовательности команд (и они не всегда начинали с ESC),а затем измените их в зависимости от того, что они могут заставить делать новые версии своего оборудования.Если производитель добавил цвета или простую графику, это привело к новым последовательностям.

Адаптация каждого приложения к каждому терминалу и каждое изменение последовательностей команд было бы большой задачей.Сравните это с адаптацией каждого веб-приложения к новой версии браузера.

Как обычно, решение заключается в добавлении слоя абстракции.В Unix начальная абстракция называлась termcap и состояла из файла /etc/termcap и библиотеки для чтения файла.В файле будут указаны фактические последовательности команд, которые нужно отправить для каждой логической операции для каждой модели терминала.Таким образом, модель терминала vt102 отобразит операцию «очистить экран» в \033[2J.Это позволило прикладным программистам мыслить в терминах логических операций, что было намного проще.

Конечно, не достаточно просто ... Библиотека termcap была не так хороша, как могла бы быть, поэтому две другие библиотекибыли разработаны: curses предоставил более высокий уровень абстракции, включая пользовательский ввод, а terminfo упростила определения терминалов и их использование программистами.

В наше время ncurses - это бесплатная повторная реализация curses и terminfo почти полностью заменили termcap.Кроме того, ANSI определил некоторые «стандартные» последовательности на основе цифровых терминалов, и почти каждый эмулятор терминала использует их, по крайней мере, в основном, и виртуальная консоль Linux является одной из них.Очень немногие люди уже имеют реальные физические терминалы.

Для того, что вы пытаетесь сделать, команда ncurses или tput может быть наиболее полезной.Или вы можете решить, что просто очистить весь экран (см. clear (1)) и записать вывод в таком случае проще всего.

1 голос
/ 04 августа 2011

Моя цель - создать самообновляющееся многострочное консольное приложение с PHP

Для достижения ваших целей ncurses - это путь.

0 голосов
/ 04 августа 2011

Вы должны прочитать о курсах. В оболочке вы можете перейти на одну строку вверх:

tput cuu1

См. man terminfo для дополнительных опций. Но выполнение команды оболочки для перемещения курсора довольно отчаянно.

0 голосов
/ 04 августа 2011

Вы просто используете стрелки вверх и вниз на клавиатуре для прокрутки истории консоли, но есть также команда истории. Узнайте больше, используя историю человечества

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...