While the erl application is really useful to tinker with Erlang modules,
the lack of a persistent history has always been annoying. I recently
discovered via Adopting
Erlang that the history
can be made persistent since Erlang 20 with specific flags, which can be added
to the ERL_AFLAGS environment variable to have them enabled by default.
Shell history is handled by the group_history module; since this module is
part of the kernel application, the configuration flags are provided with
the -kernel command line argument (see the [erl
documentation](application:get_env(kernel, shell_history_drop)), specifically
the -Application Par Val syntax. An interesting property of this
mechanism is that parameters are passed as Erlang terms. Therefore a string
should be passed in shell as '"foo bar"'.
The module will simply use application:get_env(kernel, Name) to read these
parameters.
The kernel_app documentation presents the following parameters:
shell_history: whether to enable or disable permanent history.shell_history_drop: a list of commands to be omitted from the history.shell_history_file_bytes: the maximum size of the history.shell_history_path: the path of the directory to write history to.
It is really simple to add these flags to ERL_AFLAGS, for example in
$HOME/.zshenv for the zsh shell:
ERL_AFLAGS="+pc unicode"
ERL_AFLAGS="$ERL_AFLAGS -kernel shell_history enabled"
ERL_AFLAGS="$ERL_AFLAGS -kernel shell_history_path '\"$HOME/.erl_history\"'"
export ERL_AFLAGS
I only found two small issues with this feature:
- There is a small delay between the time an entry is saved and the moment is is actually written to disk. Therefore quitting quickly after entering a command may result in the entry missing from the history.
- History searching with
C-rseems to work, but is far less powerful than the readline feature. Good enough I guess.