Очистить часть экрана терминала в C ++ Unix? - PullRequest
0 голосов
/ 08 июля 2011

Я хочу вывести материал в окно терминала, а затем очистить только его часть (например, первую половину или четверть и т. Д.), А не остальные.Есть ли способ, которым я могу сделать это?Я использовал систему («очистить»), но это все очищает.Я бы предпочел НЕ использовать ncurses.Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 08 июля 2011

Если вы выясните, каковы возможности вашего терминала, вы можете просто записать их в стандартный вывод с помощью cout.

Если вы не уверены, с чего начать, вы можете поэкспериментировать следующим образом: По приглашениювведите man terminfo, и вы можете получить список возможностей терминала.Попробуйте их с помощью tput, чтобы увидеть, какие из них работают.Затем выясните, какие коды вам нужно напечатать, с чем-то вроде:

% tput el | od -t x1 
0000000    1b  5b  4b                                                    
0000003

При отправке этих байтов на мой терминал выдается "clr_eol" ("el"), который очищается до конца строки.Поработайте, как переместить курсор на вашем терминале, как очистить линии, и все готово.

Видя, что вы используете gnome-терминал, вы можете сделать это, чтобы стереть 3 верхние строки: переместитькурсор к дому, стирание до конца строки, перемещение вниз, стирание до конца строки, перемещение вниз, стирание до конца строки.

Чтобы выяснить, что вам нужно напечатать:

% ( tput home ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ) | od -t x1
0000000    1b  5b  48  1b  5b  4b  0a  1b  5b  4b  0a  1b  5b  4b  0a  1b
0000020    5b  4b  0a  1b  5b  4b                                        
0000026

Отправка этих байтов (1B 5B 48 и т. Д.) В stdout (с cout) сделает то же самое из C ++.

Использование ncurses будет более переносимым, если вы не хотите его использовать, вы можетеобнаружите, что вы в конечном итоге реализуете его.

3 голосов
/ 08 июля 2011

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

Вы можете узнать, как вернуться в терминал в этом посте.Он включает в себя несколько примеров, которые показывают, как использовать символ возврата каретки (\ r).

Кроме того, есть также пример, который показывает, как использовать escape-последовательности ANSI для получения красного текста.Таким же образом, вы можете записать в определенную позицию на терминале, используя escape-последовательности ANSI, посмотрите здесь .«Force Cursor Position» в этой ссылке должен дать вам возможность писать пробелы в каждую позицию, которую вы хотите очистить.

Однако вы должны знать, что не все терминалы поддерживают эти методы и что если вы транслируетеваш вывод в файл, он будет содержать эти специальные символы.

0 голосов
/ 22 декабря 2011

Существует две escape-последовательности VT100 для очистки от курсора и вверх / вниз до верхней / нижней части экрана соответственно.

См. http://www.termsys.demon.co.uk/vtansi.htm

...