This was common enough that it's an option in Sourceror.to_string/2 <https://hexdocs.pm/sourceror/Sourceror.html#to_string/2>
On Wed, Jan 7, 2026 at 9:43 PM Zach Daniel <[email protected]> wrote: > This is such a good idea. I do this a lot too and didn't think of it, > especially in library code. In strong support. > > > On Wed, Jan 07, 2026 at 12:22 PM, Christopher Keele < > [email protected]> wrote: > >> *Proposal:* >> >> >> 1. Add support for indenting multi-line strings via *String.indent*: >> *defmodule String do* >> * @type indentation ::* >> * binary* >> * | Inspect.Algebra.t()* >> * | [{:spaces, non_neg_integer()}]* >> * | [{:tabs, non_neg_integer()}]* >> >> * @spec indent(String.t(), indentation) :: String.t()* >> * def indent(string, indentation)* >> *end* >> 2. Add support for indenting ast representations in *Macro.to_string*: >> defmodule Macro do >> @type to_string_opt :: {:indent, String.indentation()} >> @spec to_string(Macro.t(), [to_string_opt()]) :: String.t() >> def to_string(string, options \\ []) >> def to_string(string, options) >> end >> 3. Add support for indenting code in *Code.format_string!*: >> defmodule Code do >> @type format_opt :: >> # ... | >> {:indent, String.indentation()} >> @spec format_string!(String.t(), [format_opt()]) :: iodata() >> def format_string!(string, opts \\[]) >> end >> 4. Add support for indenting arbitrary Algebra documents in >> *Inspect.Opts*: >> defmodule Inspect.Opts do >> @t new_opt :: >> # ... | >> {:indent, String.indentation()} >> end >> >> *Motivation:* >> >> I often want to indent code I provide as feedback to the user in >> exception messages in macros. I have to imagine other library authors, >> metaprogrammers, and LS developers would benefit as well. >> >> I often want to compose multi-line log messages with certain passages >> indented. I have to imagine other application developers have wanted the >> same. >> >> Please share if you can think of other ways you would use this >> functionality, or other stdlib APIs you can think of wanting indentation >> support for! >> >> *Rationale:* >> >> I find myself re-implementing this odd job often, not just for my stated >> use-cases here. The arguments for putting it in stlib are: >> >> 1. The String utility is general-purpose enough for many use-cases, >> and so is potentially useful to many Elixir users. >> 2. We can provide a better implementation than the naive *String.split >> |> Kernel.<> |> Enum.join*. >> 3. We can provide an implementation that works with Inspect.Algebra >> documents and inspect. >> 4. We can provide an option to *Macro.to_string* and >> *Code.format_string!* where displaying multi-line strings is common. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion visit >> https://groups.google.com/d/msgid/elixir-lang-core/f9b60654-29b2-4c06-80ea-6a6fa614f9d3n%40googlegroups.com >> <https://groups.google.com/d/msgid/elixir-lang-core/f9b60654-29b2-4c06-80ea-6a6fa614f9d3n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > > -- > You received this message because you are subscribed to the Google Groups > "elixir-lang-core" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion visit > https://groups.google.com/d/msgid/elixir-lang-core/mk4q396z.7bef578b-059a-4f47-9bbe-f8485fa3ecdc%40we.are.superhuman.com > <https://groups.google.com/d/msgid/elixir-lang-core/mk4q396z.7bef578b-059a-4f47-9bbe-f8485fa3ecdc%40we.are.superhuman.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/elixir-lang-core/CAKE-5T6Mpnq%2BLQ2BFj0kKYGup-TEd_p9Z6%3DArJhomX8oPWofnw%40mail.gmail.com.
