Сохранить позицию курсора и восстановить ее в терминале

Я играю с некоторыми возможностями терминала для создания асинхронного вывода в bash . Я хочу получить что-то вроде этого: при выводе строки в PROMPT_COMMAND , сохранить позицию курсора на курсоре, напечатать put ... и пойти делать другие вещи (например, печатать другую информацию); затем через некоторое время вернитесь к запомненной позиции и распечатайте что-то новое. PS1 спроектирован таким образом, что сама команда помещается в новую строку, так что асинхронный вывод – это просто текст в терминале.

Я обнаружил, что для ввода курсора в заданную позицию курсор terminfo вводит курсор, есть коды возврата, чтобы получить текущую позицию (для примера, см. Этот вопрос ). Но для меня кажется, что все они работают с позицией курсора на экране, а не в терминальном буфере. Это означает, что после ввода новой строки моя запомненная позиция будет неправильной.

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

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

  • Solaris 11 и vim F вместо конца
  • Как я могу использовать записи terminfo в FreeBSD?
  • Как получить исходный вывод форматирования команд?
  • получить все имена файлов в подкаталогах
  • Сравнение текущей базы данных terminfo с исходным файлом terminfo
  • Параметр terminfo u6
  • terminfo отключить XON / XOFF
  • Как я могу увидеть, использовались ли termcap или terminfo и как их менять?
  • One Solution collect form web for “Сохранить позицию курсора и восстановить ее в терминале”

    Большинство терминалов вы, вероятно, будете использовать escape-последовательности реализации для сохранения и восстановления позиции курсора. Это функции sc (save cursor) и rc (restore cursor) в описании терминала, которые вы можете использовать через tput (точно так же, как cup ):

     tput sc tput cup 50 10 echo some stuff echo more stuff tput rc 

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

    POSIX, кстати, документирует только часть tput потому что инструмент фактически является частью другого стандарта X / Open Curses. Это обобщается в разделе переносимости страницы руководства.

    Вернемся к вопросу: нет escape-последовательностей, которые отслеживают положение буфера (учет прокрутки). Чтобы получить это, ваше приложение должно будет отслеживать, что было отправлено на экран. Решение такой проблемы – это то, для чего предназначена библиотека curses. В простой командной строке приложения не так много, что вы можете сделать.

    Interesting Posts

    Печатать текст между тегами (включительно), если обнаружен определенный текст

    Перемещение большого количества файлов и каталогов в другой каталог

    Выпадающий терминал, когда мышь попадает в верхнюю границу рабочего стола

    Как войти в папку foo- * без фактического использования подстановочных или оболочечных расширений?

    Можно ли сохранить последовательность команд после отправки ctrl + c на промежуточном этапе?

    Какие пакеты содержат реализации IPsec и алгоритмы, которые используют его для шифрования?

    Debian Jessie Wireless Driver Broadcom Restart (rmmod modprobe) BCM43142

    Ubuntu Qmake не является исполняемым файлом

    Отображение имени сеанса экрана GNU и заголовка окна в командной строке

    Создание соединений aufs для чтения и записи

    «True» соответствует grep или awk

    Какой лучший и безопасный способ сохранить настройки приложения?

    sed или tr однострочный, чтобы удалить все числовые цифры

    Как сделать anaconda пропустить установку пакета?

    Создайте программный RAID 1 на сервере Linux (сервер openSUSE)

    Linux и Unix - лучшая ОС в мире.