Marty Oehme
7ec6dc98c9
Utilities should always be sourced, even in the case that the processor is not designated for any of the templates provided.
114 lines
3.2 KiB
Bash
Executable file
114 lines
3.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
readonly dependency=("chriskempson/base16-vim")
|
|
readonly app="vim"
|
|
|
|
readonly path="$1"
|
|
readonly package="$2"
|
|
readonly theme="$3"
|
|
readonly permanent="$4"
|
|
|
|
## Main Entrypoint
|
|
#
|
|
# Finds the right theme template file and starts theme
|
|
# switching and, if necessary, permanent setting processes.
|
|
main() {
|
|
dbg_msg $app "Starting Processor"
|
|
tfile="$path/$package/colors/base16-$theme.vim"
|
|
|
|
if ! file_exists "$tfile"; then
|
|
dbg_msg $app "error" "Theme template $theme not found in package $package"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$permanent" == "true" ]]; then save; fi
|
|
theme
|
|
|
|
dbg_msg $app "Processor Done"
|
|
}
|
|
|
|
## Theme switcher
|
|
#
|
|
# Makes sure that if any application instance is
|
|
# currently running, it switches to new theme.
|
|
theme() {
|
|
dbg_msg $app "Switching theme"
|
|
# this whole thing only works when tmux is running
|
|
|
|
pgrep tmux >/dev/null || {
|
|
dbg_msg $app "warn" "No instance of tmux running, can not dynamically re-theme vim"
|
|
return
|
|
}
|
|
|
|
while read -r l; do
|
|
# we need to close panels that are in a mode and get them out to send keys to vim
|
|
if [ "${l: -1}" = 1 ]; then
|
|
tmux send-keys -t "${l/:*/}" -X cancel && tmux send-keys -t "${l/:*/}" ":source $tfile" "Enter"
|
|
else
|
|
tmux send-keys -t "${l/:*/}" ":source $tfile" "Enter"
|
|
fi
|
|
|
|
# find all panes which currently have nvim/vim running
|
|
done < <(tmux list-panes -a -F '#D:#T:#{pane_current_command}:#{pane_in_mode}' | grep ':VIM:\|:nvim:')
|
|
|
|
dbg_msg $app "Successfully switched theme"
|
|
}
|
|
|
|
## Theme setter
|
|
#
|
|
# Takes care of permanently writing the desired
|
|
# base16 theme into application settings.
|
|
save() {
|
|
dbg_msg $app "Saving theme"
|
|
local vim_dirs="${XDG_CONFIG_HOME:-/$HOME/.config}/nvim $HOME/.vim"
|
|
local foundone=false
|
|
|
|
for vim_dir in $vim_dirs; do
|
|
if [[ -d "$vim_dir" ]]; then
|
|
foundone=true
|
|
|
|
cat "$tfile" >"$vim_dir/colorscheme.vim"
|
|
echo "colorscheme base16-$theme" >>"$vim_dir/colorscheme.vim"
|
|
dbg_msg $app "Saved theme to $vim_dir/colorscheme.vim"
|
|
|
|
include "$vim_dir"
|
|
fi
|
|
done
|
|
|
|
[[ "$foundone" == false ]] && dbg_msg $app "warn" "No configuration directory found"
|
|
}
|
|
|
|
## Theme includer
|
|
#
|
|
# Makes sure that theme is actually included in
|
|
# default application startup routine.
|
|
# This is the most invasive step of theming since it
|
|
# rewrites within existing configuration files.
|
|
include() {
|
|
local vim_dir="$1"
|
|
dbg_msg $app "Including theme in configuration"
|
|
|
|
if file_exists "$vim_dir/init.vim"; then
|
|
line_exists_or_append "$vim_dir/init.vim" "runtime colorscheme.vim"
|
|
dbg_msg $app "Successfully included theme in configuration"
|
|
elif file_exists "$HOME/.vimrc"; then
|
|
line_exists_or_append "$HOME/.vimrc" "runtime colorscheme.vim"
|
|
dbg_msg $app "Successfully included theme in configuration"
|
|
else
|
|
dbg_msg $app "warn" "No default configuration file found"
|
|
fi
|
|
}
|
|
|
|
# Safe sourcing: https://stackoverflow.com/a/12694189
|
|
DIR="${BASH_SOURCE%/*}"
|
|
if [[ ! -d "$DIR" ]]; then DIR="$PWD"; fi
|
|
# shellcheck source=utilities.sh
|
|
. "$DIR/utilities.sh"
|
|
## Dependency Checker
|
|
#
|
|
# Makes sure the processor is called for the correct
|
|
# base16 package, or refuses to run if it is not.
|
|
if printf '%s\n' "${dependency[@]}" | grep -q -P "^$package$"; then
|
|
main
|
|
else
|
|
dbg_msg $app "error" "Processor does not work for package $package"
|
|
fi
|