Как обнаружить клавишу Enter при вставке многострочного текста (содержащего `\r`)?

При разработке редактора строк на C++ я использую getch() для захвата каждого ввода клавиши и вижу \r(13 в ASCII) как клавишу Enter. Однако при вставке текста, содержащего несколько строк, программа ошибочно интерпретирует \r внутри текста как нажатие клавиши Enter.

Я заметил, что в некоторых оболочках при вставке нескольких строк они автоматически обрабатывают ввод как новые строки, не выполняя каждую строку отдельно. Мне интересно, как они этого достигают. Обнаруживают ли они нажатия клавиш, не полагаясь на getch()?

Есть ли в C или C++ кроссплатформенный способ эффективного решения этой проблемы?

🤔 А знаете ли вы, что...
C++ используется для создания компиляторов, интерпретаторов и других инструментов разработки.


1
50
1

Ответ:

Решено

Мне кажется, вы здесь смешиваете понятия Shell и console.

Во-первых, независимо от того, печатаете ли вы что-то или вставляете, вы фактически вызываете прерывание. Как обрабатывается прерывание, зависит от того, какой процесс вы сейчас выполняете.

В вашей ситуации, конечно, терминал/консоль работает в данный момент, прерывание обрабатывается консолью, поэтому вы мгновенно получаете только что набранный символ, отображаемый на дисплее.

До сих пор все, что вы вводили/вставляли, не выполнялось, они просто помещались в буфер до тех пор, пока не будет нажата кнопка «ввод/возврат», которая может быть одним символом «\n» или «\r\n» в Linux и Windows соответственно. , затем Shell возьмет на себя управление и выполнит ваши инструкции.

Итак, ваше утверждение:

они автоматически обрабатывают ввод как новые строки, не выполняя каждую строку отдельно.

Причина, надеюсь, на данный момент очевидна:

  • Они отображаются в виде нескольких строк, потому что они сами по себе состоят из нескольких строк, а консольный процесс просто показывает все, что есть.
  • Первая строка не выполняется немедленно, потому что вы не нажали возврат на клавиатуре, только когда прерывание сигналов возврата/ввода обрабатывается вашей консолью, оболочка возьмет на себя управление и выполнит. Тем не менее, когда вы нажимаете клавишу «Return», они все равно будут выполняться как отдельные команды, если только в конце каждой строки не добавляется «\».