bash-it/lib/search.bash

114 lines
3.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# This function returns list of aliases, plugins and completions in bash-it,
# whose name or description matches one of the search terms provided as arguments.
#
# Usage:
# bash-it search term1 [term2]...
# Example:
# bash-it search ruby rbenv rvm gem rake
# aliases: bundler
# plugins: chruby chruby-auto rbenv ruby rvm
# completions: gem rake
#
_bash-it-search() {
_about 'searches for given terms amongst bash-it plugins, aliases and completions'
_param '1: term1'
_param '2: [ term2 ]...'
_example '$ _bash-it-search ruby rvm rake bundler'
declare -a _components=(aliases plugins completions)
for _component in "${_components[@]}" ; do
_bash-it-search-component "${_component}" "$@"
done
}
#
# array=("something to search for" "a string" "test2000")
# _bash-it-array-contains-element "a string" "${array[@]}"
# ( prints "true" or "false" )
_bash-it-array-contains-element () {
local e
local r=false
for e in "${@:2}"; do [[ "$e" == "$1" ]] && r=true; done
echo -n $r
}
_bash-it-search-component() {
_about 'searches for given terms amongst a given component'
_param '1: component type, one of: [ aliases | plugins | completions ]'
_param '2: term1'
_param '3: [ term2 ]...'
_example '$ _bash-it-search-component aliases rake bundler'
_component=$1
local func=_bash-it-${_component}
local help=$($func)
shift
# if one of the search terms is --enable or --disable, we will apply
# this action to the result set interactively.
local cmd action component_singular
declare -a _search_commands=(enable disable)
for _search_command in "${_search_commands[@]}"; do
if [[ $(_bash-it-array-contains-element "--${_search_command}" "$@") == "true" ]]; then
cmd=$_search_command
component_singular=${_component}
component_singular=${component_singular/es/} # aliases -> alias
component_singular=${component_singular/ns/n} # plugins -> plugin
action="_${cmd}-${component_singular}"
break
fi
done
declare -a terms=($@)
declare -a matches=()
local _grep=$(which egrep || which grep)
for term in "${terms[@]}"; do
if [[ "${term}" =~ "--" ]]; then
continue
fi
# print asterisk next to each command that is already enabled
local term_match=($(echo "${help}"| ${_grep} -i -- ${term} | cut -b -30 | sed 's/ *\[ \]//g;s/ *\[x\]/*/g;' ))
[[ "${#term_match[@]}" -gt 0 ]] && {
matches=(${matches[@]} ${term_match[@]})
}
done
_bash-it-search-result $action # "${matches[@]}"
unset matches
}
_bash-it-search-result() {
local action=shift
local color_component color_enable color_disable color_off
[[ -z "$NO_COLOR" ]] && {
color_component='\e[0;33m'
color_enable='\e[1;32m'
color_disable='\e[0;0m'
color_off='\e[0;0m'
}
[[ -n "$NO_COLOR" ]] && {
color_enable='*'
}
if [[ "${#matches[*]}" -gt 0 ]] ; then
printf "${color_component}%-12s:${color_off} " "${_component}"
sorted_matches=($(echo "${matches[*]}" | tr ' ' '\n' | sort | uniq))
for match in "${sorted_matches[@]}"; do
local match_color
if [[ $match =~ "*" ]]; then
match_color=$color_enable
else
match_color=$color_disable
fi
printf " ${match_color}${match/\*/}${color_off}"
done
printf "\n"
fi
}