summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Cornellà <hello@mcornella.com>2022-03-10 20:56:37 +0100
committerMarc Cornellà <hello@mcornella.com>2022-03-14 13:19:00 +0100
commit345976874550efa09fa7e9cdbe1215ce27d1541b (patch)
treeb5e0a5bdc50a5cdc21f65b0f74a154038f24666b
parentc4699f8ee11ab74cd5ef1d7ae13c170fd5e7f976 (diff)
downloadzsh-345976874550efa09fa7e9cdbe1215ce27d1541b.tar.gz
zsh-345976874550efa09fa7e9cdbe1215ce27d1541b.tar.bz2
zsh-345976874550efa09fa7e9cdbe1215ce27d1541b.zip
perf(dash): improve dash completion performance
-rw-r--r--plugins/dash/dash.plugin.zsh130
1 files changed, 67 insertions, 63 deletions
diff --git a/plugins/dash/dash.plugin.zsh b/plugins/dash/dash.plugin.zsh
index 0a627cb7d..f6801a870 100644
--- a/plugins/dash/dash.plugin.zsh
+++ b/plugins/dash/dash.plugin.zsh
@@ -5,76 +5,80 @@ compdef _dash dash
_dash() {
# No sense doing this for anything except the 2nd position and if we haven't
# specified which docset to query against
- if [[ $CURRENT -eq 2 && ! "$words[2]" =~ ":" ]]; then
- local -a _all_docsets
- _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 '\{.*?\}')}")
+ if [[ $CURRENT -ne 2 || "$words[2]" =~ ":" ]]; then
+ return
+ fi
- # 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
+ 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
+ for locator in keyword suggestedKeyword platform; do
+ # Echo the docset, try to find the appropriate keyword
+ # Strip doublequotes and colon from any keyword so that everything has the
+ # same format when output (we'll add the colon in the completion)
+ if [[ "$docset" =~ "$locator = ([^;]*);" ]]; then
+ keyword="${match[1]//[\":]}"
fi
- keyword=''
+ if [[ -z "$keyword" ]]; then
+ continue
+ fi
- # Order of preference as explained to me by @kapeli via email
- KEYWORD_LOCATORS=(keyword suggestedKeyword platform)
- for locator in "$KEYWORD_LOCATORS[@]"; do
- # Echo the docset, try to find the appropriate keyword
- # Strip doublequotes and colon from any keyword so that everything has the
- # 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 [[ ! -z "$keyword" ]]; then
- # if we fall back to platform, we should do some checking per @kapeli
- if [[ "$locator" == "platform" ]]; then
- # Since these are the only special cases right now, let's not do the
- # expensive processing unless we have to
- if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
- docsetName=`echo $doc | grep -Eo "docsetName = .*?;" | sed -e "s/docsetName = \(.*\);/\1/" -e "s/[\":]//g"`
- case "$keyword" in
- python)
- case "$docsetName" in
- "Python 2") keyword="python2" ;;
- "Python 3") keyword="python3" ;;
- esac ;;
- java)
- case "$docsetName" in
- "Java SE7") keyword="java7" ;;
- "Java SE6") keyword="java6" ;;
- "Java SE8") keyword="java8" ;;
- esac ;;
- qt)
- case "$docsetName" in
- "Qt 5") keyword="qt5" ;;
- "Qt 4"|Qt) keyword="qt4" ;;
- esac ;;
- cocos2d)
- case "$docsetName" in
- Cocos3D) keyword="cocos3d" ;;
- esac ;;
- esac
- fi
+ # if we fall back to platform, we should do some checking per @kapeli
+ if [[ "$locator" == "platform" ]]; then
+ # Since these are the only special cases right now, let's not do the
+ # expensive processing unless we have to
+ if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
+ if [[ "$docset" =~ "docsetName = ([^;]*);" ]]; then
+ name="${match[1]//[\":]}"
+ case "$keyword" in
+ python)
+ case "$name" in
+ "Python 2") keyword="python2" ;;
+ "Python 3") keyword="python3" ;;
+ esac ;;
+ java)
+ case "$name" in
+ "Java SE7") keyword="java7" ;;
+ "Java SE6") keyword="java6" ;;
+ "Java SE8") keyword="java8" ;;
+ esac ;;
+ qt)
+ case "$name" in
+ "Qt 5") keyword="qt5" ;;
+ "Qt 4"|Qt) keyword="qt4" ;;
+ esac ;;
+ cocos2d)
+ case "$name" in
+ Cocos3D) keyword="cocos3d" ;;
+ esac ;;
+ esac
fi
-
- # Bail once we have a match
- break
fi
- done
-
- # If we have a keyword, add it to the list!
- if [[ ! -z "$keyword" ]]; then
- _all_docsets+=($keyword)
fi
+
+ # Bail once we have a match
+ break
done
- # special thanks to [arx] on #zsh for getting me sorted on this piece
- compadd -qS: -- "$_all_docsets[@]"
- return
- fi
+ # If we have a keyword, add it to the list!
+ if [[ -n "$keyword" ]]; then
+ docsets+=($keyword)
+ fi
+ done
+
+ # special thanks to [arx] on #zsh for getting me sorted on this piece
+ compadd -qS: -- "$docsets[@]"
}