SuperCuber / dotter

A dotfile manager and templater written in rust 🦀
The Unlicense
845 stars 45 forks source link

[FEATURE] Use variables in file paths #61

Open tezkerek opened 3 years ago

tezkerek commented 3 years ago

Is your feature request related to a problem? Please describe. I'd like to use variables in dotter's config files themselves. Something like:

[variables]
config_dir = "~/.config"

[shell.files]
"zsh/zprofile" = "~/.zprofile"
"zsh/zshrc" = "{{config_dir}}/zsh/zshrc"
"gitconfig" = "{{config_dir}}/git/config"

and then in ~/.zprofile too:

XDG_CONFIG_HOME="{{config_dir}}"

Describe the solution you'd like Maybe parse the variables first, then render a handlebars template for each path. Or is that overkill? Alternatively, maybe new values can be added to shellexpand, to be substituted like env vars ($config_dir/zsh/zshrc). Might need changes upstream. I think shellexpand::env_with_context could be used for this.

Describe alternatives you've considered Run dotter with variables set on the shell for shellexpand to use:

env XDG_CONFIG_HOME="~/.config" dotter deploy
SuperCuber commented 3 years ago

Currently you could just use the variable itself in the path since it's expanded (well, after running dotter once and restarting the shell I guess)

Maybe parse the variables first, then render a handlebars template for each path. Or is that overkill?

That'd be the only way of doing it. I'll test if this brings a significant slowdown, if it doesn't then I don't see a reason against this.

tezkerek commented 3 years ago

I looked over shellexpand and I think that a custom context would work too, and might be more lightweight than a handlebars template. But having helpers in paths might be useful anyway.

SuperCuber commented 3 years ago

Yeah, if I'm adding access to variables might as well have full handlebars functionality, with handlebars syntax.

murkylife commented 2 years ago

This would be pretty helpful to me. I'd like to do something like:

includes = [".dotter/{{OS}}.toml"]
OR
includes = [".dotter/$OS.toml"]

This will allow me to dynamically get the correct OS files.

yuckyh commented 1 month ago

Wouldn't a better solution be to have per package settings like this?

In

.dotfiles/
-zsh/
--zshrc
--zprofile
--aliases.zsh

Out

~/
-.config/
--zsh/
---.zshrc
---aliases.zsh
-.zprofile
[zsh.settings]
source_dir = "zsh"
target_dir = "~/.config/zsh" 

# Overrides
[zsh.files]
zshrc=".zshrc"

[zsh.files.zprofile]
path="exact"
target="~/.zprofile"

There should be no need for scripts and variables for paths this way. It also simplifies the configuration needed.