diff options
author | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-04-29 01:04:00 +0000 |
---|---|---|
committer | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-04-29 01:04:00 +0000 |
commit | 54055e8150cea99e44a7a98ace077a8b3eaab256 (patch) | |
tree | 792c7e5524315d65e7620c13bb61ef2e4a50d730 /Completion/Darwin/Type | |
parent | f0ebed57619e1c43c8fc7a56781df911d7973541 (diff) | |
download | zsh-54055e8150cea99e44a7a98ace077a8b3eaab256.tar.gz zsh-54055e8150cea99e44a7a98ace077a8b3eaab256.tar.xz zsh-54055e8150cea99e44a7a98ace077a8b3eaab256.zip |
Merge of users/8826: search applications using spotlight.
Diffstat (limited to 'Completion/Darwin/Type')
-rw-r--r-- | Completion/Darwin/Type/_retrieve_mac_apps | 105 |
1 files changed, 105 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..c1b05e9f4 --- /dev/null +++ b/Completion/Darwin/Type/_retrieve_mac_apps @@ -0,0 +1,105 @@ +#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 )) +} + + +# _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 + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:*:*:$service:*" cache-policy _mac_apps_caching_policy + fi + + if ( (( ${#_mac_apps} == 0 )) || _cache_invalid Mac_applications ) \ + && ! _retrieve_cache Mac_applications; then + + # Get application search method + typeset retrieve + if ! zstyle -s ":completion:*:*:$service:commands" search-method retrieve + then + 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 + + # 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 + + zstyle ":completion:*" application-path $app_dir_root + fi + + typeset -g -Ua _mac_apps + $retrieve + + _store_cache Mac_applications _mac_apps + fi +} + +_retrieve_mac_apps "$@" |