Elixir在macOS上使用System运行“ clear”命令

Mar*_*Pop 2 elixir

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

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

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

显然,iex具有clear清除iex的便利功能。我发现此帮助程序方法来自该IEx.Helpers模块,现在我可以运行IEx.Helpers.clear并清除屏幕,然后再打印另一块板。

She*_*yar 6

就像您提到的,清除屏幕的最佳方法是调用清除助手

IEx.Helpers.clear
Run Code Online (Sandbox Code Playgroud)

要回答您的另一个问题,这是因为该System.cmd命令实际上并未将任何内容打印到控制台,而是将其返回(因此Elixir应用程序可以对其执行某些操作)。返回的字符串(\e[H\e[2J)由对应于“回家”\e[H)和“清除”\e[2J)的两个ANSI转义码组成。

您可以自己测试。调用此命令将清除屏幕(并返回:ok):

IO.puts("\e[H\e[2J")
Run Code Online (Sandbox Code Playgroud)

有趣的旁注: IEx clear helper不返回的原因:ok是由于它在末尾调用了一个特殊功能

  • 将输出重定向回控制台也可以解决以下问题:System.cmd(“ clear”,[],进入:IO.stream(:stdio,:line))。 (2认同)