zsh-workers
 help / color / mirror / code / Atom feed
* [PATCH] Completion: Improve _open
@ 2018-06-19  0:07 dana
  0 siblings, 0 replies; only message in thread
From: dana @ 2018-06-19  0:07 UTC (permalink / raw)
  To: Zsh workers

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'


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2018-06-19  0:07 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-19  0:07 [PATCH] Completion: Improve _open dana

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).