defmodule JacobCli.Commands.Shell.Autocomplete do use Jacob.Command @name "_autocomplete" @desc "list commands for zsh autocompletion" @hidden true @moduledoc false def run(["_autocomplete", "zsh"]), do: list_commands(:zsh) def run(["_autocomplete", "bash"]), do: list_commands(:bash) defp list_commands(:zsh) do get_all_commands() |> zsh_autocompletion() end defp list_commands(:bash) do get_all_commands() |> bash_autocompletion() end defp bash_autocompletion([]), do: nil defp bash_autocompletion([{_, command} | next_commands]) do IO.write(~s'"#{command.name}" ') bash_autocompletion(next_commands) end defp zsh_autocompletion([]), do: nil defp zsh_autocompletion([{_, command} | next_commands]) do IO.puts(sanitize(command.name) <> ":" <> sanitize(command.desc)) zsh_autocompletion(next_commands) end defp get_all_commands() do Jacob.Command.Server.all() |> Enum.filter(fn {_, command} -> !command.hidden? end) end defp sanitize(value) do value |> String.replace(":", "\\:") end end