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



@Quttar72

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

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

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

И второй вопрос, он даже чуть важнее: вот эта последовательность в качестве эхо приходит от powershell в нашу консоль, получается нужно хранить реальное положение курсора после записи (которое может отличаться от текущего) и перед каждым выводом эхо возвращать положение курсора в реальное (то есть, чтобы были стерты те символы, которые нужны)?


Решения вопроса 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: полностью вывод попадает в файл только в последнем примере

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *