Обновить первые N строк и сбросить курсор на конец текущей строки с escape-последовательностями? - PullRequest
0 голосов
/ 14 декабря 2018

Вот ситуация, я хочу выполнить терминальное взаимодействие, я хочу запустить дочерний поток, чтобы обновить первые N строк, и использовать основной поток для обработки пользовательского ввода.

После этого программа напечатает изменяемую строку, возможно, некоторые журналы.

Дочерняя нить выглядит так:

    let mut count: i32 = 0;
    loop {
        println!("\x1B[2F\x1B[2KHi user1, count:{}\n", count);
        count += 1;
        let ten_millis = time::Duration::from_millis(1000);
        thread::sleep(ten_millis);
    }

например:

----------------
Hi user1, count: 0


Input:  1+1
Output: 2
----------------

Код переподготовки работает хорошо, но курсор будет сброшен к началу строки, и я хочу всегда перемещать его в конец последней строки.Как я могу сделать этот трюк?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Когда все сводится к перемещению курсора, вас могут заинтересовать простые последовательности выхода ANSI :

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

  • . Установите курсор: \033[<L>;<C>H или \033[<L>;<C>f устанавливает курсор на строку L и столбец C.
  • Переместить курсор вверх на N строк: \033[<N>A
  • Переместить курсор вниз на N строк: \033[<N>B
  • Переместить курсорвперед N столбцов: \033[<N>C
  • Переместить курсор назад на N столбцов: \033[<N>D
  • Очистить экран, перейти к (0,0): \033[2J
  • Стереть до конца строки: \033[K
  • Сохранить позицию курсора: \033[s
  • Восстановление позиции курсора: \033[u

источник: Bash Prompt HOWTO: перемещение курсора

Хотя эти escape-последовательности ANSI работают очень хорошо, время от времени вы можете быть заинтересованы в использовании tput, поскольку это дает вам больше readablilty ofваши сценарии.Объяснение tput здесь было бы немного излишним, но вышеприведенные команды можно выполнить следующим образом:

  • Установить курсор: tput cup <L> <C> устанавливает курсор на строкуL и столбец C.
  • Переместить курсор вверх на N строк: tput cuu <N>
  • Переместить курсор вниз на N строк: tput cud <N>
  • Переместить курсор вперед на N столбцов: tput cuf <N>
  • Переместить курсор назад на N столбцов: tput cub <N>
  • Очистить экран, перейти к (0,0): tput clear
  • Удалить до конца строки: tput el
  • Сохранение позиции курсора: tput sc
  • Восстановление позиции курсора: tput rc

Существует множество других доступных опций.См.

  • man tput
  • man 5 terminfo
0 голосов
/ 20 декабря 2018

Пока не совсем отвечая на ваш вопрос, стандартный bash способ сделать это - watch

Например:

watch df -h

0 голосов
/ 14 декабря 2018

Вы можете заставить ребенка «знать», что ввод выполняется, и в этом случае следовать за println!

  • дополнительным курсором вниз (то есть, \x1B[B) илиследующая строка (\x1B[E),
  • с последующим перемещением в этой строке, используя длину подсказки плюс длину текущего ввода, например, курсор вперед (то есть, \x1B[C с номеромстолбцов в качестве параметра перед C).

Что-то вроде

if (input_length) {
    cursor_down();
    cursor_forward(prompt_length + input_length);
}
...