Yeah I think there are two basic routes that work. Either you have a declarative configuration, or you go the route of Emacs and make the entire thing programmable.
Turing complete configuration languages suck and makes everything slow, janky and difficult to reason about.