about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--Doc/Zsh/contrib.yo84
-rw-r--r--Functions/MIME/pick-web-browser151
3 files changed, 151 insertions, 87 deletions
diff --git a/ChangeLog b/ChangeLog
index 0748f6710..3960e0e3f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2007-08-14  Peter Stephenson  <pws@csr.com>
 
+	* 23759: Doc/Zsh/contrib.yo, Functions/MIME/pick-web-browser:
+	a few improvements to pick-web-browser.
+
 	* 23757: Src/lex.c: suppression correction of command
 	words immediately followed by () or something that looks
 	like it's going to be one.
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index ab80f9e9a..fb56353f2 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -1697,40 +1697,76 @@ example(autoload -U pick-web-browser
 alias -s html=pick-web-browser)
 
 It is provided as an intelligent front end to dispatch a web browser.
-It will check if an X Windows display is available, and if so if there
-is already a browser running on the display which can accept a remote
-connection.  In that case, the file will be displayed in that browser;
-you should check explicitly if it has appeared in the running browser's
-window.  Otherwise, it will start a new browser according to a built-in
-set of preferences.
-
-Alternatively, tt(pick-web-browser) can be run as a zsh script.
-
-Two styles are available to customize the choice of browsers:
-tt(x-browsers) when running under the X Window System, and
-tt(tty-browsers) otherwise.  These are arrays in decreasing order
-of preference consisting of the command name under which to start the
+It may be run as either a function or a shell script.  The status
+255 is returned if no browser could be started.
+
+Various styles are available to customize the choice of browsers:
+
+startitem()
+item(tt(browser-style))(
+The value of the style is an array giving preferences in decreasing order
+for the type of browser to use.  The values of elements may be
+
+startitem()
+item(tt(running))(
+Use a GUI browser that is already running when an X Window display is
+available.  The browsers listed in the tt(x-browsers) style are tried
+in order until one is found; if it is, the file will be displayed in
+that browser, so the user may need to check whether it has appeared.
+If no running browser is found, one is not started.  Browsers other than
+Firefox, Opera and Konqueror are assumed to understand the Mozilla
+syntax for opening a URL remotely.
+)
+item(tt(x))(
+Start a new GUI browser when an X Window display is available.  Search for
+the availability of one of the browsers listed in the tt(x-browsers) style
+and start the first one that is found.  No check is made for an already
+running browser.
+)
+item(tt(tty))(
+Start a terminal-based browser.  Search for the availability of one
+of the browsers listed in the tt(tty-browsers) style and start the
+first one that is found.
+)
+enditem()
+
+If the style is not set the default tt(running x tty) is used.
+)
+item(tt(x-browsers))(
+An array in decreasing order
+of preference of browsers to use when running under the X Window System.
+The array consists of the command name under which to start the
 browser.  They are looked up in the context tt(:mime:) (which may
 be extended in future, so appending `tt(*)' is recommended).  For
 example,
 
-example(zstyle ':mime:*' x-browsers opera konqueror netscape)
+example(zstyle ':mime:*' x-browsers opera konqueror firefox)
 
 specifies that tt(pick-web-browser) should first look for a runing
-instance of Opera, Konqueror or Netscape, in that order, and if it
-fails to find any should attempt to start Opera.
-
-In addition, the style tt(command), if set, is used to pick the command
+instance of Opera, Konqueror or Firefox, in that order, and if it
+fails to find any should attempt to start Opera.  The default is
+tt(firefox mozilla netscape opera konqueror).
+)
+item(tt(tty-browsers))(
+An array similar to tt(x-browsers), except that it gives browsers to
+use use when no X Window display is available.  The default is
+tt(elinks links lynx).
+)
+item(tt(command))(
+If it is set this style is used to pick the command
 used to open a page for a browser.  The context is
 tt(:mime:browser:new:$browser:) to start a new browser or
 tt(:mime:browser:running:$browser:) to open a URL in a browser already
-runing on the current X display.  The escape sequence tt(%b) in the
-style's value will be replaced by the browser, while tt(%u) will be
-replaced by the URL.  If the style is not set, the default for all new
-instances is equivalent to tt(%b %u) and the defaults for using running
+runing on the current X display, where tt($browser) is the value matched
+in the tt(x-browsers) or tt(tty-browsers) style.  The escape sequence
+tt(%b) in the style's value will be replaced by the browser, while tt(%u)
+will be replaced by the URL.  If the style is not set, the default for all
+new instances is equivalent to tt(%b %u) and the defaults for using running
 browsers are equivalent to the values tt(kfmclient openURL %u) for
-Konqueror, tt(firefox -new-tab %u) for Firefox and tt(%b -remote
-"openUrl+LPAR()%u+RPAR()") for all others.
+Konqueror, tt(firefox -new-tab %u) for Firefox, tt(opera -newpage %u)
+for Opera, and tt(%b -remote "openUrl+LPAR()%u+RPAR()") for all others.
+)
+enditem()
 )
 enditem()
 
diff --git a/Functions/MIME/pick-web-browser b/Functions/MIME/pick-web-browser
index ce35a0a79..fe42c0bf5 100644
--- a/Functions/MIME/pick-web-browser
+++ b/Functions/MIME/pick-web-browser
@@ -20,24 +20,23 @@
 # browser instead.
 
 emulate -L zsh
-setopt extendedglob cbases nonomatch
+setopt extendedglob cbases nonomatch warncreateglobal
 
 zmodload -i zsh/zutil
 
 local -a xbrowsers ttybrowsers
 
 # X Windows browsers which might be running and can accept
-# a remote URL.  You can change the order of preference.
-# If none is already running, starts the first in the array.
+# a remote URL.
 zstyle -a :mime: x-browsers xbrowsers ||
   xbrowsers=(firefox mozilla netscape opera konqueror)
-# Preferred command line browser.  Used if there is on $DISPLAY set.
+# Preferred command line browsers.
 zstyle -a :mime: tty-browsers ttybrowsers ||
-  ttybrowsers=(links lynx)
+  ttybrowsers=(elinks links lynx)
 # Characters in addition to alphanumerics which can appear literally
 # in a URL.  `-' should be the first if it appears, so append others
 # to the end.
-litc="-_./"
+local litc="-_./"
 
 local -a windows remoteargs match mbegin mend
 local url browser command
@@ -63,57 +62,76 @@ if [[ -f $url ]]; then
   fi
 fi
 
+local bstyle
+local -a bstyles
+zstyle -a :mime: browser-styles bstyles || bstyles=(running x tty)
 
-if [[ -n $DISPLAY ]]; then
-  # X Windows running
+for bstyle in $bstyles; do
+  case $bstyle in
+    (running)
+    [[ -z $DISPLAY ]] && continue
+    # X Windows running
 
-  # Get the name of all windows running; use the internal name, not
-  # the friendly name, which is less useful.
-  #
-  # The nasty but portable version.
-  # The nice but non-portable version uses Perl, even though perl
-  # is more portable.
-#    windows=(${(f)"$(xwininfo -root -all | 
-#	sed -ne 's/.*".*": ("\(.*\)" ".*").*/\1/p' |sort | uniq)"})
+    # Get the name of all windows running; use the internal name, not
+    # the friendly name, which is less useful.
+    #
+    # The nasty but portable version.
+    # The nice but non-portable version uses Perl, even though perl
+    # is more portable.
+    #    windows=(${(f)"$(xwininfo -root -all | 
+    #	sed -ne 's/.*".*": ("\(.*\)" ".*").*/\1/p' |sort | uniq)"})
 
-  windows=(${(f)"$(xwininfo -root -all | 
+    windows=(${(f)"$(xwininfo -root -all | 
          perl -ne '/.*"(.*)": \("(.*)" "(.*)"\).*/ and $w{$2} = 1;
                    END { print join("\n", keys %w), "\n" }')"})
 
-  # Is any browser we've heard of running?
-  for browser in $xbrowsers; do
-    # Some browser executables call themselves <browser>-bin
-    if [[ $windows[(I)(#i)$browser(|[.-]bin)] -ne 0 ]]; then
-      if zstyle -s ":mime:browser:running:${browser}:" command command; then
-	# The (q)'s here and below are pure paranoia:  no browser
-	# name is going to include metacharacters, and we already
-	# converted difficult characters in the URL to hex.
-	zformat -f command $command b:${(q)browser} u:${(q)url}
-	eval $command
-      else
-	if [[ $browser = konqueror ]]; then
-	  # kfmclient is less hairy and better supported than direct
-	  # use of dcop.  Run kfmclient --commands
-	  # for more information.  Note that as konqueror is a fully
-	  # featured file manager, this will actually do complete
-	  # MIME handling, not just web pages.
-	  kfmclient openURL $url ||
+    # Is any browser we've heard of running?
+    for browser in $xbrowsers; do
+      # Some browser executables call themselves <browser>-bin
+      if [[ $windows[(I)(#i)$browser(|[.-]bin)] -ne 0 ]]; then
+	if zstyle -s ":mime:browser:running:${browser}:" command command; then
+	  # The (q)'s here and below are pure paranoia:  no browser
+	  # name is going to include metacharacters, and we already
+	  # converted difficult characters in the URL to hex.
+	  zformat -f command $command b:${(q)browser} u:${(q)url}
+	  eval $command
+	else
+	  case $browser in
+	    (konqueror)
+	    # kfmclient is less hairy and better supported than direct
+	    # use of dcop.  Run kfmclient --commands
+	    # for more information.  Note that as konqueror is a fully
+	    # featured file manager, this will actually do complete
+	    # MIME handling, not just web pages.
+	    kfmclient openURL $url ||
 	    dcop $(dcop|grep konqueror) default openBrowserWindow $url
-        elif [[ $browser = firefox ]]; then
-	  # open in new tab
-	  $browser -new-tab $url
-        else
-	  # Mozilla bells and whistles are described at:
-	  # http://www.mozilla.org/unix/remote.html
-	  $browser -remote "openURL($url)"
-        fi
+	    ;;
+
+	    (firefox)
+	    # open in new tab
+	    $browser -new-tab $url
+	    ;;
+
+	    (opera)
+	    $browser -newpage $url
+	    ;;
+
+	    (*)
+	    # Mozilla bells and whistles are described at:
+	    # http://www.mozilla.org/unix/remote.html
+	    $browser -remote "openURL($url)"
+	    ;;
+	  esac
+	fi
+	return
       fi
-      return
-    fi
-  done
+    done
+    ;;
 
-  # Start our preferred X Windows browser in the background.
-  for browser in $xbrowsers; do
+    (x)
+    [[ -z $DISPLAY ]] && continue
+    # Start our preferred X Windows browser in the background.
+    for browser in $xbrowsers; do
       if eval "[[ =$browser != \\=$browser ]]"; then
 	if zstyle -s ":mime:browser:new:${browser}:" command command; then
 	  zformat -f command $command b:${(q)browser} u:${(q)url}
@@ -122,20 +140,27 @@ if [[ -n $DISPLAY ]]; then
 	  # The following is to make the job text more readable.
 	  eval ${(q)browser} ${(q)url} "&"
 	fi
-	break
+	return
       fi
-  done
-else
-  # Start up dumb terminal browser.
-  for browser in $ttybrowsers; do
-    if eval "[[ =$browser != \\=$browser ]]"; then
-      if zstyle -s ":mime:browser:new:${browser}" command command; then
-	zformat -f command $command b:${(q)browser} u:${(q)url}
-	eval $command
-      else
-	$browser $url
+    done
+    ;;
+
+    (tty)
+    # Start up dumb terminal browser.
+    for browser in $ttybrowsers; do
+      if eval "[[ =$browser != \\=$browser ]]"; then
+	if zstyle -s ":mime:browser:new:${browser}" command command; then
+	  zformat -f command $command b:${(q)browser} u:${(q)url}
+	  eval $command
+	else
+	  $browser $url
+	fi
+	return
       fi
-      break
-    fi
-  done
-fi
+    done
+    ;;
+  esac
+done
+
+# No eligible browser.
+return 255