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:* > > > * 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* > > * 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 > > > * > 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 > > * > 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: > * The String utility is general-purpose enough for many use-cases, and so > is potentially useful to many Elixir users. > * We can provide a better implementation than the naive *String.split |> > Kernel.<> |> Enum.join*. > * We can provide an implementation that works with Inspect.Algebra > documents and inspect. > * 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 elixir-lang-core+unsubscribe@ googlegroups. com ( > [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.
