我正在查看io
模块http://erlang.org/doc/man/io.html#read-1
并发现阅读输入使用提示并等待用户按Enter键(返回?)。
如何一次读取1个字符而不需要输入?
修改
我试过了
io:setopts([{binary, true}])
但这并没有改变它。
答案 0 :(得分:3)
将自己束缚在quantumpotato,你即将进入一个你从未意识到的痛苦世界。
负责任的程序员会告诉你,没有办法做到这一点,当然不是便携式的。
现在,短语"不便携" 已经被像CHAR_BIT != 8
这样的迂腐热梦想所迷惑,巧妙地说服每个人都不能携带'意味着"一些建于60年代后期的LSD附加系统无法运行这个" 或"在Windows上运行"# 34。
不,你将要遇到的是那种导致我们的祖先志愿者使用autotools的可移植性问题。真的,不可以在不同的,甚至是POSIX"兼容的"系统中移植。
正如您可能想象的那样,理所当然的方法是依赖Ncurses之类的东西,但正如许多生活必需品一样,Erlang不存在非NIF实现。
尽管我刚刚给了你所有这些警告,但这就是我过去所做的一切:
-module(thing).
-compile(export_all).
get_char() ->
Ch = io:get_chars("p: ", 1),
io:fwrite("Ch: ~w", [Ch]).
start() ->
io:setopts([{binary, true}]),
get_char().
单独,这当然不会奏效。因此,您需要从另一个设置适当的termios输入标志的脚本调用您的脚本。正如我之前提到的那样,这在过去是一个真正的废话,我还没有听到任何让我相信情况发生变化的事情。
#!/bin/sh
stty --f /dev/tty icanon raw
erl -pa ./ -run thing start -run init stop -noshell
stty echo echok icanon -raw
可以调用" stty"或者也可以从Erlang程序中发送魔术字符,但是如果内存服务,则需要使用erl
调用-noshell
并添加其他stty
咒语,例如time
和{{1 }}
我过去遇到的另一个问题是,虽然您可以安全地使用echo 0
,但其他get_chars
功能会失败,因为其中一些功能会有自己的内置功能。在线烹饪'。
如果所有这些还没有说服你,计算机已成为人类的灾难,你可以在优秀的书The Linux Programming Interface中阅读更多关于这方面的细节。
祝你好运。