dotfiles/.local/bin/i3-config-builder

70 lines
1.9 KiB
Bash
Executable File

#!/bin/bash
# i3-config-builder
# Version: 0.1.0
# Author: dabruh
# GitLab: https://gitlab.com/dabruh
# GitHub: https://github.com/dabruh
#
# Builds an i3/i3status configuration file by merging
# multiple defined configurations in an orderly manner.
#
# The files you wish to include MUST exist under ~/.config/i3(status)/layers.
# The files MUST start with one of the defined "PATTERNS" below. However, they
# WILL NOT be read unless explicitly mentioned in a .layer file located in the
# same directory.
#
# Two .layer files are read during execution:
# - default.layer
# - $HOSTNAME.layer: This file doesn't have to exist, but will allow you to
# load a special set of files depending on the hostname of the machine which
# executes this script.
#
# The contents of the .layer files are read first, and then sorted.
HOSTNAME="$(hostname | cut -d. -f1)"
PATTERNS=(
"config.vars"
"config.pre-main"
"config.main"
"config.post-main"
)
function i3setup() {
local file dir layers config includes path component="$1"
dir="$HOME/.config/$component"
layers="$dir/layers"
config="$dir/config"
echo "Building $component config... 🔨"
rm "$config" 2>/dev/null
includes=$(cat "$layers/default.layer" "$layers/$HOSTNAME.layer" 2>/dev/null | sort -u)
for pattern in "${PATTERNS[@]}"; do
for file in $includes; do
! [[ "$file" =~ "$pattern"* ]] && continue
path="$layers/$file"
if ! [ -f "$path" ] && ! [ -L "$path" ]; then
echo "ERROR: Invalid path: $path"
continue
fi
echo "WRITE : '$file'."
{
echo "# >>>$file"
cat "$path"
echo "# <<<$file"
echo
} >>"$config"
done
done
echo
}
i3setup i3
i3setup i3status
echo "Restarting i3... 🔄"
i3 restart