Elixir升级后tty_sl失效,如何无需回车获取单个控制台字符?
替代tty_sl实现无需回车获取单个字符的方法
因为Erlang 23起tty_sl被标记为弃用,Erlang 26已彻底移除,所以需要用以下方式替代:
原生Erlang/Elixir方法(无依赖)
通过修改终端模式为原始模式,结合:io.get_chars/2实现单字符输入,操作完成后务必恢复终端设置避免异常:
# 保存终端原始配置 {:ok, original_tty} = :io.getopts() # 切换到原始模式:禁用规范输入(无需回车)、关闭回显 :ok = :io.setopts([:binary, :raw, :noecho]) # 读取单个字符 case :io.get_chars('', 1) do {:ok, char} -> IO.puts("输入的字符: #{inspect(char)}") {:error, reason} -> IO.puts("读取失败: #{reason}") end # 恢复终端原始配置,避免后续终端异常 :ok = :io.setopts(original_tty)
:raw:让终端直接传递输入字符,无需等待回车触发:noecho:输入的字符不在终端回显,若需要回显可移除该选项
第三方库方法(依赖ex_readline)
如果不想手动处理终端模式,可使用封装好的ex_readline库:
- 在
mix.exs中添加依赖:
defp deps do [ {:ex_readline, "~> 0.1.0"} ] end
- 运行
mix deps.get安装后,使用以下代码:
# 读取单个字符,无需回车 char = ExReadline.read_char() IO.puts("输入的字符: #{inspect(char)}")
类Unix系统专属方法(依赖stty命令)
通过系统stty命令修改终端模式,适合类Unix环境(Linux/macOS):
# 保存终端配置,切换到raw模式并关闭回显 System.cmd("stty", ["-g"]) System.cmd("stty", ["raw", "-echo"]) # 读取单个字符 char = IO.getn("", 1) IO.puts("输入的字符: #{inspect(char)}") # 恢复终端默认配置 System.cmd("stty", ["sane"])
内容的提问来源于stack exchange,提问作者gdonald
相关产品推荐
相关产品推荐

