about summary refs log tree commit diff
path: root/Completion/Darwin
diff options
context:
space:
mode:
authordana <dana@dana.is>2018-06-20 00:26:41 -0500
committerdana <dana@dana.is>2018-06-20 00:26:41 -0500
commit7caec474de577e59a6cf45952e5b87712967aa45 (patch)
tree5e3236567c6b84ab96919c39045b9cb2e703bfe2 /Completion/Darwin
parent05e4ee0587ae6e804117612bd459cfb23e337d1d (diff)
downloadzsh-7caec474de577e59a6cf45952e5b87712967aa45.tar.gz
zsh-7caec474de577e59a6cf45952e5b87712967aa45.tar.xz
zsh-7caec474de577e59a6cf45952e5b87712967aa45.zip
43061: Improve open (macOS) completion
Diffstat (limited to 'Completion/Darwin')
-rw-r--r--Completion/Darwin/Command/_open78
1 files changed, 60 insertions, 18 deletions
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 "$@"