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

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

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

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

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

  • Solaris 11 и vim F вместо конца
  • Почему ключ END не имеет записи terminfo?
  • Параметр terminfo u6
  • Как использовать terminfo для установки цветов для человека и менее?
  • получить все имена файлов в подкаталогах
  • Как я могу использовать записи terminfo в FreeBSD?
  • Набор библиотек, таких как ncurses в сценарии оболочки
  • Как я могу увидеть, использовались ли 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

    Программный RAID 1 с разной производительностью и производительностью

    Как действительно работает системный вызов fork

    Как захватить ввод командной строки в файл журнала и выполнить его одновременно?

    извлечение tar зависит от имени файла?

    Опция NFS Reload без перезагрузки службы

    Плагин Nagios для мониторинга всех доступных сервисов на Linux

    Как установить ClamAV для ручной работы в Linux (без автоматических задач cron)

    Kali GNU / Linux Rolling 64-bit – проблема с установкой беспроводной сети CryptSetup Dropbear

    Создание отчета об использовании ресурса отчета для дочерних процессов

    Шифрование тома Linux: можно указать собственный инструмент шифрования?

    Найти файлы дубликатов файлов и заглавные буквы rm

    Antergos linux продолжает замораживать

    Как сделать символическую ссылку от / A до / B, от запуска в / C

    Каковы последствия рекурсивного использования каталогов на внешнем диске, который в настоящее время имеет разрешения 501: dialout или root: root?

    Как я могу получить пять секунд данных, добавленных в конец файла?

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