25

我刚开始使用 Elixir 并且已经使用了iex相当多的 shell。我可以将“会话”保存/记录到文件中吗?

谢谢你。

4

2 回答 2

46

在 Erlang/OTP-20 及更高版本中

从 Erlang/OTP-20rc2 开始,通过这个库的端口到 Erlang/OTP 代码库,Shell 历史记录得到开箱即用的支持(尽管最初默认禁用) 。shell_history通过将内核环境变量设置为启用并export ERL_AFLAGS="-kernel shell_history enabled"添加到您的环境变量来启用这些版本中的 shell (请参阅配置选项以查看更多选项)。

-- https://github.com/ferd/erlang-history

故障排除

历史似乎没有更新(没有写入文件)?

似乎将历史记录写入文件的过程是异步执行的,并且在关闭 IEx shell 之前需要一些时间来执行此操作。在退出 shell 之前,您需要稍等片刻(例如按<ctrl+\>)。


预 Erlang/OTP-20:

我找到了两种方法来做到这一点。

1. Erlang 历史

erlang-history (eh) 是一对很小的文件,可用于修补 Erlang-OTP 系统以在 Erlang shell 中添加对历史记录的支持。

支持的历史记录是通过键盘上的向上/向下箭头可用的历史记录。

在 Ubuntu Linux 中安装:

sudo su
cd /usr/local/src
git clone https://github.com/ferd/erlang-history.git
cd erlang-history
make install

现在每个现在开始的基于 Erlang 的 REPL(也就是 IEx)都应该使用erlang-history.


2. rlwrap

作为替代方案,您可以尝试更通用的 REPL 增强器/修复器rlwrap,它是“readline 包装器”:

...一个小实用程序,它使用 GNU readline 库来允许编辑任何命令的键盘输入。

rlwrap -a -A iex -S mix

(如果您使用的是 Ubuntu Linux,请使用sudo apt-get install rlwrap:)

它让您可以向 REPL 添加更多功能,例如 pipeto 过滤器rlwrap -a -z pipeto iex,它可以让您通过管道将内容传递给 shell 命令 - 对于阅读文档非常有用,即iex> h Stream | less:(更多

知道缺点:

  • 它破坏了 IEx 中的代码完成(即选项卡完成)

为什么这个非常有用的特性——命令历史——还没有包含在 Elixir/Erlang 中?


使用时asdf看到这个

于 2015-02-14T09:51:25.783 回答
10

不是现在。不过,您可能可以编写一个小的 iex 插件来为您执行此操作。例如,我有以下文件~/.iex.exs

# .iex.exs
defmodule IExHelpers do
  def reload! do
    Mix.Task.reenable "compile.elixir"
    Mix.Task.run "compile.elixir"
  end
end

iex = IExHelpers


# $ iex -S mix
# iex(2)> iex.reload!
# :noop

这会重新编译当前项目并重新加载它,同时仍在使用iex -S mix. 您可能会写一些东西来将当前 shell 的历史记录保存到文件中,然后在启动时将其读回,但我不确定您将从哪里开始。

于 2014-03-15T22:01:22.820 回答