【发布时间】:2014-04-21 00:37:39
【问题描述】:
我刚开始使用 Elixir,并且一直在使用 iex shell。我可以将“会话”保存/记录到文件中吗?
谢谢。
【问题讨论】:
我刚开始使用 Elixir,并且一直在使用 iex shell。我可以将“会话”保存/记录到文件中吗?
谢谢。
【问题讨论】:
从 Erlang/OTP-20rc2 开始,通过 this library 到 Erlang/OTP 代码库的端口开箱即用地支持 Shell 历史记录(尽管最初默认禁用)。通过将
shell_history内核环境变量设置为启用并在您的环境变量中添加export ERL_AFLAGS="-kernel shell_history enabled"来启用这些版本中的shell(请参阅Configuration Options 以查看更多选项)。
-- https://github.com/ferd/erlang-history
似乎将历史记录写入文件的进程是异步执行的,并且在关闭 IEx shell 之前需要一些时间来执行此操作。您需要稍等片刻才能退出 shell(例如,按 <ctrl+\>)。
我找到了两种方法。
erlang-history (eh) 是一对很小的文件,可用于修补 Erlang-OTP 系统以在 Erlang 中添加对历史记录的支持 外壳。
支持的历史记录是通过上/下箭头可用的历史记录 键盘。
在 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。
作为替代方案,您可以尝试更通用的 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 (more)
了解缺点:
为什么 Elixir/Erlang 中还没有包含这个非常有用的功能 - 命令历史记录?
【讨论】:
erlang-history 似乎效果很好。
Erlang/OTP-20 中所做的这个主题的进步。现在更容易让它工作了。
目前没有。不过,您可能可以编写一个小的 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 中。您可能可以编写一些东西来将当前 shell 的历史记录保存到文件中,然后在启动时将其读回,但我不确定您将从哪里开始。
【讨论】:
r ModuleName 有何不同?是否会重新编译整个应用程序?