summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Completion/Darwin/Type/_retrieve_mac_apps100
2 files changed, 77 insertions, 27 deletions
diff --git a/ChangeLog b/ChangeLog
index 1708b4958..5fc60ca64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-05-13  Motoi Washida <a66@h8.dion.ne.jp>
+	* users/8826: Completion/Darwin/Type/_retrieve_mac_apps: search
+	applications using spotlight. 
+
 2005-05-12  Felix Rosencrantz <f.rosencrantz@gmail.com>
 
 	* 21257: Completion/Unix/Command/_perforce: fix minor typo
diff --git a/Completion/Darwin/Type/_retrieve_mac_apps b/Completion/Darwin/Type/_retrieve_mac_apps
index cef83913f..c1b05e9f4 100644
--- a/Completion/Darwin/Type/_retrieve_mac_apps
+++ b/Completion/Darwin/Type/_retrieve_mac_apps
@@ -9,6 +9,55 @@ _mac_apps_caching_policy () {
    (( $#oldp ))
 }
 
+
+# _mac_apps_*_retrieve
+# 
+# Get search applications from directories specified in app_dir_root.
+# Paths to applications are stored in _mac_apps.
+
+_mac_apps_spotlight_retrieve () {
+  typeset mdfind_query="kMDItemContentType == 'com.apple.application-*'"
+
+  for i in ${app_dir_root}; do
+    _mac_apps+=(${(f)"$(_call_program command \
+        mdfind -onlyin ${(q)i} ${(q)mdfind_query})"})
+  done
+}
+
+_mac_apps_old_retrieve () {
+  # Get directories which may contain applications
+  typeset -aU app_dir 
+  if [[ -z "$app_dir" ]] && \
+    ! zstyle -a ":completion:${curcontext}:commands" application-dir app_dir
+  then
+    typeset -a app_dir_stop_pattern
+    app_dir_stop_pattern=( "*.app" "contents#" "*data" "*plugins#" "*plug?ins#" "fonts#" "document[[:alpha:]]#" "*help" "resources#" "images#" "*configurations#" )
+    typeset app_dir_pattern
+    app_dir_pattern="(^(#i)(${(j/|/)app_dir_stop_pattern}))"
+    app_dir=( ${^app_dir_root}/(${~app_dir_pattern}/)#(N) )
+  fi
+
+  # Get application bundles
+  local -a app_result
+
+  if ! zstyle -t ":completion:${curcontext}:commands" ignore-bundle; then
+    app_result=( ${^app_dir}*/Contents/(MacOS|MacOSClassic)(N) )
+    _mac_apps+=( ${app_result[@]%/Contents/MacOS*} )
+  fi
+
+  # Get single file applications
+  if ! zstyle -t ":completion:${curcontext}:commands" ignore-single; then
+    autoload -U zargs
+    local app_cand nargs envvars
+    app_cand=( ${^app_dir}^*.[a-z]#/..namedfork/rsrc(.UrN,.RN^U) )
+    envvars="$(builtin typeset -x)"
+    nargs=$(( $(command sysctl -n kern.argmax) - $#envvars - 2048 ))
+    app_result="$(zargs --max-chars $nargs ${app_cand[@]} -- grep -l APPL)"
+    _mac_apps+=( ${${(f)app_result}%/..namedfork/rsrc} )
+  fi
+}
+
+
 _retrieve_mac_apps() {
   local cache_policy
   zstyle -s ":completion:*:*:$service:*" cache-policy cache_policy
@@ -16,41 +65,38 @@ _retrieve_mac_apps() {
     zstyle ":completion:*:*:$service:*" cache-policy _mac_apps_caching_policy
   fi
 
-  if ( [[ ${+_mac_apps} -eq 0 ]] || _cache_invalid Mac_applications ) \
+  if ( (( ${#_mac_apps} == 0 )) || _cache_invalid Mac_applications ) \
         && ! _retrieve_cache Mac_applications; then
 
-    # Get directories which may contain applications
-    typeset -aU app_dir 
-    if [[ -z "$app_dir" ]] && \
-      ! zstyle -s ":completion:${curcontext}:commands" application-dir app_dir
+    # Get application search method
+    typeset retrieve
+    if ! zstyle -s ":completion:*:*:$service:commands" search-method retrieve
     then
-      typeset -a app_dir_stop_pattern app_dir_root
-      app_dir_stop_pattern=( "*.app" "contents#" "*data" "*plugins#" "*plug?ins#" "fonts#" "document[[:alpha:]]#" "*help" "resources#" "images#" "*configurations#" )
-      app_dir_root=( {,/Developer,/Network,"$HOME"}/{Applications*(N),Desktop} )
-      typeset app_dir_pattern
-      app_dir_pattern="(^(#i)(${(j/|/)app_dir_stop_pattern}))"
-      app_dir=( ${^app_dir_root}/(${~app_dir_pattern}/)#(N) )
+      if [[ -d /.Spotlight-V100 ]]; then
+        # / is indexed to use Spotlight
+        retrieve=_mac_apps_spotlight_retrieve
+      else
+        # Fall back to the old way
+        retrieve=_mac_apps_old_retrieve 
+      fi
+      zstyle ":completion:*:*:$service:commands" search-method $retrieve
     fi
 
-    typeset -g -Ua _mac_apps
-    local -a app_result
+    # Get root directories to search applications
+    typeset -a app_dir_root
+    if ! zstyle -a ":completion:${curcontext}" application-path app_dir_root
+    then
+      if [[ $retrieve = _mac_apps_old_retrieve ]]; then
+        app_dir_root=( {,/Developer,/Network,"$HOME"}/{Applications*(N),Desktop} )
+      else
+        app_dir_root=( / )
+      fi
 
-    # Get application bundles
-    if ! zstyle -t ":completion:${curcontext}:commands" ignore-bundle; then
-      app_result=( ${^app_dir}*/Contents/(MacOS|MacOSClassic)(N) )
-      _mac_apps+=( ${app_result[@]%/Contents/MacOS*} )
+      zstyle ":completion:*" application-path $app_dir_root
     fi
 
-    # Get single file applications
-    if ! zstyle -t ":completion:${curcontext}:commands" ignore-single; then
-      autoload -U zargs
-      local app_cand nargs envvars
-      app_cand=( ${^app_dir}^*.[a-z]#/..namedfork/rsrc(.UrN,.RN^U) )
-      envvars="$(builtin typeset -x)"
-      nargs=$(( $(command sysctl -n kern.argmax) - $#envvars - 2048 ))
-      app_result="$(zargs --max-chars $nargs ${app_cand[@]} -- grep -l APPL)"
-      _mac_apps+=( ${${(f)app_result}%/..namedfork/rsrc} )
-    fi
+    typeset -g -Ua _mac_apps
+    $retrieve
 
     _store_cache Mac_applications _mac_apps
   fi