My memory is quite awful and sometimes while I'm typing a long pipeline I realize I'm not sure about the order of some parameters, so then I have to copy everything I have typed so far, remove all the text up to the last function call (i.e. the one that I don't remember its definition), add an h at the beginning of the line, read the docs (maybe even scroll up because of docs being too extensive), delete everything and finally paste what I have on my clipboard to finish my function call.
IEx docs/signature/spec in place with tab key! :D I basically hacked my IEx so when you press the tab key after an expression like "Enum.reduce(" or "Enum.reduce " the shell will show you a list of definitions for the function at the left of your cursor.
It only requires some trivial additions in IEx.Autocomplete. Here is a prototype:
{:docs_v1, _, _, _, _, _, docs} = Code.fetch_docs(module)
signatures =
docs
|> Enum.filter(&match?({{:function, ^name, _}, _, _, _, _}, &1))
|> Enum.map(fn {_, _, [signature], _, _} -> signature end)
|> Enum.join("\n")
yes("", [signatures])
end
defp expand_help(expr, _server) do
case Code.string_to_quoted(expr) do
{:ok, {{:., _, [{:__aliases__, _, aliases}, fun]}, _, []}} when is_atom(fun) ->
try do
get_signatures(Module.safe_concat(aliases), fun)
rescue
_ -> no()
end
_ ->
no()
end
end
# And it also needs a minimal change in expand/2:
h in '[{' -> expand('')
h in ' (' -> expand_help(reduce(expr), server)
I also wrote a version that prints specs but sometimes that can be too verbose/noisy, so I'm still not sure which one do I prefer.
Let me know what do you think.
Thanks