=====================================================================

--- New Scripts --------------------------

- i3 window manager scrypts (see --help for more info)
   - zsh/i3/create-local-font-override
   - zsh/i3/launch-or-show

--- New Features -------------------------

Now support `__select` syntax in environment files!
(see zsh/scwrypts/README.md for more detail)

--- Changes ------------------------------

- moved some rogue configuration files under the scwrypts config
   - ~/.vim/bundle/build.zsh >> ~/.config/scwrypts/vundle.zsh
   - ~/.config/scwrypts/config.dotfile.zsh >> ~/.config/scwrypts/dotfiles.zsh

- __FZF, __FZF_TAIL, and __FZF_HEAD now create prompt+response logs

--- Bug Fixes ----------------------------

- zsh/config/symlinks
   - don't fail when trying to symlink a directory
   - no longer fails when trying to replace a broken symlink

- scwrypts now detects environments which are symlinked

- USAGE syntax now correctly shows the position of the '--' argument
  delimiter

support __select in env files; ignore __lower_case suffix in env files; put blank line before comments in env files

added i3 scripts
This commit is contained in:
Wryn (yage) Wagner 2022-08-22 16:04:03 -06:00
parent 710d42e248
commit 22dd6f8112
13 changed files with 292 additions and 20 deletions

View File

@ -5,6 +5,10 @@ export AWS_REGION=
export AWS__EFS__LOCAL_MOUNT_POINT= export AWS__EFS__LOCAL_MOUNT_POINT=
export AWS__S3__MEDIA_BUCKET= export AWS__S3__MEDIA_BUCKET=
export AWS__S3__MEDIA_TARGETS= export AWS__S3__MEDIA_TARGETS=
export I3__BORDER_PIXEL_SIZE=
export I3__DMENU_FONT_SIZE=
export I3__GLOBAL_FONT_SIZE=
export I3__MODEL_CONFIG=
export REDIS_AUTH= export REDIS_AUTH=
export REDIS_HOST= export REDIS_HOST=
export REDIS_PORT= export REDIS_PORT=

View File

@ -7,6 +7,11 @@ AWS__EFS__LOCAL_MOUNT_POINT | fully-qualified path to mount the EFS drive
AWS__S3__MEDIA_BUCKET | s3 bucket name and filesystem targets for media backups AWS__S3__MEDIA_BUCKET | s3 bucket name and filesystem targets for media backups
AWS__S3__MEDIA_TARGETS | AWS__S3__MEDIA_TARGETS |
I3__BORDER_PIXEL_SIZE | custom i3 configuration settings
I3__DMENU_FONT_SIZE |
I3__GLOBAL_FONT_SIZE |
I3__MODEL_CONFIG |
REDIS_AUTH | redis connection credentials REDIS_AUTH | redis connection credentials
REDIS_HOST | REDIS_HOST |
REDIS_PORT | REDIS_PORT |

View File

@ -6,7 +6,7 @@ source ${0:a:h}/utils/utils.module.zsh \
##################################################################### #####################################################################
__GET_ENV_FILES() { find $SCWRYPTS_CONFIG_PATH/env -maxdepth 1 -type f | sort -r } __GET_ENV_FILES() { ls $SCWRYPTS_CONFIG_PATH/env | sort -r }
[ ! "$(__GET_ENV_FILES)" ] && { [ ! "$(__GET_ENV_FILES)" ] && {
cp $__ENV_TEMPLATE "$SCWRYPTS_CONFIG_PATH/env/dev" cp $__ENV_TEMPLATE "$SCWRYPTS_CONFIG_PATH/env/dev"
cp $__ENV_TEMPLATE "$SCWRYPTS_CONFIG_PATH/env/local" cp $__ENV_TEMPLATE "$SCWRYPTS_CONFIG_PATH/env/local"

View File

@ -6,8 +6,9 @@ source ${0:a:h}/../common.zsh
SAFE_SYMLINKS=1 SAFE_SYMLINKS=1
# in case config.dotfile.zsh is sourced... allow user to provide initial config ;) # in case dotfiles.zsh is sourced... allow user to provide initial config ;)
[ ! $CONFIG__USER_SETTINGS ] \ [ ! $CONFIG__USER_SETTINGS ] \
&& CONFIG__USER_SETTINGS="$SCWRYPTS_CONFIG_PATH/config.dotfile.zsh" && CONFIG__USER_SETTINGS="$SCWRYPTS_CONFIG_PATH/dotfiles.zsh"
[ ! -f "$CONFIG__USER_SETTINGS" ] && cp "$DEFAULT_CONFIG" "$CONFIG__USER_SETTINGS" [ ! -f "$CONFIG__USER_SETTINGS" ] && cp "$DEFAULT_CONFIG" "$CONFIG__USER_SETTINGS"
source $CONFIG__USER_SETTINGS source $CONFIG__USER_SETTINGS

View File

@ -15,16 +15,16 @@ SETUP_SYMLINK() {
[ ! $2 ] && __FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG' [ ! $2 ] && __FAIL 1 'must provide SOURCE_CONFIG and TARGET_CONFIG'
local SOURCE_CONFIG="$1" local SOURCE_CONFIG="$1"
[ ! -f "$SOURCE_CONFIG" ] && __FAIL 2 "no such file '$SOURCE_CONFIG'" [ ! -f "$SOURCE_CONFIG" ] && [ ! -d "$SOURCE_CONFIG" ] && __FAIL 2 "no such file or directory '$SOURCE_CONFIG'"
local TARGET_CONFIG="$HOME/.config/$2" local TARGET_CONFIG="$HOME/.config/$2"
[ ! -d $(dirname "$TARGET_CONFIG") ] && mkdir -p $(dirname "$TARGET_CONFIG") [ ! -d $(dirname "$TARGET_CONFIG") ] && mkdir -p $(dirname "$TARGET_CONFIG")
[ -f "$TARGET_CONFIG" ] && { [[ $SAFE_SYMLINKS -eq 1 ]] \
[[ $SAFE_SYMLINKS -eq 1 ]] && mv "$TARGET_CONFIG" "$TARGET_CONFIG.bak" && mv "$TARGET_CONFIG" "$TARGET_CONFIG.bak" >/dev/null 2>&1
[[ $SAFE_SYMLINKS -eq 0 ]] && rm "$TARGET_CONFIG"
} rm "$TARGET_CONFIG" >/dev/null 2>&1
ln -s "$SOURCE_CONFIG" "$TARGET_CONFIG" \ ln -s "$SOURCE_CONFIG" "$TARGET_CONFIG" \
&& __SUCCESS "successfully linked '$(basename $(dirname $TARGET_CONFIG))/$(basename $TARGET_CONFIG)'" \ && __SUCCESS "successfully linked '$(basename $(dirname $TARGET_CONFIG))/$(basename $TARGET_CONFIG)'" \

14
zsh/i3/common.zsh Normal file
View File

@ -0,0 +1,14 @@
_DEPENDENCIES+=(
i3
i3-msg
)
_REQUIRED_ENV+=()
source ${0:a:h}/../common.zsh
#####################################################################
[ ! $DISPLAY ] && export DISPLAY=:0
_NOTIFY() {
__CHECK_DEPENDENCY notify-send || return 0
notify-send "SCWRYPTS $SCWRYPT_NAME" $@
}

105
zsh/i3/create-local-font-override Executable file
View File

@ -0,0 +1,105 @@
#!/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 $@

113
zsh/i3/launch-or-show Executable file
View File

@ -0,0 +1,113 @@
#!/bin/zsh
_DEPENDENCIES+=(
xdotool
xrandr
i3-msg
)
_REQUIRED_ENV+=()
source ${0:a:h}/common.zsh
#####################################################################
LAUNCH_OR_SHOW() {
local USAGE="
usage: <path-executable> [client-class] [...options...]
options
-c, --client <string> if different from the executable name, xprop CLIENT_CLASS
-s, --scale <value> (default: 0.8 or 0.5 if screen width >3000px)
-x, --x-offset <value> (default: 0.0)
-y, --y-offset <value> (default: 0.0)
-a, --always-launch invoke executable even if client-class exists
-n, --no-resize don't resize the window (ignores -sxy flags)
-h, --help print this message and exit
Makes it easy to bind appications to key shortcuts without having to
spin up redundant instances or cycle through the scratchpad queue.
Depending on state, performs one of three useful functions
1) starts application
2) adds application window to the scratchpad
3) pulls applciation from scratchpad to foreground on active screen
"
local APPLICATION CLIENT_CLASS
local XFFSET=0.0
local YFFSET=0.0
local SCALE=0.8
[[ $(xrandr | grep primary | awk '{print $4;}' | sed 's/x.*//') -gt 3000 ]] \
&& SCALE=0.5
local ALWAYS_LAUNCH=0
local RESIZE=1
while [[ $# -gt 0 ]]
do
case $1 in
-c | --client ) CLIENT_CLASS="$2"; shift 1 ;;
-x | --x-offset ) XFFSET=$2; shift 1 ;;
-y | --y-offset ) YFFSET=$2; shift 1 ;;
-s | --scale ) SCALE=$2; shift 1 ;;
-a | --always-launch ) ALWAYS_LAUNCH=1 ;;
-n | --no-resize ) RESIZE=0 ;;
-h | --help ) __USAGE; exit 0 ;;
* )
[ ! $APPLICATION ] && APPLICATION="$1" \
|| __ERROR "extra positional argument '$1'"
esac
shift 1
done
[ ! $APPLICATION ] && __ERROR 'path-executable required'
[ ! $CLIENT_CLASS ] && CLIENT_CLASS=$APPLICATION
[ $APPLICATION ] && {
__CHECK_DEPENDENCY $APPLICATION || {
__ERROR "$APPLICATION is not installed"
_NOTIFY "ERROR: $APPLICATION not found"
}
}
__ERROR_CHECK
local LAUNCH_APP=$ALWAYS_LAUNCH
__STATUS "looking for window process ids"
xdotool search --class $CLIENT_CLASS || LAUNCH_APP=1
[[ $LAUNCH_APP -eq 1 ]] && {
__STATUS 'launching application'
i3-msg "exec --no-startup-id $APPLICATION;"
sleep .5
}
__STATUS 'getting target window size'
WINDOW_SIZE=$(\
xrandr \
| grep 'connected primary' \
| sed 's/.*connected primary \([^x]*\)x\([^+]*\).*/\1 \2/' \
| awk -v f=$SCALE -v x=$XFFSET -v y=$YFFSET \
'{print int($1*f+x)," ",int($2*f+y);}'\
)
__INFO "window size: $WINDOW_SIZE"
__STATUS 'moving window to scratchpad'
i3-msg "[class=$CLIENT_CLASS] move scratchpad"
[[ $RESIZE -eq 1 ]] \
&& __STATUS 'resizing window' \
&& i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE"
__STATUS 'pulling window from scratchpad to foreground'
i3-msg "[class=$CLIENT_CLASS] scratchpad show"
__STATUS 'moving window to center of current screen'
i3-msg "[class=$CLIENT_CLASS] move position center"
}
#####################################################################
LAUNCH_OR_SHOW $@

View File

@ -31,6 +31,26 @@ Inherited values are denoted by `# inherited from <parent-name>` in the environm
Nested children will inherit values from all parents. Nested children will inherit values from all parents.
### Special Environment Variable Syntax
All environment variables which end in `__[a-z_]+` are ignored by the template file.
These environment variables *will propagate to children*, but will not be removed nor staged into the `.env.template`.
#### `__select` Environment Variables
Omit any variable, but provide a comma-separated list with the `__select` suffix, and the user will be prompted to select a value from the provided options.
In the following configuration, the user will be prompted to select an `AWS_REGION` once at the beginning of scwrypt execution:
```zsh
export AWS_REGION=
export AWS_REGION__select=us-east-1,us-east-2,us-west-1,us-west-2
```
Setting the `AWS_REGION` variable will cause scwrypts to ignore the `__select` syntax.
CI will fail on select, because CI fails on any FZF prompt.
## Logs ## Logs
Quickly view or clear Scwrypts logs. Quickly view or clear Scwrypts logs.

View File

@ -17,10 +17,12 @@ _SYNCHRONIZE() {
[ ! $SLIENT ] && { [ ! $SLIENT ] && {
__yN 'change the template before sync?' && __EDIT $__ENV_TEMPLATE __yN 'change the template before sync?' && __EDIT $__ENV_TEMPLATE
_SORT_ENV "$__ENV_TEMPLATE"
git add $__ENV_TEMPLATE >/dev/null 2>&1
} }
_SORT_ENV "$__ENV_TEMPLATE"
sed -i '/__[a-z_]\+=$/d' "$__ENV_TEMPLATE"
git add $__ENV_TEMPLATE >/dev/null 2>&1
ENVIRONMENTS=$(__GET_ENV_NAMES | sort -r) ENVIRONMENTS=$(__GET_ENV_NAMES | sort -r)
_CLEAR_INHERITED_VARIABLES _CLEAR_INHERITED_VARIABLES
@ -68,6 +70,8 @@ _REMOVE_OLD_VARIABLES() {
while read line while read line
do do
ENV_VAR=$(echo "$line" | sed 's/=.*/=/') ENV_VAR=$(echo "$line" | sed 's/=.*/=/')
echo $ENV_VAR | grep -q '__[a-z_]\+=' && continue
grep -q "$ENV_VAR" "$__ENV_TEMPLATE" || { grep -q "$ENV_VAR" "$__ENV_TEMPLATE" || {
sed -i "\\%$ENV_VAR%d" "$ENV_FILE" sed -i "\\%$ENV_VAR%d" "$ENV_FILE"
echo "$ENV_VAR" | grep -qv '^#' \ echo "$ENV_VAR" | grep -qv '^#' \
@ -139,14 +143,11 @@ _ADD_DESCRIPTIONS() {
done done
done < <(sed -n '/^[^ ]\+ \+| /p' "$__ENV_TEMPLATE.descriptions") done < <(sed -n '/^[^ ]\+ \+| /p' "$__ENV_TEMPLATE.descriptions")
while read ENV_VAR
do
for ENV_NAME in $(echo $ENVIRONMENTS) for ENV_NAME in $(echo $ENVIRONMENTS)
do do
sed -i "/^export $ENV_VAR=/a \ " "$(__GET_ENV_FILE $ENV_NAME)" sed -i "/^# /i \ " "$(__GET_ENV_FILE $ENV_NAME)"
sed -i "s/^ $//" "$(__GET_ENV_FILE $ENV_NAME)" sed -i "s/^ $//" "$(__GET_ENV_FILE $ENV_NAME)"
done done
done < <(grep -B1 '^$' "$__ENV_TEMPLATE.descriptions" | grep '|' | awk '{print $1;}')
} }
##################################################################### #####################################################################

View File

@ -14,6 +14,12 @@ __CHECK_ENV_VAR() {
local VALUE=$(eval echo '$'$NAME) local VALUE=$(eval echo '$'$NAME)
[ $VALUE ] && return 0 [ $VALUE ] && return 0
local SELECTION_VALUES=$(eval echo '$'$NAME'__select' | sed 's/,/\n/g')
[ $SELECTION_VALUES ] && {
local SELECTION=$(echo $SELECTION_VALUES | __FZF "select a value for '$NAME'")
[ $SELECTION ] && export VALUE=$SELECTION
}
[ $VALUE ] && return 0
[ $__SCWRYPT ] && { [ $__SCWRYPT ] && {
# scwrypts exclusive (missing vars staged in env.template) # scwrypts exclusive (missing vars staged in env.template)

View File

@ -37,7 +37,7 @@ __USAGE() {
local USAGE_LINE=$(\ local USAGE_LINE=$(\
echo $USAGE \ echo $USAGE \
| grep -i '^ *usage *:' \ | grep -i '^ *usage *:' \
| sed "s;^[^:]*:;& scwrypts -- $SCWRYPT_NAME;" \ | sed "s;^[^:]*:;& scwrypts $SCWRYPT_NAME --;" \
| sed 's/ \{2,\}/ /g; s/scwrypts -- scwrypts/scwrypts/' \ | sed 's/ \{2,\}/ /g; s/scwrypts -- scwrypts/scwrypts/' \
) )
local THE_REST=$(echo $USAGE | grep -vi '^ *usage *:' | sed 'N;/^\n$/D;P;D;') local THE_REST=$(echo $USAGE | grep -vi '^ *usage *:' | sed 'N;/^\n$/D;P;D;')
@ -85,7 +85,10 @@ __FZF() {
exit 1 exit 1
} }
fzf -i --height=30% --layout=reverse --prompt "$1 : " ${@:2} local SELECTION=$(fzf -i --height=30% --layout=reverse --prompt "$1 : " ${@:2})
__PROMPT "$1"
echo $SELECTION >&2
echo $SELECTION
} }
__FZF_HEAD() { __FZF $@ --print-query | sed '/^$/d' | head -n1; } # prefer user input over selected __FZF_HEAD() { __FZF $@ --print-query | sed '/^$/d' | head -n1; } # prefer user input over selected
__FZF_TAIL() { __FZF $@ --print-query | sed '/^$/d' | tail -n1; } # prefer selected over user input __FZF_TAIL() { __FZF $@ --print-query | sed '/^$/d' | tail -n1; } # prefer selected over user input

View File

@ -4,7 +4,7 @@ source ${0:a:h}/../common.zsh
##################################################################### #####################################################################
VUNDLE_PLUGIN_DIR="$HOME/.vim/bundle" VUNDLE_PLUGIN_DIR="$HOME/.vim/bundle"
VUNDLE_BUILD_DEFINITIONS="$VUNDLE_PLUGIN_DIR/build.zsh" VUNDLE_BUILD_DEFINITIONS="$SCWRYPTS_CONFIG_PATH/vundle.zsh"
[ ! -f $VUNDLE_BUILD_DEFINITIONS ] && { [ ! -f $VUNDLE_BUILD_DEFINITIONS ] && {
{ {