Основная сторона pty читает дополнительные \r\n после каждой записи в macOS

У меня есть скрипт Python, который pty.fork() s xterm -S/1 (задокументировано как -Sccn). Это должно позволить мне отладить его в IDE, консоль которого в противном случае не смогла бы обработать все управляющие символы.

И действительно, когда дело доходит до отображения результатов, все работает отлично. Тем не менее, для сценария всегда выглядит так, как будто пользователь спам Enter ключ в xterm окно. Реальные нажатия клавиш также принимаются, но смешиваются с фальшивыми Enter s.

Я проверил с dtruss и вот как это выглядит с точки зрения системного вызова:

read(0x5, "3\0", 0x1)        = 1 0
write_nocancel(0x5, "/censored/ prompt> 3/censored/\0", 0x61)        = 97 0
read(0x5, "\r\0", 0x1)       = 1 0
read(0x5, "\n\0", 0x1)       = 1 0

Первый read() соответствует мне нажатия 3, что правильно. Затем скрипт обновляет графический интерфейс, что тоже правильно. Тем не менее, тогда он получает фальшивку \r\n, которые интерпретируются как нажатия клавиш. Это не xterm сторона, которая отправляет их:

write(0x1, "3\0", 0x1)       = 1 0
read(0x1, "/censored/ prompt> 3/censored/\0", 0x1000)        = 96 0

Так что я думаю, что это что-то внутри macOS, которое внедряет эти символы - может быть, какой-то механизм подтверждения? Было бы здорово узнать, что вызывает эти дополнительные \r\n появиться, и как либо убедиться, что он больше этого не делает, либо заставить скрипт обрабатывать их изящно.

Обновление: это должно быть проблемой при взаимодействии с urwid "s raw_display, поскольку curses_display вариант отлично работает. Я загрузил текущую версию скрипта на GitHub. Следующее работает отлично:

via-xterm urwid/examples/input_test.py

и следующее показывает проблему:

via-xterm urwid/examples/input_test.py r

Обновление 2: после некоторых проб и ошибок я обнаружил, что очистка IEXTEN бит решает проблему. Тем не менее, у меня нет объяснения, почему это работает.

0 ответов

Другие вопросы по тегам