38

使用 IEx(Elixir 的 REPL),我希望能够保存我的命令历史记录。

例如:

我可以打开一个新的 IEx 会话并执行一个命令。执行命令后,我可以按向上箭头并预先填充我的最后一个命令。关闭 IEx 并重新打开后,我想访问我最后的命令。

有没有办法做到这一点?

4

4 回答 4

73

对于 Erlang/OTP 20

这是内置的(来自https://hexdocs.pm/iex/IEx.html#module-shell-history

从 Erlang/OTP 20 开始,可以通过传递一些在 VM 中启用它的标志来获取 shell 历史记录。这可以在启动 IEx 时根据需要完成:

iex --erl "-kernel shell_history enabled"

如果您希望在整个系统上启用它,您可以使用ERL_AFLAGS环境变量并确保在您的终端/shell 配置中相应地设置它。

在 Linux [和 macOS] 上:

export ERL_AFLAGS="-kernel shell_history enabled"

在 Windows 上:

set ERL_AFLAGS "-kernel shell_history enabled"

要显示历史文件的位置,请从 erl 运行以下代码(显示 Mac OS 示例值):

1> filename:basedir(user_cache, "erlang-history")
"/Users/your.username/Library/Caches/erlang-history"

要将文件设置到不同的位置,请使用shell_history_path /path/to/history-file erlang 文档中的选项(与 Elixir/iex 兼容)

export ERL_AFLAGS="-kernel shell_history_path '\"$HOME/.erlang-history\"'"

对于 Erlang/OTP 19 及以下版本

尝试使用https://github.com/ferd/erlang-history

> git clone https://github.com/ferd/erlang-history.git
> cd erlang-history
> sudo make install    # may not need sudo depending on installation
于 2017-07-30T21:54:53.740 回答
9

我不知道事情是否在某个时候发生了变化,但我发现上述方法不起作用。在查看 iex 的手册页后,我注意到它需要

export ELIXIR_ERL_OPTIONS="-kernel shell_history enabled"

(注意额外的 ELIXIR)。也许最初的解决方案是有说服力的与 erl 相关(我发现它适用于那个),但 iex 添加了限定符?由于最初的问题针对 iex 的,因此认为应该对其进行更新。

于 2021-06-04T19:56:33.087 回答
2

我正在使用 oh-my-zsh,所以我穿上了vim ~/.zshrc

# Enable history in IEX through Erlang(OTP)
export ERL_AFLAGS="-kernel shell_history enabled"

当时source ~/.zshrc和现在总是加载。谢谢@loeschg。

于 2018-12-07T15:16:33.663 回答
1

对于 docker compose,您需要创建一个卷来保存历史记录,并通过-kernel shell_history_path. 路径必须是 Erlang 术语,因此请确保它是'"tripple quoted"'

version: '3'

services:
  elixir:
    environment:
      ERL_AFLAGS: -kernel shell_history enabled -kernel shell_history_path '"/somewhere/sensible"'
    volumes:
      - type: volume
        source: shell_history
        target: /somewhere/sensible

volumes:
  shell_history:
于 2021-12-20T08:23:39.377 回答