Задать вопрос
@Quttar72
Изучаю asp.net core mvc

Как в терминале реализовано перемещение курсора?

Речь как про командную строку, так и про терминал Microsoft. Все они позволяют запустить Powershell и позволяют с помощью курсора перемещаться по команде. Сейчас я постараюсь максимально сжато объяснить свой вопрос на примере:

Мы вводим в консоль команду
Write-Host hey1
Мы двигаем курсор вот как показано палочкой:
Write-Host |hey1
Вписываем новую строку
Write-Host foobarhey1
И выполнив эту команду, мы действительно получим вывод строки foobarhey1 (ну в powershell)

А теперь вопрос, правильно ли я понимаю, что при вводе например первого символа f из foobar фактически в powershell вводятся следующая последовательность: \b\b\b\bfhey1 ?

И второй вопрос, он даже чуть важнее: вот эта последовательность в качестве эхо приходит от powershell в нашу консоль, получается нужно хранить реальное положение курсора после записи (которое может отличаться от текущего) и перед каждым выводом эхо возвращать положение курсора в реальное (то есть, чтобы были стерты те символы, которые нужны)?
  • Вопрос задан
  • 483 просмотра
Подписаться 3 Простой Комментировать
Решения вопроса 1
@humoured
Вы всё на свете найдёте в коробке с карандашами
Управление курсором, как и многими другими штуками в терминале, осуществляется через escape sequences.
Почитайте: Console Virtual Terminal Sequences
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov Куратор тега PowerShell
А теперь вопрос, правильно ли я понимаю, что при вводе например первого символа f из foobar фактически в powershell вводятся следующая последовательность: \b\b\b\bfhey1 ?

Нет, вы неправильно понимаете.
В powershell(а, точнее, в поток) уйдёт чистая строка. все перемещения курсора и тд не имеют никакого отношения к потокам ввода\вывода.
В поток введённые данные отправятся после enter.
Командная строка(терминал) - это куда более сложная сущность, чем просто комбинация потоков ввода и вывода.
а конкретно в powershell это ещё и разбавляется встроенным модулем подсветки синтаксиса PSReadline

P.S.
И, если уж быть полностью корректным, то Write-Host - это именно вывод в хост(терминал), чисто в поток вывода powershell оно не попадает. Для вывода в поток есть Write-Output. А то, что вывел Write-Host, попадает в поток вывода, который вы, например, можете записать в файл, уже из терминала.

Попробуйте в консоли Powershell:
PS D:\> Write-Host 'tohost' > d:\111
tohost
PS D:\> Get-Content d:\111
PS D:\> Write-Output 'tooutput' > d:\111
PS D:\> Get-Content d:\111
tooutput
PS D:\>

Разницу замечаете ?

А теперь сравните результат с
Powershell -Noprofile -Command "Write-Host 'tohost'; Write-Output 'tooutput' " > D:\111
Powershell -Noprofile -Command "Get-Content d:\111"

hint: полностью вывод попадает в файл только в последнем примере
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы