Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Completion: Improve _open



Improvements to Darwin's open command:

* Add a bunch of missing options and fix some exclusivity issues.

* Complete bundle IDs, headers, and SDKs.

* Eliminate the use of _mac_files_for_application — this is designed to return
  only the file types known to be supported by a given macOS app, but i've found
  it to be very unreliable in practice (most notably with text editors, which
  don't really have a fixed set of supported file types). Also, getting it to
  work consistently with the -b and -t options would require a lot of extra
  effort for not much gain.

  Let me know if it seems like i'm throwing the baby out with the bath water,
  but just getting rid of it seemed like the easy choice.

I also changed _webbrowser so that it doesn't override the default descriptions
for _files and _urls — not sure why that'd be desirable.

dana


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 "$@"

diff --git a/Completion/Unix/Command/_webbrowser b/Completion/Unix/Command/_webbrowser
index 4192aff54..e4f5fe092 100644
--- a/Completion/Unix/Command/_webbrowser
+++ b/Completion/Unix/Command/_webbrowser
@@ -1,3 +1,3 @@
 #compdef amaya arena chimera dillo dwb express galeon grail gzilla hotjava konqueror light mmm Mosaic netrik opera opera-next retawq skipstone www xmosaic zen
 
-_alternative 'files:file:_files' 'urls:URL:_urls'
+_alternative 'files: :_files' 'urls: :_urls'



Messages sorted by: Reverse Date, Date, Thread, Author