mirror of
https://github.com/gaschz/dotfiles.git
synced 2025-03-01 14:22:33 +01:00

Echo can interpret operand as an option and checking every variable to be echoed is troublesome while with printf, if the format specifier is present before the operand, printing as string can be enforced.
96 lines
2.5 KiB
Bash
Executable File
96 lines
2.5 KiB
Bash
Executable File
#!/bin/sh
|
|
##
|
|
## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com>
|
|
##
|
|
## SPDX-License-Identifier: AGPL-3.0-or-later
|
|
##
|
|
##
|
|
## Tmux Sorcerer - source Tmux plugins like a wizard
|
|
##
|
|
## If multiple arguments are present, try them all.
|
|
## In the absence of an argument, the script will try to find a 'plugin'
|
|
## directory at the defaults Tmux configuration directory in the following
|
|
## order (stops at first match):
|
|
## - ${XDG_CONFIG_HOME-${HOME}/.config}/tmux/plugins
|
|
## - ${HOME}/.tmux/plugins
|
|
##
|
|
## Note '@plugin' definition is only useful for TPM, this script will source
|
|
## all plugins that are found. If you want to deactivate a plugin, move the
|
|
## directory to outside of the base of plugins directory.
|
|
##
|
|
## Tmux configuration (add to the bottom of the file):
|
|
## run-shell 'command -v tmux-sorcerer >/dev/null' 'tmux-sorcerer'
|
|
##
|
|
## Usage: tmux-sorcerer [PLUGIN_DIR] [PLUGIN_DIR2...]
|
|
## Example:
|
|
## tmux-sorcerer
|
|
## tmux-sorcerer ~/src/tmux/my-plugins ~/private/tmux/my-bundle
|
|
##
|
|
set -eu
|
|
|
|
get_plugin_path(){
|
|
xdg_file="${XDG_CONFIG_HOME-${HOME}/.config}/tmux/tmux.conf"
|
|
home_subdir_file="${HOME}/.tmux/tmux.conf"
|
|
if test -f "${xdg_file}"; then
|
|
plugin_base="${xdg_file%/tmux.conf}/plugins"
|
|
return 0
|
|
elif test -f "${home_subdir_file}"; then
|
|
plugin_base="${home_subdir_file%/tmux.conf}/plugins"
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
set_plugin_path(){
|
|
while true; do
|
|
test -n "${1-}" || break
|
|
cur_arg="$1"; shift
|
|
case "${cur_arg}" in
|
|
"")
|
|
break
|
|
;;
|
|
*)
|
|
test -d "${cur_arg}" || continue
|
|
if test -n "${plugin_base-}"; then
|
|
plugin_base="${plugin_base-} ${cur_arg}"; continue
|
|
else
|
|
plugin_base="${cur_arg}"; continue
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
source_plugins(){
|
|
directory="$1"
|
|
## See shellcheck SC2044 to understand why loops over find are fragile.
|
|
find "${directory}" -maxdepth 1 -type d -not -name "$(printf "*\n*")" | \
|
|
while read -r plugin
|
|
do
|
|
plugin_name="${plugin##*/}"
|
|
plugin_name="${plugin_name##tmux-}"
|
|
plugin_name="$(printf '%s\n' "${plugin_name}" | tr "-" "_")"
|
|
plugin_script="${plugin}/${plugin_name}.tmux"
|
|
test -r "${plugin_script}" || continue
|
|
"${plugin_script}" >/dev/null 2>&1
|
|
done
|
|
}
|
|
|
|
plugin_base=""
|
|
command -v tmux >/dev/null || exit 1
|
|
if test -n "${1-}"; then
|
|
set_plugin_path "${@}"
|
|
else
|
|
get_plugin_path
|
|
fi
|
|
|
|
## Don't fail if not directory was found
|
|
test -n "${plugin_base-}" || exit 0
|
|
|
|
for p in ${plugin_base}; do
|
|
test -d "${p}" || continue
|
|
source_plugins "${p}"
|
|
done
|
|
|
|
exit
|