diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | Doc/Zsh/contrib.yo | 84 | ||||
-rw-r--r-- | Functions/MIME/pick-web-browser | 151 |
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 |