#!/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