【问题标题】:Elixir run "clear" command using System on macOSElixir 在 macOS 上使用系统运行“清除”命令
【发布时间】:2019-04-01 22:12:45
【问题描述】:

我有一个长生不老药游戏实现,它将“板”打印到 STDOUT,我想在打印下一个版本的板之前清除屏幕。我检查了elixir documentation,我认为这就像调用System.cmd("clear", []) 一样简单,但这似乎并不能解决问题:

iex(1)> System.cmd("clear", [])
{"\e[H\e[2J", 0}

似乎返回了一些转义字符,但我不确定这意味着什么。 我的问题是为什么System.cmd("clear", []) 不起作用?还是我期望它应该清除屏幕错误(以及为什么)?

显然 iex 有一个方便的功能clear 来清除在 iex 中工作的屏幕。我发现这个辅助方法来自IEx.Helpers 模块,我现在可以运行IEx.Helpers.clear,它会在打印另一块板之前清除屏幕。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    就像你提到的,最好的清除屏幕的方法是拨打clear helper

    IEx.Helpers.clear
    

    要回答您的其他问题,这是因为 System.cmd 命令实际上并未将任何内容打印到控制台,而是将其返回(因此 Elixir 应用程序可以对其进行处理)。返回的字符串 (\e[H\e[2J) 由对应于 "go home" (\e[H) 和 "clear" (\e[2J) 的两个 ANSI 转义码组成.

    你可以自己测试一下。调用它会清除屏幕(并返回:ok):

    IO.puts("\e[H\e[2J")
    

    有趣的旁注:IEx clear helper 之所以不返回:ok,是因为它最后调用了special function

    【讨论】:

    • 将输出重定向回控制台也可以解决问题:System.cmd("clear", [], into: IO.stream(:stdio, :line))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多