From 7caec474de577e59a6cf45952e5b87712967aa45 Mon Sep 17 00:00:00 2001 From: dana Date: Wed, 20 Jun 2018 00:26:41 -0500 Subject: 43061: Improve open (macOS) completion --- Completion/Darwin/Command/_open | 78 +++++++++++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 18 deletions(-) (limited to 'Completion/Darwin') diff --git a/Completion/Darwin/Command/_open b/Completion/Darwin/Command/_open index eadad1831..2563e5eb5 100644 --- a/Completion/Darwin/Command/_open +++ b/Completion/Darwin/Command/_open @@ -1,5 +1,12 @@ #compdef open +# Notes: +# - open(1) says that -f opens the result in the default text editor. This is +# not true; the result is always opened in TextEdit unless another option is +# supplied to override it +# - We no longer try to restrict files to those associated with the specified +# app; this was a nice idea, but it's unreliable + _open_absolute_application_path() { local expl curcontext zstyle -T ":completion:${curcontext}:files" prefix-needed && \ @@ -8,34 +15,69 @@ _open_absolute_application_path() { } _open() { - local curcontext="$curcontext" state line expl + local curcontext=$curcontext ret=1 + local -a context expl line state state_descr tmp + local -A opt_args val_args - _arguments -C \ - '-a[specify application]: :->open_mac_applications' \ - '-e[open with TextEdit]' \ - '-f[reads input from standard input and opens with TextEdit]' \ - '*: :->open_files' + # No +, and no -S (--args covers that) + _arguments -s -C : \ + '(-a -b -e -f -R -t)-a+[specify application name]: :->applications' \ + '(: * -)--args[pass remaining arguments to application]:*:::argument' \ + '(-a -b -e -f -R -t)-b+[specify application bundle identifier]: :->bundle-ids' \ + '(-a -b -e -f -R -t)-e[open with TextEdit]' \ + '(-h)-f[open standard input with TextEdit or specified application]' \ + '(-R)-F[open application with fresh state]' \ + '-g[do not bring application to foreground]' \ + '(-f)-h[open library header file]' \ + '(-R)-n[always open new instance of application]' \ + '(-a -b -e -f -F -n -s -t -W --args)-R[reveal in Finder]' \ + '(-R)-s+[specify SDK name/version]: :->sdks' \ + '(-a -b -e -f -R -t)-t[open with default text editor]' \ + '(-R)-W[wait for application to exit]' \ + '(-f)*: :->files' \ + && ret=0 - case "$state" in - open_mac_applications) + case $state in + applications) _alternative \ "commands: :_mac_applications" \ - "files:: _open_absolute_application_path" + "files:: _open_absolute_application_path" \ + && ret=0 + ;; + bundle-ids) + autoload -Uz zargs + _retrieve_mac_apps + tmp=( ${(@)_mac_apps:#/System/Library/(Private|)Frameworks/*} ) + tmp=( ${(0)"$( + _call_program bundle-ids \ + zargs -n300 -P2 -- ${(@q)tmp} -- mdls -rn kMDItemCFBundleIdentifier + )"} ) + tmp=( ${(@)tmp:#\(null\)} ) + _values 'bundle identifier' $tmp com.apple.TextEdit && ret=0 ;; - open_files) - local app - if [[ -n "$words[(r)-a]" ]]; then - app="${(Q)words[words[(i)-a] + 1]}" - elif [[ -n "$words[(r)-e]" || -n "$words[(r)-f]" ]]; then - app="Text Edit" + files) + if (( $+opt_args[-h] )); then + tmp=( + /System/Library/Frameworks/*/Headers/*.h(#q-.N:t) + /usr/local/include/**/*.h(#q-.N:t) + /usr/include/**/*.h(#q-.N:t) + ) + _describe -t headers 'header file' tmp && ret=0 + else + _webbrowser && ret=0 fi - if [[ -n "$app" ]]; then - _wanted files expl "file for $app" _mac_files_for_application "$app" + ;; + sdks) + tmp=( /Library/Developer/CommandLineTools/SDKs/*.*.sdk(#qN:t:r) ) + if (( $#tmp )); then + _describe -t sdks 'SDK name/version' tmp && ret=0 else - _webbrowser + _message -e sdks 'SDK name/version' && ret=0 fi ;; esac + + return ret } _open "$@" -- cgit 1.4.1