【问题标题】:How to cleanly take multiline input from the terminal using Elixir?如何使用 Elixir 从终端干净地获取多行输入?
【发布时间】:2019-10-06 05:17:19
【问题描述】:

作为实践,我正在尝试编写一个小的 Elixir 脚本,它将接收来自终端的用户输入并将其写入文件。我的目标是能够一次接受来自终端的多行用户输入(在当前迭代中跟随一些终止符)。

就这个初始任务而言,我当前且相对幼稚的方法确实有效:我有一个递归 get_line/2 函数,它将接受一行输入,将其连接到以前接受的所有输入,然后它会调用本身。如果它采用的输入行是指定的“终止符”(在这种情况下为":done\n"),那么它将所有连接的输入写入文件。

所以这确实有效,但我想知道是否有更好的方法,因为这是一个比将文件读入终端的程序要复杂得多,实际上只有两行左右。

代码:

# Mission: find a way to accept multiple lines of input from the
# terminal at once, and write the input into an md file 'my_file.md'.

# Naive approach: read line-by-line in a loop until a terminator is
# reached.

defmodule Term2file do
  def get_input() do
    IO.gets("> ")
    |> get_line()
  end

  defp get_line(line, data \\ "") do
    case line do
      ":done\n" ->
        File.write!("./my_file.md", data, [:append])
      _ ->
        new_data = data <> line
        get_line(IO.gets("> "), new_data)
    end
  end
end

Term2file.get_input()

在理想的世界中,我将能够以与 Discord(或其他消息服务)类似的方式接受输入,其中可以使用 shift-enter 输入换行符,而使用 enter 通常会“完成”消息 -允许在输入之前编辑整个输入,甚至跨换行符。然而我认为这可能是不合理的,并且感觉这需要大量“战斗”终端本身的性质,但也许我的直觉是错误的。

无论如何,我想知道我是否让这个解决方案过于复杂,以及是否有我错过的更简单或更直接/惯用的方法。

【问题讨论】:

  • 嗯,有意思,以前看的时候没发现这个。脱离链接的答案,看起来并没有一个简单的解决方案(参考逐个字符的方法)。 @AlekseiMatiushkin

标签: windows file terminal io elixir


【解决方案1】:

您可以使用流来遍历 I/O 设备并写入文件:

defmodule Term2file do
  def get_input() do
    IO.stream(:stdio, :line)
    |> Stream.take_while(& &1 != ":done\n")
    |> Enum.into(File.stream!("./my_file.md", [:append]))
  end
end

Term2file.get_input()

这意味着您将在输入行时写入文件。您也不必担心管理资源。唯一的缺点是您不能有自定义提示(如果 PR 可以添加此选项,我们将不胜感激)。

在理想情况下,我将能够以与 Discord(或其他消息服务)类似的方式接受输入,其中可以使用 shift-enter 输入换行符,并且通常使用 enter 将“完成”消息

AFAIK,这是不可能的,因为 shift-enter 和 enter 与终端没有任何区别?但是您可以使用 Ctrl+D 发送 EOF 指令,导致 IO.stream 终止。这仅适用于上面的 sn-p,但您也可以更改程序以相应地处理 Ctrl+D 输出。

【讨论】:

  • 男人本人!非常感谢,这个肯定更简洁了一点,我之前尝试过使用IO.stream,但当时我并不知道Stream.take_while这个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多