zsh-workers
 help / color / mirror / code / Atom feed
From: dana <dana@dana.is>
To: Zsh workers <zsh-workers@zsh.org>
Subject: [PATCH] Completion: Improve _open
Date: Mon, 18 Jun 2018 19:07:40 -0500	[thread overview]
Message-ID: <C9DCA672-DAB7-4ABD-868F-ADDFEFE98B4D@dana.is> (raw)

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'


                 reply	other threads:[~2018-06-19  0:07 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=C9DCA672-DAB7-4ABD-868F-ADDFEFE98B4D@dana.is \
    --to=dana@dana.is \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).