Как сохранить историю IEx?

С IEx (Elixir's REPL) я хотел бы иметь возможность сохранять мою историю команд.

Например:

Я могу открыть новый сеанс IEx и выполнить команду. После выполнения команды я могу нажать стрелку вверх и предварительно заполнить последнюю команду. После закрытия IEx и повторного открытия я хотел бы получить доступ к моим последним командам.

Есть ли способ сделать это?


person loeschg    schedule 30.07.2017    source источник


Ответы (3)


Для Erlang / OTP 20

Это встроенный (из https://hexdocs.pm/iex/IEx.html#module-shell-history).

Из Erlang / OTP 20 можно получить историю оболочки, передав некоторые флаги, которые включают ее в виртуальной машине. Это можно сделать по мере необходимости при запуске 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 из документации 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
person loeschg    schedule 30.07.2017
comment
Просто попробовал это, и кажется, что в некоторых случаях история пишется неправильно при выходе из IEx двойным нажатием _1 _ + _ 2_, что многие люди и делают. У меня не было проблем, когда я всегда завершал IEx с помощью _3 _ + _ 4_ Q Enter, хотя, в любом случае, это более чистый способ выйти из IEx. - person Patrick Oscity; 31.07.2017
comment
Я заметил, что иногда это связано с тем, насколько быстро вы бросаете курить. Может быть, это своего рода состояние гонки за записью в файл? - person loeschg; 31.07.2017
comment
Ха-ха, может быть, просто нужно больше времени, чтобы нажать эту безумную комбинацию клавиш, поэтому у меня меньше шансов столкнуться с проблемой ;-) - person Patrick Oscity; 31.07.2017
comment
В MacOS необходимо создать пустой файл истории, иначе он не сработает: $ touch ~ / .iex_history - person Andrei Sura; 19.09.2017
comment
в чем преимущество ctrl-G Q enter перед ctrl-C a enter? - person jaydel; 13.03.2018
comment
@jaydel Я думаю, это то же самое, что выключить компьютер, нажав кнопку питания, или использовать функцию выключения вашей ОС: состояние сохраняется, не заканчивается ошибкой и т. д. - person Augustin Riedinger; 15.04.2019
comment
AFAIC iex --erl "-kernel shell_history enabled" работает, но ERL_AFLAGS="-kernel shell_history enabled" как переменная среды не работает в докере. Если у кого-то есть идея, я был бы счастлив, но я могу жить без нее. - person Augustin Riedinger; 15.04.2019
comment
@AndreiSura В Linux тоже. Похоже, что файл ~/.iex_history должен существовать. - person Ludovic Kuty; 12.03.2020

Я использую oh-my-zsh, поэтому ставлю vim ~/.zshrc:

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

затем source ~/.zshrc и теперь всегда загружается. Спасибо @loeschg.

person rld    schedule 07.12.2018

Я не знаю, изменилось ли что-то в какой-то момент, но я обнаружил, что вышеперечисленное не сработало. Посмотрев на страницу руководства по iex, я заметил, что она должна быть

export ELIXIR_ERL_OPTIONS="-kernel shell_history enabled"

(обратите внимание на дополнительный ЭЛИКСИР). Возможно, исходное решение было убедительным и подходило для erl (я обнаружил, что для этого оно работает), но iex добавил квалификатор? Поскольку исходный вопрос был для iex, решил, что его следует обновить.

person Travis Griggs    schedule 04.06.2021
comment
Могу подтвердить, что принятый ответ больше не работает, и вышеперечисленное сработало. Стоит отметить (как уже упоминалось другими), что если вы используете ctrl + c для выхода (как я), вам нужно будет использовать ctrl + g после q и ввести - person Mark; 05.07.2021