При использовании консольных оболочек, например 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 Но она фактически просто переводит курсор вверх, то есть почему-то не воспринимается как нажатие стрелки вверх. (не обрабатывает как в том-же терминале)