Browse Source

perf(dash): improve dash completion performance

Marc Cornellà 2 years ago
parent
commit
3459768745
1 changed files with 67 additions and 63 deletions
  1. 67 63
      plugins/dash/dash.plugin.zsh

+ 67 - 63
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[@]"
 }