【问题标题】:How do I save IEx history?如何保存 IEx 历史记录?
【发布时间】:2018-01-06 09:17:45
【问题描述】:

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

例如:

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

有没有办法做到这一点?

【问题讨论】:

    标签: elixir elixir-iex


    【解决方案1】:

    适用于 Erlang/OTP 20

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

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

    iex --erl "-kernel shell_history enabled"

    如果您愿意启用 它在您的整个系统上,您可以使用ERL_AFLAGS 环境 变量并确保在您的 终端/外壳配置。

    在 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 option from the erlang docs (compatible with 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
    

    【讨论】:

    • 刚刚尝试过,似乎在某些情况下通过点击Ctrl+C 两次退出IEx 时历史记录未正确写入,许多人都这样做。我总是用Ctrl+GQEnter 终止IEx 时没有问题,无论如何,这是退出IEx 的更干净的方式。
    • 我注意到有时它与你戒烟的速度有关。可能是某种文件写入竞争条件?
    • 哈哈也许只是需要更长的时间才能击中这个疯狂的组合键,所以我不太可能遇到问题;-)
    • 在 MacOS 上你必须创建一个空的历史文件,否则它不起作用:$ touch ~/.iex_history
    • @jaydel 我想这与通过按电源按钮关闭计算机与使用操作系统的“关闭”功能相同:状态已保存,不会以错误结束等.
    【解决方案2】:

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

    export ELIXIR_ERL_OPTIONS="-kernel shell_history enabled"
    

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

    【讨论】:

    • 可以确认已接受的答案不再有效,并且上述方法有效。值得注意的是(正如其他人提到的),如果您使用 ctrl+c 退出(就像我一样),您需要使用 ctrl + g 后跟 q 并输入
    【解决方案3】:

    我用的是oh-my-zsh,所以我换上了vim ~/.zshrc

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

    然后是source ~/.zshrc,现在总是加载。谢谢@loeschg。

    【讨论】:

      【解决方案4】:

      对于 docker compose,您需要创建一个卷来保存历史记录,并通过 -kernel shell_history_path 告诉 Erlang 它在哪里。路径必须是 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:
      

      【讨论】:

        猜你喜欢
        • 2019-12-24
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 2012-12-31
        • 1970-01-01
        • 2011-10-24
        相关资源
        最近更新 更多