Вопрос по c, terminal, linux – Возврат терминального курсора в начало строки с включенным переносом
Я пишу фильтр (в канале, предназначенном для вывода терминала), который иногда должен «перезаписывать»; линия, которая только что произошла. Это работает, передавая стандартный ввод в стандартный вывод до тех пор, пока\n
достигается, а затем вызывает особое поведение. Моя проблема касается того, как вернуться к началу строки.
Первое, о чем я подумал, это использовать\r
или последовательность ANSI\033[1G
, Однако, если строка была достаточно длинной для переноса на терминал (и, следовательно, заставила ее прокручиваться), они будут только перемещать курсор назад к текущемуphysical линия.
Моя вторая идея заключалась в том, чтобы отслеживать длину строки (количество символов, переданных с момента предыдущего\n
), а затем эхо\b
это много раз. Однако, это пойдет не так, если строка содержит управляющие символы или escape-последовательности (и, возможно, Unicode?).
Если не считать всех специальных последовательностей и не использовать их для настройки количества символов, есть ли простой способ добиться этого?
$ cat >test.sh <<'EOF' > #!/bin/sh > tput sc > echo 'Here is a really long multi-line string: .............................................................................................' > tput rc > echo 'I went back and overwrote some stuff!!!!' > echo > EOF $ sh test.sh I went back and overwrote some stuff!!!! ....................................... ......................................................
save_cursor
а такжеrestore_cursor
строковые возможности вterminfo
база данных.
ioctl
:
#include <sys/types.h>
#include <sys/ioctl.h>
// ...
struct winsize ws;
ioctl(1, TIOCGWINSZ, &ws);
// ws.ws_col, ws.ws_row should now contain terminal dimensions
Таким образом, вы можете предотвратить печать чего-либо за пределами строки и просто использовать\r
метод.
fgets()
и работать с целыми строками за раз, так как некоторые из моих входных данных приведут к «динамическому» вывод (например, прогрессирующее состояние прогресса), который не выводит\n
какое-то время.
оль надежно удалит последнюю записанную строку, вы ЕЩЕ ПОЛУЧИТЕ строку и последовательность на выходе (хотя и скрытые на консоли). Подумайте, что произойдет, если кто-нибудь запишет вывод в файл или передаст его по трубе другим фильтрам? Будут ли они знать, как обрабатывать такой ввод? И не говорите мне, что вы исключаете возможность записи в другое место, кроме как непосредственно на консоль. Рано или поздно кто-то захочет перенаправить вывод - может быть, даже вы!
Правильный способ сделать это состоит в том, чтобы буферизовать каждую строку в памяти по мере ее обработки, а затем решить, выводить ее или нет. Там действительно нет никакого способа обойти это.
ls
делает?