From 24a68220a105c70a54baa543917e1022ae3e7a8d Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Fri, 12 Nov 2004 11:47:41 +0000 Subject: improved Mac completion, from Motoi Washida --- Completion/Darwin/Type/_mac_files_for_application | 74 +++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Completion/Darwin/Type/_mac_files_for_application (limited to 'Completion/Darwin/Type/_mac_files_for_application') diff --git a/Completion/Darwin/Type/_mac_files_for_application b/Completion/Darwin/Type/_mac_files_for_application new file mode 100644 index 000000000..cd4c7860b --- /dev/null +++ b/Completion/Darwin/Type/_mac_files_for_application @@ -0,0 +1,74 @@ +#autoload + +_mac_rsrc_check() { + [[ ! -s "$REPLY/..namedfork/rsrc" ]] && return 1 + if [[ -x /Developer/Tools/GetFileInfo ]]; then + local ftype="$(command /Developer/Tools/GetFileInfo -t $REPLY)" + ftype="${ftype//\"/}" + [[ -n "$types[(r)$ftype]" ]] + else + grep --quiet "\(${(j/\|/)types}\)" "$REPLY/..namedfork/rsrc" + fi +} + +_mac_parse_info_plist() { + # For now, awk is used because builtin function "read" was too slow. + # '<' is used for the delimiter because some Info.plist files use CR as + # newline but read doesn't treat them as so + local s=' + BEGIN { RS="<" } + /^key>/ { sub(/key>/, ""); reading_key=$0 } + /^string>/ { + sub(/string>/, "") + if (reading_key == "CFBundleTypeExtensions") exts=exts " \"" $0 "\"" + if (reading_key == "CFBundleTypeOSTypes") types=types " \"" $0 "\"" + } + END { + print "exts=(" exts ")\ntypes=(" types ")" + } + ' + command awk $s "$app_path/Contents/Info.plist" | while read; do + eval "$REPLY" + done +} + +# Try to complete files for the specified application. +_mac_files_for_application() { + local -a opts + zparseopts -D -a opts q n 1 2 P: S: r: R: W: X+: M+: F: J+: V+: + + local app_path + _retrieve_mac_apps + app_path="${_mac_apps[(r)*/$1(|.app)]:-$1}" + + local -a glob_patterns + glob_patterns=() + + # Try to get extentions from "Info.plist" XML file. + if [[ -f "$app_path/Contents/Info.plist" ]]; then + local -a exts types + _mac_parse_info_plist + + if [[ -n "$exts[(r)\*]" ]]; then + glob_patterns=( "*" ) + else + if (( #exts != 0 )); then + glob_patterns+=( "*.(${(j/|/)exts})(N)" ) + fi + + if (( #types != 0 )); then + glob_patterns+=( "^*.[[:alnum:]]##(.Ne:_mac_rsrc_check:)" ) + fi + fi + else + glob_patterns=( "*" ) + fi + + case ${#glob_patterns} in + 0) return 1 ;; + 1) _files "$opts[@]" -g "$glob_patterns[0]" ;; + *) _files "$opts[@]" -g "{${(j/,/)glob_patterns}}" ;; + esac +} + +_mac_files_for_application "$@" -- cgit 1.4.1