Как такие программы, как Emacs и Nano, получают пользовательский ввод во время работы в терминале без необходимости нажатия пользователем клавиши ввода?

Такие программы, как Emacs и Nano, могут работать в окне терминала и принимать пользовательский ввод в реальном времени, как я могу сделать это самостоятельно? Я хочу использовать С++, но вижу, что для этого может потребоваться взаимодействие с bash. Как я могу вводить данные (будь то с помощью мыши или клавиатуры) из окна терминала без необходимости нажатия пользователем клавиши ввода?

Моя целевая платформа — Mac OSX версии 10.13.5, но также приветствуются ответы о том, как это сделать на других платформах, таких как Windows или Linux.


person Shades    schedule 15.08.2018    source источник
comment
Оба этих редактора имеют открытый исходный код. Если вам интересно, как они делают то или иное, вы можете просто просмотреть исходный код.   -  person SergeyA    schedule 15.08.2018
comment
@SergeyA Исходный код этих программ ОГРОМНЫЙ. Передо мной лежит код для nano, сотни и сотни C и заголовочных файлов. Emacs будет еще сложнее. Я понимаю, что в конце концов я смогу его найти, но это займет очень много времени, и на самом деле это больше работы, чем нужно. Я только спрашиваю, есть ли у кого-нибудь способ делать такие вещи.   -  person Shades    schedule 15.08.2018
comment
Вам нужно будет использовать команды для конкретной платформы, такие как GetAsyncKeyState в Windows или библиотека, например ncurses< /а>.   -  person 0x5453    schedule 15.08.2018
comment
@ 0x5453 Любые команды Bash, которые могут это сделать? Ncurses может быть кувалдой, чтобы расколоть арахис в этом случае.   -  person Shades    schedule 15.08.2018
comment
@Shades Тот факт, что вы продолжаете говорить о команде bash, ясно указывает на то, что вы не готовы заняться этим вопросом. Я серьезно предлагаю вам взглянуть на исходный код (на самом деле нано не так уж и велико). Кстати, он использует ncurses.   -  person SergeyA    schedule 15.08.2018
comment
stackoverflow .com/questions/22832933/   -  person stark    schedule 15.08.2018
comment
@SergeyA Я просто надеялся, что есть способ сделать это без больших библиотек. Я новичок в сценариях Bash, но я не новичок в C++. Я не хотел тебя расстраивать.   -  person Shades    schedule 15.08.2018
comment
emacs по сути является приложением termcap (а не curses). Кстати, это дубликат...   -  person Thomas Dickey    schedule 15.08.2018
comment
Кстати, Emacs написан на LISP и не имеет ничего общего с C++.   -  person Thomas Matthews    schedule 15.08.2018


Ответы (1)


Эти программы переводят терминал в режим raw, а не в режим cooked. Режим Cooked читается построчно и обрабатывается драйвером терминала, а режим raw читается посимвольно и вместо этого обрабатывается работающей программой.

Этот ответ содержит больше информации.

Этот репозиторий — это простой проект, реализующий этот режим, из которого вы можете извлечь уроки. man termios также предоставит вам информацию об управлении режимами терминала.

person Major    schedule 15.08.2018