1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-03 10:21:46 +02:00

23759: a few improvements to pick-web-browser

This commit is contained in:
Peter Stephenson 2007-08-14 17:21:05 +00:00
parent 83cbc075ac
commit 91d714752c
3 changed files with 150 additions and 86 deletions

View file

@ -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.

View file

@ -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.
It may be run as either a function or a shell script. The status
255 is returned if no browser could be started.
Alternatively, tt(pick-web-browser) can be run as a zsh script.
Various styles are available to customize the choice of browsers:
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
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()

View file

@ -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
fi
return
fi
done
;;
# Start our preferred X Windows browser in the background.
for browser in $xbrowsers; do
(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
done
;;
(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