about summary refs log tree commit diff
path: root/Completion/Darwin/Type/_retrieve_mac_apps
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Darwin/Type/_retrieve_mac_apps')
-rw-r--r--Completion/Darwin/Type/_retrieve_mac_apps59
1 files changed, 59 insertions, 0 deletions
diff --git a/Completion/Darwin/Type/_retrieve_mac_apps b/Completion/Darwin/Type/_retrieve_mac_apps
new file mode 100644
index 000000000..cef83913f
--- /dev/null
+++ b/Completion/Darwin/Type/_retrieve_mac_apps
@@ -0,0 +1,59 @@
+#autoload
+
+# Find paths of applications and preserve them into _mac_apps.
+# Used by _mac_applications and _mac_files_for_application.
+
+_mac_apps_caching_policy () {
+   # Rebuild if cache is more than a day old
+   oldp=( "$1"(Nmw+1) )
+   (( $#oldp ))
+}
+
+_retrieve_mac_apps() {
+  local cache_policy
+  zstyle -s ":completion:*:*:$service:*" cache-policy cache_policy
+  if [[ -z "$cache_policy" ]]; then
+    zstyle ":completion:*:*:$service:*" cache-policy _mac_apps_caching_policy
+  fi
+
+  if ( [[ ${+_mac_apps} -eq 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
+    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) )
+    fi
+
+    typeset -g -Ua _mac_apps
+    local -a app_result
+
+    # 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*} )
+    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
+
+    _store_cache Mac_applications _mac_apps
+  fi
+}
+
+_retrieve_mac_apps "$@"