You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库:

  1. 在mix.exs中添加依赖:
defp deps do
  [
    {:ex_readline, "~> 0.1.0"}
  ]
end
  1. 运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:47:49