From 9a819df9d7bf11359ee3c264138d651e9d68b3a2 Mon Sep 17 00:00:00 2001 From: Motoi WASHIDA Date: Fri, 13 May 2005 17:48:58 +0000 Subject: users/8826: search applications using spotlight. --- Completion/Darwin/Type/_retrieve_mac_apps | 100 ++++++++++++++++++++++-------- 1 file changed, 73 insertions(+), 27 deletions(-) (limited to 'Completion') 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 -- cgit 1.4.1