@Quttar72
Изучаю asp.net core mvc

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

При использовании консольных оболочек, например powershell или bash, при нажатии стрелок влево-вправо мы перемещаем курсор влево и вправо. А при нажатии стрелок вниз-вверх идет переключение по истории команд.

Проведя некоторые опыты, я понял, что все это делается самой консольной оболочкой. То есть, допустим если есть терминал Microsoft, который позволяет запустить тот-же powershell, то совсем не терминал хранит историю команд, а сам powershell. И не сам терминал ограничивает перемещение курсора по строке (не позволяя выйти курсору к промпту).

Вот проблема в том, что я не понимаю, что терминал посылает при этом в powershell? Сейчас моя программа посылает в powershell при нажатии стрелок на клавиатуре CSI последовательности: CUD, CUF, CUU, CUD. По документации они производят перемещение курсора, что они на самом деле буквально и повторяют. (То есть перемещают курсор вниз и вверх, а не показывают историю команд. А так-же перемещают курсор влево и вправо, но без всяких ограничений, то есть курсор может уйти за границы введенной команды и зайти на промпт)

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

Судя по исходному коду терминала(строки 180 и 390) Microsoft, при нажатии стрелки вверх отправляется эта последовательность: \x1b[1;mA где m должно меняться в зависимости от нажатия ctrl, shift, alt. Если я понял правильно, то m без нажатия этих клавиш заменяется на 1, и тогда итоговая последовательность: \x1b[1;1A Но она фактически просто переводит курсор вверх, то есть почему-то не воспринимается как нажатие стрелки вверх. (не обрабатывает как в том-же терминале)
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

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