184 lines
7.5 KiB
Markdown
184 lines
7.5 KiB
Markdown
# Configuring
|
||
`symconf` operates on a central directory that houses all of the config files
|
||
you may wish to apply. The default location for this directory is your
|
||
`$XDG_CONFIG_HOME` (e.g., `~/.config/symconf/`), but it can be any location on
|
||
your system so long as it's specified (see more in Usage).
|
||
|
||
`symconf` expects you to create two top-level components in your config
|
||
directory: an `apps/` directory and an `app_registry.toml` file.
|
||
|
||
**High-level view**:
|
||
|
||
- `symconf` operates on a single directory that houses all your config files
|
||
- Config files in this directory must be placed under an `apps/<app-name>/`
|
||
folder to be associated with the app `<app-name>`
|
||
- For apps to be visible, you need an `app_registry.toml` file that tells
|
||
`symconf` where to symlink your files in `apps/`
|
||
|
||
## Apps directory
|
||
An `apps/` directory should be created in your config home, with a subdirectory
|
||
`apps/<app-name>/` for each app with config files that you'd like to be visible
|
||
to `symconf`. Note that simply populating an app's config folder here will do
|
||
nothing on its own; the app must also have been registered (discussed in item
|
||
#2) in order for these files to be used when `symconf` is invoked. (This just
|
||
means you can populate your `apps/` folder safely without expecting any default
|
||
behavior. More often than not you'll be expected to tell `symconf` exactly
|
||
where your config files should end up, meaning you know exactly what it's
|
||
doing.)
|
||
|
||
### User config
|
||
Inside your app-specific subdirectory, your managed config files should be
|
||
placed in a `user/` subdirectory (distinguishing them from those generated by
|
||
templates; see more in Themes). Your config files themselves are then expected
|
||
to follow a specific naming scheme:
|
||
|
||
```sh
|
||
<palette>-<scheme>.<config-name>
|
||
```
|
||
|
||
This ties your config file to a particular theme setting as needed, and
|
||
`symconf` will apply it if it matches the theme setting you provide when
|
||
invoked. The specific values are as follows:
|
||
|
||
- `scheme`: can be `light`, `dark`, or `none`. Indicates whether the config
|
||
file should be applied specifically when requesting a light or dark mode. Use
|
||
`none` to indicate that the config file does not have settings specific to a
|
||
light/dark mode.
|
||
- `palette`: a "palette name" of your choosing, or `none`. The palette name you
|
||
use here may refer specifically to a color palette used by the config file,
|
||
but can be used generally to indicate any particular group of config settings
|
||
(e.g., fonts, transparency, etc). Use `none` to indicate that the file does
|
||
not correspond to any particular style group.
|
||
- `config-name`: the _name_ of the config file. This should correspond to _same
|
||
path name_ that is expected by the app being configured. For example, if your
|
||
app expects a config file at `a/b/c/d.conf`, "`d.conf`" is the path name.
|
||
|
||
When invoking `symconf` with specific scheme and palette settings (see more in
|
||
Usage), appropriate config files can be matched based on how you've named your
|
||
files.
|
||
|
||
For example, suppose I want to set up a simple light/dark mode switch for the
|
||
`kitty` terminal emulator. The following tree demonstrates a valid setup:
|
||
|
||
```sh
|
||
<config-home>
|
||
└── apps/
|
||
└── kitty/
|
||
└── user/
|
||
├── none-light.kitty.conf
|
||
└── none-dark.kitty.conf
|
||
```
|
||
|
||
where `none-light.kitty.conf` may set a light background and
|
||
`none-dark.kitty.conf` a dark one. `none` is used for the `<palette>` part of
|
||
the name to indicate the configuration does not pertain to any specific palette
|
||
and can be matched even if one is not provided. With an appropriate
|
||
`app_regsitry.toml` file (see below), invoking
|
||
|
||
```sh
|
||
symconf --theme=light --apps=kitty
|
||
```
|
||
|
||
would symlink `$XDG_CONFIG_HOME/symconf/apps/kitty/user/none-light.kitty.conf`
|
||
to `~/.config/kitty/kitty.conf`.
|
||
|
||
### Templatized config
|
||
Note the potential inconvenience in needing to manage two separate config files
|
||
in the above example, very likely with all but one line of difference.
|
||
Templating enables populating config template files dynamically with
|
||
theme-specific variables of your choosing.
|
||
|
||
### Reload scripts
|
||
After symlinking a new set of config files, it is often necessary to reload the
|
||
system or relevant apps in order for the new config settings to apply. Within
|
||
an app's subdirectory, a `call/` folder can be created to hold scripts that
|
||
should apply based on certain schemes or palettes (matching them in the same
|
||
way as config files). For example,
|
||
|
||
```sh
|
||
<config-home>
|
||
└── apps/
|
||
└── kitty/
|
||
└── call/
|
||
└── none-none.sh
|
||
```
|
||
|
||
`none-none.sh` might simply contain `kill -s USR1 $(pgrep kitty)`, which is a
|
||
way to tell all running `kitty` instances to reload their config settings.
|
||
Again, following the naming scheme for config files, a script named
|
||
`none-none.sh` will apply under any scheme or palette specification. Thus, in
|
||
our light/dark mode switch example, invoking `symconf --theme=light
|
||
--apps=kitty` would:
|
||
|
||
1. Search and match the config name `none-light.kitty.conf` and symlink it to
|
||
`~/.config/kitty/kitty.conf`.
|
||
2. Search and match `none-none.sh` and execute it, applying the new light mode
|
||
settings to all running `kitty` instances.
|
||
|
||
## App registry
|
||
An `app_registry.toml` file, used to specify the target locations for
|
||
app-specific config files. To "register" an app, you simply need to add the
|
||
following text block to the `app_registry.toml` file:
|
||
|
||
```toml
|
||
[app.<app-name>]
|
||
# DEFINE *ONE* OF THE FOLLOWING
|
||
config_dir = "<path-to-app-config-folder>"
|
||
# OR
|
||
config_map = {
|
||
"<conf-pathname-1>" = "<path-to-exact-config-file>"
|
||
"<conf-pathname-2>" = "<path-to-exact-config-file>"
|
||
# ...
|
||
}
|
||
```
|
||
|
||
(Note that text in angle brackets refers to values that should be replaced.)
|
||
This tells `symconf` how it should handle each app's config files. The
|
||
`<app-name>` (e.g., `kitty`) should correspond to a subdirectory under `apps/`
|
||
(e.g., `apps/kitty/`) that holds your config files for that app. As shown, you
|
||
then need to supply either of the following options:
|
||
|
||
- `config_dir`: specifies a single directory where all of the app's matching
|
||
config files should be symlinked. In the `kitty` example, this might be
|
||
`~/.config/kitty`. This is the simplest and most common option provided most
|
||
apps expect all of their config files to be in a single directory.
|
||
- `config_map`: a dictionary mapping config file _path names_ to the _exact
|
||
paths_ that should be created during the symlink process. This is typically
|
||
needed when an app has many config files that need to be set in several
|
||
disparate locations across your system. In the `kitty` example, although not
|
||
necessary (and in general you should prefer to set `config_dir` when
|
||
applicable), we could have the following `config_map`:
|
||
|
||
```toml
|
||
[app.kitty]
|
||
config_map = {
|
||
"kitty.conf": "~/.config/kitty/kitty.conf"
|
||
}
|
||
```
|
||
|
||
This tells `symconf` to symlink the exact location
|
||
`~/.config/kitty/kitty.conf` to the matching `kitty.conf` under the
|
||
`apps/kitty` directory.
|
||
|
||
## Directory structure
|
||
In total, the structure of your base config directory can look as follows:
|
||
|
||
```sh
|
||
~/.config/symconf/
|
||
├── app_registry.toml
|
||
└── apps/
|
||
└── <app>/
|
||
├── user/ # user managed
|
||
│ └── none-none.<config-name>
|
||
├── generated/ # automatically populated
|
||
│ └── none-none.<config-name>
|
||
├── templates/ # config templates
|
||
│ └── none-none.template
|
||
└── call/ # reload scripts
|
||
└── none-none.sh
|
||
```
|
||
|
||
## Misc remarks
|
||
|
||
### Multiple config files with same path name
|