我试图创造出接受用户输入的类似的方式,程序iex或erl做(例如:按允许键来浏览过去的历史时).
如果标准IO.gets使用如下,
IO.gets "user> "
Run Code Online (Sandbox Code Playgroud)
按下向上允许时,控制台最终会出现以下情况.
user> ^[[A^[[A
Run Code Online (Sandbox Code Playgroud)
是否有任何函数/库具有可在elixir代码中使用的readline功能?
到目前为止我调查的是,
iex实现似乎将此功能委托给erl(/lib/iex/history.ex似乎只是管理历史列表),但我无法在erlang方面找到相应的功能.erl_ddll.load,但未能从以下方面走得更远.在iex上,
iex(4)> :erl_ddll.load('/usr/lib', 'libreadline')
{:error, {:open_error, -10}}
iex(5)> :erl_ddll.format_error({:open_error, -10})
'dlopen(/usr/lib/libreadline.so, 2): image not found'
Run Code Online (Sandbox Code Playgroud)
我在OSX,并通过自制安装libreadline,我可以找到libreadline.dylib在/usr/lib.
[关于目的的附加说明]
我正在使用elixir进行以下(mal)实验,这是一个用各种语言实现的lisp repl(但不是用elixir/erlang实现).
该步骤的一部分是使用历史记录实现repl,并且如果不是本地语言,则某些语言正在使用readline绑定库.
[更新一点 - 2015/3/22]
我尝试使用NIF方法(与encurses类似)来使用readline库.我可以在erlang(erl)上做一些工作,但是坚持使用elixir方面.当从C库(readline或只是普通scanf)读取输入时,"mix run -e"或"iex"似乎表现得有些奇怪(跳过或忽略某些输入),但无法找出原因.encurses似乎行为相似.
以下是我的试验.
https://github.com/parroty/ereadline
https://github.com/parroty/readline
我可能会采用像rlwrap这样的更通用的方法.
elixir ×1