#!/bin/zsh DEPENDENCIES+=( diff ) REQUIRED_ENV+=( I3__MODEL_CONFIG ) CHECK_ENVIRONMENT ##################################################################### REGEX_FONT='^\(font [^0-9]*\)\(.*\)' REGEX_DMENU="^\\(.*dmenu_run .*-fn '[^0-9]*\\)\\([0-9]*\\)'" REGEX_BORDER='^\(for_window.*border pixel \)\(.*\)' INSTALL() { local USAGE=" usage: [...options...] options -f, --force force replacement of existing i3config -n, --no-link if output config and template are the same, don't create link -h, --help print this message and exit environment I3__MODEL_CONFIG fully-qualified path to sourced i3config I3__GLOBAL_FONT_SIZE global font size I3__DMENU_FONT_SIZE (optional) font size for 'dmenu' command I3__BORDER_PIXEL_SIZE (optional) pixel-width of window borders I3 provides no way to include dynamic variables in your config. The main difference I want between my i3 configurations is font-size to match the current monitor. Since i3-msg provides no way to change font size, I run this command to update those variables on a local copy of my sourced config " local FORCE=0 local AUTOLINK=1 while [[ $# -gt 0 ]] do case $1 in -f | --force ) FORCE=1 ;; -n | --no-link ) AUTOLINK=0 ;; -h | --help ) USAGE; exit 0 ;; esac shift 1 done STATUS 'reading local i3config' [[ ^$I3__MODEL_CONFIG$ =~ ^$HOME/.config/i3/config$ ]] && { STATUS "model configuration is default configuration" I3__MODEL_CONFIG="$I3__MODEL_CONFIG.template" [ ! -f "$I3__MODEL_CONFIG" ] && { STATUS "creating template" cp "$HOME/.config/i3/config" "$I3__MODEL_CONFIG.template" } STATUS "referring to '$I3__MODEL_CONFIG'" } local CONFIG=$(cat "$I3__MODEL_CONFIG") [ ! $CONFIG ] && FAIL 1 "failed to read config at '$I3__MODEL_CONFIG'" local CONFIG_FILE="$HOME/.config/i3/config" [ ! -d $(dirname "$CONFIG_FILE") ] && mkdir -p "$(dirname "$CONFIG_FILE")" [ -f "$CONFIG_FILE" ] && mv "$CONFIG_FILE" "$CONFIG_FILE.bak" [ $I3__GLOBAL_FONT_SIZE ] && { STATUS "setting global font size to '$I3__GLOBAL_FONT_SIZE'" CONFIG=$(echo $CONFIG | sed "s/$REGEX_FONT/\\1$I3__GLOBAL_FONT_SIZE/") } [ $I3__DMENU_FONT_SIZE ] && { STATUS "setting dmenu font size to '$I3__DMENU_FONT_SIZE'" CONFIG=$(echo $CONFIG | sed "s/$REGEX_DMENU/\\1$I3__DMENU_FONT_SIZE'/") } [ $I3__BORDER_PIXEL_SIZE ] && { STATUS "setting border pixel size to '$I3__BORDER_PIXEL_SIZE'" CONFIG=$(echo $CONFIG | sed "s/$REGEX_BORDER/\\1$I3__BORDER_PIXEL_SIZE/") } echo $CONFIG > "$CONFIG_FILE" [ -f "$CONFIG_FILE.bak" ] \ && diff "$CONFIG_FILE" "$CONFIG_FILE.bak" -q >/dev/null \ && mv "$CONFIG_FILE.bak" "$CONFIG_FILE" \ && INFO "no changes were made" \ ; [[ $AUTOLINK -eq 1 ]] \ && diff "$CONFIG_FILE" "$I3__MODEL_CONFIG" -q >/dev/null \ && rm "$CONFIG_FILE" \ && ln -s "$I3__MODEL_CONFIG" "$CONFIG_FILE" \ && INFO "output is the same as model, i3config has been linked to model" \ ; [[ $FORCE -eq 1 ]] && rm "$CONFIG.bak" >/dev/null 2>&1 return 0 } ##################################################################### INSTALL $@