#!/bin/zsh _DEPENDENCIES+=( diff ) _REQUIRED_ENV+=( I3__MODEL_CONFIG ) source ${0:a:h}/common.zsh __CHECK_ENV_VAR I3__GLOBAL_FONT_SIZE --optional __CHECK_ENV_VAR I3__DMENU_FONT_SIZE --optional __CHECK_ENV_VAR I3__BORDER_PIXEL_SIZE --optional ##################################################################### 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__DMENU_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 $@