mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2024-12-19 20:29:45 +01:00
perf(dash): improve dash completion performance
This commit is contained in:
parent
c4699f8ee1
commit
3459768745
1 changed files with 67 additions and 63 deletions
|
@ -5,76 +5,80 @@ compdef _dash dash
|
||||||
_dash() {
|
_dash() {
|
||||||
# No sense doing this for anything except the 2nd position and if we haven't
|
# No sense doing this for anything except the 2nd position and if we haven't
|
||||||
# specified which docset to query against
|
# specified which docset to query against
|
||||||
if [[ $CURRENT -eq 2 && ! "$words[2]" =~ ":" ]]; then
|
if [[ $CURRENT -ne 2 || "$words[2]" =~ ":" ]]; then
|
||||||
local -a _all_docsets
|
return
|
||||||
_all_docsets=()
|
|
||||||
# Use defaults to get the array of docsets from preferences
|
|
||||||
# Have to smash it into one big line so that each docset is an element of
|
|
||||||
# our DOCSETS array
|
|
||||||
DOCSETS=("${(@f)$(defaults read com.kapeli.dashdoc docsets | tr -d '\n' | grep -oE '\{.*?\}')}")
|
|
||||||
|
|
||||||
# remove all newlines since defaults prints so pretty like
|
|
||||||
# Now get each docset and output each on their own line
|
|
||||||
for doc in "$DOCSETS[@]"; do
|
|
||||||
# Only output docsets that are actually enabled
|
|
||||||
if [[ "`echo $doc | grep -Eo \"isEnabled = .*?;\" | sed 's/[^01]//g'`" == "0" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
keyword=''
|
local -aU docsets
|
||||||
|
docsets=()
|
||||||
|
|
||||||
|
# Use defaults to get the array of docsets from preferences
|
||||||
|
# Have to smash it into one big line so that each docset is an element of our docsets array
|
||||||
|
# Only output docsets that are actually enabled
|
||||||
|
local -a enabled_docsets
|
||||||
|
enabled_docsets=("${(@f)$(defaults read com.kapeli.dashdoc docsets \
|
||||||
|
| tr -d '\n' | grep -oE '\{.*?\}' | grep -E 'isEnabled = 1;')}")
|
||||||
|
|
||||||
|
local docset name keyword
|
||||||
|
# Now get each docset and output each on their own line
|
||||||
|
for docset in "$enabled_docsets[@]"; do
|
||||||
|
keyword=''
|
||||||
# Order of preference as explained to me by @kapeli via email
|
# Order of preference as explained to me by @kapeli via email
|
||||||
KEYWORD_LOCATORS=(keyword suggestedKeyword platform)
|
for locator in keyword suggestedKeyword platform; do
|
||||||
for locator in "$KEYWORD_LOCATORS[@]"; do
|
|
||||||
# Echo the docset, try to find the appropriate keyword
|
# Echo the docset, try to find the appropriate keyword
|
||||||
# Strip doublequotes and colon from any keyword so that everything has the
|
# Strip doublequotes and colon from any keyword so that everything has the
|
||||||
# same format when output (we'll add the colon in the completion)
|
# same format when output (we'll add the colon in the completion)
|
||||||
keyword=`echo $doc | grep -Eo "$locator = .*?;" | sed -e "s/$locator = \(.*\);/\1/" -e "s/[\":]//g"`
|
if [[ "$docset" =~ "$locator = ([^;]*);" ]]; then
|
||||||
if [[ ! -z "$keyword" ]]; then
|
keyword="${match[1]//[\":]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$keyword" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
# if we fall back to platform, we should do some checking per @kapeli
|
# if we fall back to platform, we should do some checking per @kapeli
|
||||||
if [[ "$locator" == "platform" ]]; then
|
if [[ "$locator" == "platform" ]]; then
|
||||||
# Since these are the only special cases right now, let's not do the
|
# Since these are the only special cases right now, let's not do the
|
||||||
# expensive processing unless we have to
|
# expensive processing unless we have to
|
||||||
if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
|
if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
|
||||||
docsetName=`echo $doc | grep -Eo "docsetName = .*?;" | sed -e "s/docsetName = \(.*\);/\1/" -e "s/[\":]//g"`
|
if [[ "$docset" =~ "docsetName = ([^;]*);" ]]; then
|
||||||
|
name="${match[1]//[\":]}"
|
||||||
case "$keyword" in
|
case "$keyword" in
|
||||||
python)
|
python)
|
||||||
case "$docsetName" in
|
case "$name" in
|
||||||
"Python 2") keyword="python2" ;;
|
"Python 2") keyword="python2" ;;
|
||||||
"Python 3") keyword="python3" ;;
|
"Python 3") keyword="python3" ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
java)
|
java)
|
||||||
case "$docsetName" in
|
case "$name" in
|
||||||
"Java SE7") keyword="java7" ;;
|
"Java SE7") keyword="java7" ;;
|
||||||
"Java SE6") keyword="java6" ;;
|
"Java SE6") keyword="java6" ;;
|
||||||
"Java SE8") keyword="java8" ;;
|
"Java SE8") keyword="java8" ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
qt)
|
qt)
|
||||||
case "$docsetName" in
|
case "$name" in
|
||||||
"Qt 5") keyword="qt5" ;;
|
"Qt 5") keyword="qt5" ;;
|
||||||
"Qt 4"|Qt) keyword="qt4" ;;
|
"Qt 4"|Qt) keyword="qt4" ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
cocos2d)
|
cocos2d)
|
||||||
case "$docsetName" in
|
case "$name" in
|
||||||
Cocos3D) keyword="cocos3d" ;;
|
Cocos3D) keyword="cocos3d" ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Bail once we have a match
|
# Bail once we have a match
|
||||||
break
|
break
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
||||||
# If we have a keyword, add it to the list!
|
# If we have a keyword, add it to the list!
|
||||||
if [[ ! -z "$keyword" ]]; then
|
if [[ -n "$keyword" ]]; then
|
||||||
_all_docsets+=($keyword)
|
docsets+=($keyword)
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# special thanks to [arx] on #zsh for getting me sorted on this piece
|
# special thanks to [arx] on #zsh for getting me sorted on this piece
|
||||||
compadd -qS: -- "$_all_docsets[@]"
|
compadd -qS: -- "$docsets[@]"
|
||||||
return
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue