Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement lazy-read and noshell raw mode #8962

Merged
merged 7 commits into from
Oct 30, 2024

Conversation

garazdawi
Copy link
Contributor

This PR implements a couple of new fetures to how stdin and stdout is handled by Erlang.

  • All reads from stdin are now done upon request, instead of greedingly reading all data. So it is only when an io:get_line/2 or equivilant is issued by the Erlang program that a read is done. This solves io:get_line/1 cannot read cyrillic input on Windows with -noshell #8113 and also the problem mentioned by Josè here. This change also basically makes the -noinput flag obsolete, as no data will be read from stdin without it being requested.

  • The noshell mode has been updated to have two "submodes" called raw or cooked, where cooked is the old default behaviour and raw can be used to bypass the line editing support of the native terminal. Using raw mode it is possible to read keystrokes as they happen without the user having to type Enter. The raw mode also does not echo the typed characters to stdout. An example of how to create a tic-tac-toe game using this mechanism is included in the documentation. This solves Getch for OTP26  #8037.

  • There is also a new guide added that shows how to create a custom shell with autocomplete using Erlang's builtin line editor (basically what Elixir, Luerl and other do).

@garazdawi garazdawi added team:VM Assigned to OTP team VM feature labels Oct 17, 2024
@garazdawi garazdawi added this to the OTP-28.0 milestone Oct 17, 2024
@garazdawi garazdawi self-assigned this Oct 17, 2024
Copy link
Contributor

github-actions bot commented Oct 17, 2024

CT Test Results

    6 files    303 suites   3h 10m 25s ⏱️
5 401 tests 5 070 ✅ 330 💤 1 ❌
7 972 runs  7 544 ✅ 427 💤 1 ❌

For more details on these failures, see this check.

Results for commit 28953ce.

♻️ This comment has been updated with latest results.

To speed up review, make sure that you have read Contributing to Erlang/OTP and that all checks pass.

See the TESTING and DEVELOPMENT HowTo guides for details about how to run test locally.

Artifacts

// Erlang/OTP Github Action Bot

@garazdawi
Copy link
Contributor Author

You can read the new guides here:

@garazdawi garazdawi force-pushed the lukas/kernel/shell-improvements branch from 8e32c5a to cd522a8 Compare October 22, 2024 19:25
@garazdawi garazdawi added testing currently being tested, tag is used by OTP internal CI and removed testing currently being tested, tag is used by OTP internal CI labels Oct 23, 2024
@garazdawi garazdawi force-pushed the lukas/kernel/shell-improvements branch from 4f90535 to 085259c Compare October 23, 2024 13:43
@garazdawi garazdawi added the testing currently being tested, tag is used by OTP internal CI label Oct 23, 2024
@sverker sverker removed the testing currently being tested, tag is used by OTP internal CI label Oct 23, 2024
@garazdawi garazdawi force-pushed the lukas/kernel/shell-improvements branch from c70d9fa to f321f21 Compare October 25, 2024 11:25
When running in `-noshell` mode, it is "normal" for programs
to not eagerly read from stdin. This commit changes so that
we only issue read requests to stdin when `user` has received
a read request from the application.

This change also makes it so that on Windows we don't have to
abort an ongoing read request, which means that we can use
ReadFile in non-overlapped mode and thus Unicode will work
when reading from stdin in noshell mode on windows.
When an Erlang shell gets EOF it should halt the node, however
very often stderr is also closed at the same time which caused
the error printing to crash preventing halt to be called.
@garazdawi garazdawi force-pushed the lukas/kernel/shell-improvements branch from 28953ce to bd2ba03 Compare October 30, 2024 12:25
@garazdawi garazdawi merged commit 14e885a into erlang:master Oct 30, 2024
7 checks passed
@garazdawi garazdawi deleted the lukas/kernel/shell-improvements branch November 5, 2024 12:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature team:VM Assigned to OTP team VM
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants