1
0
mirror of https://github.com/zplug/zplug synced 2024-09-27 22:49:50 +02:00
zplug/base/utils/shell.zsh

281 lines
5.5 KiB
Bash

__zplug::utils::shell::remove_deadlinks()
{
local link
for link in "$@"
do
if [[ -L $link ]] && [[ ! -e $link ]]; then
rm -f "$link"
fi
done
}
__zplug::utils::shell::search_commands()
{
local -a args
local arg element cmd_name
local is_verbose=true
while (( $# > 0 ))
do
arg="$1"
case "$arg" in
--verbose)
is_verbose=true
;;
--silent)
is_verbose=false
;;
-*|--*)
return 1
;;
*)
args+=( "$arg" )
;;
esac
shift
done
for arg in "${args[@]}"
do
for element in "${(s.:.)arg}"
do
# Extract the first argument sparated by a space
cmd_name="${element%% *}"
# Check if cmd_name is available
if (( $+commands[$cmd_name] )); then
if $is_verbose; then
echo "$cmd_name"
fi
return 0
else
continue
fi
done
done
return 1
}
__zplug::utils::shell::glob2regexp()
{
local -i i=0
local glob="$1" char
printf "^"
for ((; i < $#glob; i++))
do
char="${glob:$i:1}"
case "$char" in
\*)
printf '.*'
;;
.)
printf '\.'
;;
"{")
printf '('
;;
"}")
printf ')'
;;
,)
printf '|'
;;
"?")
printf '.'
;;
\\)
printf '\\\\'
;;
*)
printf "$char"
;;
esac
done
printf "$\n"
}
__zplug::utils::shell::sudo()
{
local pw="$ZPLUG_SUDO_PASSWORD"
if [[ -z $pw ]]; then
__zplug::log::write::error \
"ZPLUG_SUDO_PASSWORD: is an invalid value\n"
return 1
fi
sudo -k
echo "$pw" \
| sudo -S -p '' "$argv[@]"
}
__zplug::utils::shell::unansi()
{
perl -pe 's/\e\[?.*?[\@-~]//g'
}
__zplug::utils::shell::cd()
{
local dir arg
local -a dirs
local is_force=false
while (( $# > 0 ))
do
arg="$1"
case "$arg" in
--force)
is_force=true
;;
-*|--*)
return 1
;;
"")
;;
*)
dirs+=( "$arg" )
;;
esac
shift
done
for dir in "$dirs[@]"
do
if $is_force; then
[[ -d $dir ]] || mkdir -p "$dir"
fi
builtin cd "$dir" &>/dev/null
return $status
done
return 1
}
__zplug::utils::shell::getopts()
{
printf "%s\n" "$argv[@]" \
| awk -f "$ZPLUG_ROOT/misc/contrib/getopts.awk"
}
__zplug::utils::shell::pipestatus()
{
local _status="${pipestatus[*]-}"
[[ ${_status//0 /} == 0 ]]
return $status
}
__zplug::utils::shell::expand_glob()
{
local pattern="$1" file
# Modifiers to use if $pattern does not include modifiers
local default_modifiers="${2:-(N)}"
local -a matches
# Modifiers not specified (by user)
if [[ ! $pattern =~ '[^/]\([^)]*\)$' ]]; then
pattern+="$default_modifiers"
fi
# Try expanding ~ and *
matches=( ${~pattern} )
# Use subshell for brace expansion
if (( $#matches <= 1 )); then
matches=( $( \
zsh -c "$_ZPLUG_CONFIG_SUBSHELL; echo $pattern" \
2> >(__zplug::log::capture::error) \
) )
fi
for file in "${matches[@]}"
do
[[ -e ${~file} ]] && echo ${~file}
done
}
__zplug::utils::shell::zglob()
{
(
emulate -RL zsh
setopt localoptions extendedglob
local f g match mbegin mend p_dir1 p_dir2
local MATCH MBEGIN MEND
local pat repl fpat
local -a files targets
local -A from to
p_dir1=${~1:h}
p_dir2=${~2:h}
builtin cd $p_dir1
pat=${1:t}
repl=${2:t}
shift 2
if [[ $pat = (#b)(*)\((\*\*##/)\)(*) ]]; then
fpat="$match[1]$match[2]$match[3]"
setopt localoptions bareglobqual
fpat="${fpat}(odon)"
else
fpat=$pat
fi
files=(${~fpat}(N))
for f in $files[@]
do
if [[ $pat = (#b)(*)\(\*\*##/\)(*) ]]; then
pat="$match[1](*/|)$match[2]"
fi
[[ -e $f && $f = (#b)${~pat} ]] || continue
set -- "$match[@]"
g=${(Xe)repl} 2>/dev/null
from[$g]=$f
to[$f]=$g
done
for f in $files[@]
do
[[ -z $to[$f] ]] && continue
targets=($p_dir1/$f $p_dir2/$to[$f])
print -r -- ${(q-)targets}
done
)
}
__zplug::utils::shell::eval()
{
local cmd
# Report stderr to error log
eval "${=cmd}" 2> >(__zplug::log::capture::error) >/dev/null
return $status
}
__zplug::utils::shell::json_escape()
{
if (( $+commands[python] )) && python -c 'import json' 2> /dev/null; then
python -c '
from __future__ import print_function
import json,sys
print(json.dumps(sys.stdin.read()))' \
2> >(__zplug::log::capture::error)
else
echo "(Not available: python with json required)"
fi
}
__zplug::utils::shell::is_atty()
{
if [[ -t 0 && -t 1 ]]; then
# terminal
return 0
else
# pipeline
return 1
fi
}