Как упражнение в понимании моего компьютера лучше, и как инструмент, я пишу my own shell в C++. Stephen Brennan's article on writing a simple shell был очень полезным.Написание моей собственной оболочки: как реализовать историю команд?
Однако, что мне смутно, как справиться с нажатием стрелки вверх и стрелки вниз для прокрутки моей истории команд.
Я попытался
ncurses
, но заменяет весь экран, в то время как система, при условии, оболочка кажется просто продолжать писать в терминал.Я попытался использовать
tcgetattr
, чтобы отключить канонический режим, но хотя это позволяет мне нажимать клавиши со стрелками при их вводе, он также отключает всю обработку клавиш со стрелками влево/вправо для текстовой навигации и клавиши возврата, и Ctrl-C ... Хотя я мог бы, вероятно, послать сигнал сам в ответ на Ctr-C, я понятия не имею, как заставить терминал переместить курсор назад (кроме вывода «возврата» и повторной записи начала линии). Кажется, это также дает мне разные escape-последовательности для ключей, в зависимости от того, запущен ли я в «тупиком» терминале Xcode или в Terminal.app моего Mac.Я смотрел на источники для
fish
Shell иbash
, но только кажется, что так происходит, что я не могу найти соответствующие части.
Как стандартная оболочка обрабатывает принимающие нажатия клавиш? Как они обрабатывают перемещение курсора и выполняют обратное пространство? Как они переписывают части строки без необходимости перехватывать экран? Есть ли где-то стандарт, определяющий, что нужно делать оболочке?
PS - Я знаю, как записывать предыдущие команды. Это на самом деле получение нажатий клавиш, когда они печатаются, а не после того, как кто-то нажимает на них, что я не могу работать.
Используйте [GNU Readline] (https://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) или эквивалент [BSD editline] (HTTP: // thrysoee.dk/editline/). –
Close-voters: Надеюсь, вы прочитали обновленный вопрос, кажется, сейчас хорошо :) –
Я вообще не знаю, как это реализовано, но мое подозрение в том, что оболочка переписывает весь экран (à la ' ncurses'). Например, если я нажимаю C-l в 'bash', он очищает весь экран. Это говорит о том, что оболочка делает больше, чем просто управление одной строкой за раз. Я думаю, что библиотеки, подобные 'readline', так же захватывают весь терминал. –