13208
|
1 ;;; browse-url.el --- ask a WWW browser to load a URL
|
|
2 ;; Copyright 1995 Free Software Foundation, Inc.
|
|
3
|
|
4 ;; Author: Denis Howe <dbh@doc.ic.ac.uk>
|
|
5 ;; Maintainer: Denis Howe <dbh@doc.ic.ac.uk>
|
|
6 ;; Created: 03 Apr 1995
|
|
7 ;; Keywords: hypertext
|
|
8 ;; X-Home page: http://wombat.doc.ic.ac.uk/
|
|
9
|
|
10 ;; This file is part of GNU Emacs.
|
|
11
|
|
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
|
|
13 ;; it under the terms of the GNU General Public License as published
|
|
14 ;; by the Free Software Foundation; either version 2, or (at your
|
|
15 ;; option) any later version.
|
|
16
|
|
17 ;; GNU Emacs is distributed in the hope that it will be useful, but
|
|
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
20 ;; General Public License for more details.
|
|
21
|
|
22 ;; You should have received a copy of the GNU General Public License
|
|
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
|
|
24 ;; Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
25
|
|
26 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
27 ;;; Commentary:
|
|
28
|
|
29 ;; The latest version of this package should be available from
|
|
30 ;; <URL:http://wombat.doc.ic.ac.uk/emacs/browse-url.el>.
|
|
31
|
|
32 ;; This package provides functions which read a URL (Uniform Resource
|
|
33 ;; Locator) from the minibuffer, defaulting to the URL around point,
|
|
34 ;; and ask a World-Wide Web browser to load it. It can also load the
|
|
35 ;; URL associated with the current buffer. Different browsers use
|
|
36 ;; different methods of remote control so there is one function for
|
|
37 ;; each supported browser. If the chosen browser is not running, it
|
|
38 ;; is started. Currently there is support for:
|
|
39
|
|
40 ;; Function Browser Earliest version
|
|
41 ;; browse-url-netscape Netscape 1.1b1
|
|
42 ;; browse-url-mosaic XMosaic <= 2.4
|
|
43 ;; browse-url-cci XMosaic 2.5
|
|
44 ;; browse-url-w3 w3 0
|
|
45 ;; browse-url-iximosaic IXI Mosaic ?
|
|
46
|
|
47 ;; Note that versions of Netscape before 1.1b1 did not have remote
|
|
48 ;; control. <URL:http://home.netscape.com/newsref/std/x-remote.html>
|
|
49 ;; and <URL:http://home.netscape.com/info/APIs/>.
|
|
50
|
|
51 ;; Netscape can cache Web pages so it may be necessary to tell it to
|
|
52 ;; reload the current page if it has changed (eg. if you have edited
|
|
53 ;; it). There is currently no perfect automatic solution to this.
|
|
54
|
|
55 ;; Netscape allows you to specify the id of the window you want to
|
|
56 ;; control but which window DO you want to control and how do you
|
|
57 ;; discover its id?
|
|
58
|
|
59 ;; If using XMosaic before version 2.5, check the definition of
|
|
60 ;; browse-url-usr1-signal below.
|
|
61 ;; <URL:http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/remote-control.html>
|
|
62
|
|
63 ;; XMosaic version 2.5 introduced Common Client Interface allowing you
|
|
64 ;; to control mosaic through Unix sockets.
|
|
65 ;; <URL:http://www.ncsa.uiuc.edu/SDG/Software/XMosaic/CCI/cci-spec.html>
|
|
66
|
|
67 ;; William M. Perry's excellent "w3" WWW browser for
|
|
68 ;; Emacs <URL:ftp://cs.indiana.edu/pub/elisp/w3/>
|
|
69 ;; has a function w3-follow-url-at-point, but that
|
|
70 ;; doesn't let you edit the URL like browse-url.
|
|
71
|
|
72 ;; I recommend Nelson Minar <nelson@santafe.edu>'s excellent
|
|
73 ;; html-helper-mode.el for editing HTML and thank Nelson for
|
|
74 ;; his many useful comments on this code.
|
|
75 ;; <URL:http://www.santafe.edu/~nelson/hhm-beta/>
|
|
76
|
|
77 ;; This package generalises function html-previewer-process in Marc
|
|
78 ;; Andreessen <marca@ncsa.uiuc.edu>'s html-mode (LCD
|
|
79 ;; modes/html-mode.el.Z) and provides better versions of the URL
|
|
80 ;; functions in Michelangelo Grigni <mic@cs.ucsd.edu>'s ffap.el
|
|
81 ;; (find-file-at-point) <URL:ftp://cs.ucsd.edu:/pub/mic/>. The huge
|
|
82 ;; hyperbole package also contains similar functions.
|
|
83
|
|
84 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
85 ;; Help!
|
|
86
|
|
87 ;; Can you write and test some code for the Macintrash and Windoze
|
|
88 ;; Netscape remote control APIs? (See the URL above).
|
|
89
|
|
90 ;; Do any other browsers have remote control?
|
|
91
|
|
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
93 ;; Installation
|
|
94
|
|
95 ;; Put the following in your ~/.emacs file:
|
|
96 ;;
|
|
97 ;; (autoload 'browse-url-at-point "browse-url"
|
|
98 ;; "Ask a WWW browser to load the URL at or before point." t)
|
|
99 ;; (autoload 'browse-url-at-mouse "browse-url"
|
|
100 ;; "Ask a WWW browser to load a URL clicked with the mouse." t)
|
|
101 ;; (autoload 'browse-url-of-buffer "browse-url"
|
|
102 ;; "Ask a WWW browser to display BUFFER." t)
|
|
103 ;; (autoload 'browse-url-of-file "browse-url"
|
|
104 ;; "Ask a WWW browser to display FILE." t)
|
|
105 ;; (autoload 'browse-url-of-dired-file "browse-url"
|
|
106 ;; "In Dired, ask a WWW browser to display the file named on this line."
|
|
107 t)
|
|
108
|
|
109 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
110 ;; Usage
|
|
111
|
|
112 ;; To display the URL at or before point:
|
|
113 ;; M-x browse-url-at-point RET
|
|
114
|
|
115 ;; To display a URL by shift-clicking on it, put this in your ~/.emacs
|
|
116 ;; file:
|
|
117 ;; (global-set-key [S-mouse-1] 'browse-url-at-mouse)
|
|
118
|
|
119 ;; To display the current buffer in a web browser:
|
|
120 ;; M-x browse-url-of-buffer RET
|
|
121
|
|
122 ;; In Dired, to display the file named on the current line:
|
|
123 ;; M-x browse-url-of-dired-file RET
|
|
124
|
|
125 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
126 ;; Customisation (~/.emacs)
|
|
127
|
|
128 ;; To see what variables are available for customization, type `M-x
|
|
129 ;; set-variable browse-url TAB'.
|
|
130
|
|
131 ;; To bind the browse-url commands to keys with the `C-c u' prefix:
|
|
132 ;; (global-set-key "\C-cu." 'browse-url-at-point)
|
|
133 ;; (global-set-key "\C-cub" 'browse-url-of-buffer)
|
|
134 ;; (global-set-key "\C-cuf" 'browse-url-of-file)
|
|
135 ;; (add-hook 'dired-mode-hook
|
|
136 ;; (function (lambda ()
|
|
137 ;; (local-set-key "\C-cuf"
|
|
138 'browse-url-of-dired-file))))
|
|
139 ;; (if (boundp 'browse-url-browser-function)
|
|
140 ;; (global-set-key "\C-cuu" browse-url-browser-function)
|
|
141 ;; (eval-after-load
|
|
142 ;; "browse-url"
|
|
143 ;; '(global-set-key "\C-cuu" browse-url-browser-function)))
|
|
144
|
|
145 ;; To use the Emacs w3 browser when not running under X11:
|
|
146 ;; (if (not (eq window-system 'x))
|
|
147 ;; (setq browse-url-browser-function 'browse-url-w3))
|
|
148
|
|
149 ;; To always save modified buffers before displaying the file in a browser:
|
|
150 ;; (setq browse-url-save-file t)
|
|
151
|
|
152 ;; To get round the Netscape caching problem, you could try either of
|
|
153 ;; the following (but not both). EITHER write-file in
|
|
154 ;; html-helper-mode makes Netscape reload document:
|
|
155 ;;
|
|
156 ;; (autoload 'browse-url-netscape-reload "browse-url"
|
|
157 ;; "Ask a WWW browser to redisplay the current file." t)
|
|
158 ;; (add-hook 'html-helper-mode-hook
|
|
159 ;; (function (lambda ()
|
|
160 ;; (add-hook 'local-write-file-hooks
|
|
161 ;; (function (lambda ()
|
|
162 ;; (let ((local-write-file-hooks))
|
|
163 ;; (save-buffer))
|
|
164 ;; (browse-url-netscape-reload)
|
|
165 ;; t)) ; => file written
|
|
166 by hook
|
|
167 ;; t)))) ; append to
|
|
168 l-w-f-hooks
|
|
169 ;;
|
|
170 ;; [Does this work for html-mode too?]
|
|
171 ;;
|
|
172 ;; OR browse-url-of-file ask Netscape to load and then reload the
|
|
173 ;; file:
|
|
174 ;;
|
|
175 ;; (add-hook 'browse-url-of-file-hook 'browse-url-netscape-reload)
|
|
176
|
|
177 ;; You may also want to customise browse-url-netscape-arguments, eg.
|
|
178 ;;
|
|
179 ;; (setq browse-url-netscape-arguments '("-install"))
|
|
180 ;;
|
|
181 ;; or similarly for the other browsers.
|
|
182
|
|
183 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
184 ;;; Change Log:
|
|
185
|
|
186 ;; 0.00 03 Apr 1995 Denis Howe <dbh@doc.ic.ac.uk>
|
|
187 ;; Created.
|
|
188
|
|
189 ;; 0.01 04 Apr 1995
|
|
190 ;; All names start with "browse-url-". Added provide.
|
|
191
|
|
192 ;; 0.02 05 Apr 1995
|
|
193 ;; Save file at start of browse-url-of-file.
|
|
194 ;; Use start-process instead of start-process-shell-command.
|
|
195
|
|
196 ;; 0.03 06 Apr 1995
|
|
197 ;; Add browse-url-netscape-reload, browse-url-netscape-command.
|
|
198 ;; browse-url-of-file save file option.
|
|
199
|
|
200 ;; 0.04 08 Apr 1995
|
|
201 ;; b-u-file-url separate function. Change b-u-filename-alist
|
|
202 ;; default.
|
|
203
|
|
204 ;; 0.05 09 Apr 1995
|
|
205 ;; Added b-u-of-file-hook.
|
|
206
|
|
207 ;; 0.06 11 Apr 1995
|
|
208 ;; Improved .emacs suggestions and documentation.
|
|
209
|
|
210 ;; 0.07 13 Apr 1995
|
|
211 ;; Added browse-url-interactive-arg optional prompt.
|
|
212
|
|
213 ;; 0.08 18 Apr 1995
|
|
214 ;; Exclude final "." from browse-url-regexp.
|
|
215
|
|
216 ;; 0.09 21 Apr 1995
|
|
217 ;; Added mouse-set-point to browse-url-interactive-arg.
|
|
218
|
|
219 ;; 0.10 24 Apr 1995
|
|
220 ;; Added Mosaic signal sending variations.
|
|
221 ;; Thanks Brian K Servis <servis@ecn.purdue.edu>.
|
|
222 ;; Don't use xprop for Netscape.
|
|
223
|
|
224 ;; 0.11 25 Apr 1995
|
|
225 ;; Fix reading of ~/.mosaicpid. Thanks Dag.H.Wanvik@kvatro.no.
|
|
226
|
|
227 ;; 0.12 27 Apr 1995
|
|
228 ;; Interactive prefix arg => URL *after* point.
|
|
229 ;; Thanks Michelangelo Grigni <mic@cs.ucsd.edu>.
|
|
230 ;; Added IXI Mosaic support.
|
|
231 ;; Thanks David Karr <dkarr@nmo.gtegsc.com>.
|
|
232
|
|
233 ;; 0.13 28 Apr 1995
|
|
234 ;; Exclude final [,;] from browse-url-regexp.
|
|
235
|
|
236 ;; 0.14 02 May 1995
|
|
237 ;; Provide browser argument variables.
|
|
238
|
|
239 ;; 0.15 07 May 1995
|
|
240 ;; More Netscape options. Thanks Peter Arius
|
|
241 ;; <arius@immd2.informatik.uni-erlangen.de>.
|
|
242
|
|
243 ;; 0.16 17 May 1995
|
|
244 ;; Added browse-url-at-mouse.
|
|
245 ;; Thanks Wayne Mesard <wmesard@sgi.com>
|
|
246
|
|
247 ;; 0.17 27 Jun 1995
|
|
248 ;; Renamed browse-url-at-point to browse-url-url-at-point.
|
|
249 ;; Added browse-url-at-point.
|
|
250 ;; Thanks Jonathan Cano <cano@patch.tandem.com>.
|
|
251
|
|
252 ;; 0.18 16 Aug 1995
|
|
253 ;; Fixed call to browse-url-url-at-point in browse-url-at-point.
|
|
254 ;; Thanks Eric Ding <ericding@San-Jose.ate.slb.com>.
|
|
255
|
|
256 ;; 0.19 24 Aug 1995
|
|
257 ;; Improved documentation.
|
|
258 ;; Thanks Kevin Rodgers <kevin.rodgers@ihs.com>.
|
|
259
|
|
260 ;; 0.20 31 Aug 1995
|
|
261 ;; browse-url-of-buffer to handle file-less buffers.
|
|
262 ;; browse-url-of-dired-file browses current file in dired.
|
|
263 ;; Thanks Kevin Rodgers <kevin.rodgers@ihs.com>.
|
|
264
|
|
265 ;; 0.21 09 Sep 1995
|
|
266 ;; XMosaic CCI functions.
|
|
267 ;; Thanks Marc Furrer <Marc.Furrer@di.epfl.ch>.
|
|
268
|
|
269 ;; 0.22 13 Sep 1995
|
|
270 ;; Fixed new-window documentation and added to browse-url-cci.
|
|
271 ;; Thanks Dilip Sequeira <djs@dcs.ed.ac.uk>.
|
|
272
|
|
273 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
274 ;;; Code:
|
|
275
|
|
276 (defvar browse-url-regexp
|
|
277 "\\(https?://\\|ftp://\\|gopher://\\|telnet://\\|wais://\\|file:/\\|s?news:\\|mai
|
|
278 lto:\\)[^]\t\n \"'()<>[^`{}]*[^]\t\n \"'()<>[^`{}.,;]+"
|
|
279 "A regular expression probably matching a URL.")
|
|
280
|
|
281 (defvar browse-url-browser-function
|
|
282 'browse-url-netscape
|
|
283 "*Function to display the current buffer in a WWW browser.
|
|
284 Used by the `browse-url-at-point', `browse-url-at-mouse', and
|
|
285 `browse-url-of-file' commands.")
|
|
286
|
|
287 (defvar browse-url-netscape-arguments nil
|
|
288 "*A list of strings to pass to Netscape as arguments.")
|
|
289
|
|
290 (defvar browse-url-new-window-p nil
|
|
291 "*If non-nil, always open a new browser window.
|
|
292 Passing an interactive argument to \\[browse-url-netscape] or
|
|
293 \\[browse-url-cci] reverses the effect of this variable. Requires
|
|
294 Netscape version 1.1N or later or XMosaic version 2.5 or later.")
|
|
295
|
|
296 (defvar browse-url-mosaic-arguments nil
|
|
297 "*A list of strings to pass to Mosaic as arguments.")
|
|
298
|
|
299 (defvar browse-url-filename-alist
|
|
300 '(("^/+" . "file:/"))
|
|
301 "An alist of (REGEXP . STRING) pairs.
|
|
302 Any substring of a filename matching one of the REGEXPs is replaced by
|
|
303 the corresponding STRING. All pairs are applied in the order given.
|
|
304 Used by the `browse-url-of-file' command.")
|
|
305
|
|
306 (defvar browse-url-save-file nil
|
|
307 "If non-nil, save the buffer before displaying its file.
|
|
308 Used by the `browse-url-of-file' command.")
|
|
309
|
|
310 (defvar browse-url-of-file-hook nil
|
|
311 "A hook to be run with run-hook after `browse-url-of-file' has asked
|
|
312 a browser to load a file.
|
|
313
|
|
314 Set this to `browse-url-netscape-reload' to force Netscape to load the
|
|
315 file rather than displaying a cached copy.")
|
|
316
|
|
317 (defvar browse-url-usr1-signal
|
|
318 (if (and (boundp 'emacs-major-version)
|
|
319 (or (> emacs-major-version 19) (>= emacs-minor-version 29)))
|
|
320 'sigusr1
|
|
321 30) ; Check /usr/include/signal.h.
|
|
322 "The argument to `signal-process' for sending SIGUSR1 to XMosaic.
|
|
323 Emacs 19.29 accepts 'sigusr1, earlier versions require an integer
|
|
324 which is 30 on SunOS and 16 on HP-UX and Solaris.")
|
|
325
|
|
326 (defvar browse-url-CCI-port 3003
|
|
327 "Port to access XMosaic via CCI.
|
|
328 This can be any number between 1024 and 65535 but must correspond to
|
|
329 the value set in the browser.")
|
|
330
|
|
331 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
332 ;; URL input
|
|
333
|
|
334 ;; thingatpt.el doesn't work for complex regexps.
|
|
335
|
|
336 (defun browse-url-url-at-point ()
|
|
337 "Return the URL around or before point.
|
|
338 Then search backwards for the start of a URL. If no URL found, return
|
|
339 the empty string."
|
|
340 (if (or (looking-at browse-url-regexp) ; Already at start
|
|
341 (let ((eol (save-excursion (end-of-line) (point))))
|
|
342 ;; Search forwards for the next URL or end of line in case
|
|
343 ;; we're in the middle of one.
|
|
344 (and (re-search-forward browse-url-regexp eol 'lim)
|
|
345 (goto-char (match-beginning 0)))
|
|
346 ;; Now back to where we started or earlier.
|
|
347 (re-search-backward browse-url-regexp nil t)))
|
|
348 (buffer-substring (match-beginning 0) (match-end 0))
|
|
349 "")) ; No match
|
|
350
|
|
351 ;; Todo: restrict to around or immediately before point. Expand bare
|
|
352 ;; hostname to URL.
|
|
353
|
|
354 (defun browse-url-interactive-arg (&optional prompt)
|
|
355 "Read a URL from the minibuffer, optionally prompting with PROMPT.
|
|
356 Default to the URL at or before point. If bound to a mouse button,
|
|
357 set point to the position clicked. Return the result as a list for
|
|
358 use in `interactive'."
|
|
359 (let ((event (elt (this-command-keys) 0)))
|
|
360 (and (listp event) (mouse-set-point event)))
|
|
361 (list (read-string (or prompt "URL: ") (browse-url-url-at-point))))
|
|
362
|
|
363 (defun browse-url-at-point ()
|
|
364 "Ask a WWW browser to load the URL at or before point.
|
|
365 The URL is loaded according to the value of `browse-url-browser-function'."
|
|
366 (interactive)
|
|
367 (funcall browse-url-browser-function (browse-url-url-at-point)))
|
|
368
|
|
369 (defun browse-url-at-mouse (event)
|
|
370 "Ask a WWW browser to load a URL clicked with the mouse.
|
|
371 The URL is the one around or before the position of the mouse click
|
|
372 but point is not changed. The URL is loaded according to the value of
|
|
373 `browse-url-browser-function'."
|
|
374 (interactive "e")
|
|
375 (save-excursion
|
|
376 (let ((posn (event-start event)))
|
|
377 (set-buffer (window-buffer (posn-window posn)))
|
|
378 (goto-char (posn-point posn))
|
|
379 (let ((url (browse-url-url-at-point)))
|
|
380 (if (string-equal url "")
|
|
381 (error "No URL found"))
|
|
382 (funcall browse-url-browser-function url)))))
|
|
383
|
|
384 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
385 ;; Browse current buffer
|
|
386
|
|
387 (defun browse-url-of-file (&optional file)
|
|
388 "Ask a WWW browser to display FILE.
|
|
389 Display the current buffer's file if FILE is nil or if called
|
|
390 interactively. Turn the filename into a URL by performing
|
|
391 replacements given in variable `browse-url-filename-alist'. Pass the
|
|
392 URL to a browser using variable `browse-url-browser-function' then run
|
|
393 `browse-url-of-file-hook'."
|
|
394 (interactive)
|
|
395 (setq file
|
|
396 (or file
|
|
397 (buffer-file-name)
|
|
398 (error "Current buffer has no file")))
|
|
399 (let ((buf (get-file-buffer file)))
|
|
400 (if buf
|
|
401 (save-excursion
|
|
402 (set-buffer buf)
|
|
403 (cond ((not (buffer-modified-p)))
|
|
404 (browse-url-save-file (save-buffer))
|
|
405 (t (message "%s modified since last save" file))))))
|
|
406 (funcall browse-url-browser-function (browse-url-file-url file))
|
|
407 (run-hooks 'browse-url-of-file-hook))
|
|
408
|
|
409 (defun browse-url-file-url (file)
|
|
410 "Return the URL corresponding to FILE.
|
|
411 Uses variable `browse-url-filename-alist' to map filenames to URLs."
|
|
412 (let ((maps browse-url-filename-alist))
|
|
413 (while maps
|
|
414 (let* ((map (car maps))
|
|
415 (from-re (car map))
|
|
416 (to-string (cdr map)))
|
|
417 (setq maps (cdr maps))
|
|
418 (if (string-match from-re file)
|
|
419 (setq file (concat (substring file 0 (match-beginning 0))
|
|
420 to-string
|
|
421 (substring file (match-end 0))))))))
|
|
422 file)
|
|
423
|
|
424 (defvar browse-url-temp-file-name nil)
|
|
425 (make-variable-buffer-local 'browse-url-temp-file-name)
|
|
426
|
|
427 (defvar browse-url-temp-file-list '())
|
|
428
|
|
429 (defun browse-url-of-buffer (&optional buffer)
|
|
430 "Ask a WWW browser to display BUFFER.
|
|
431 Display the current buffer if BUFFER is nil."
|
|
432 (interactive)
|
|
433 (save-excursion
|
|
434 (set-buffer (or buffer (current-buffer)))
|
|
435 (let ((file-name
|
|
436 (or buffer-file-name
|
|
437 (and (boundp 'dired-directory) dired-directory))))
|
|
438 (if (null file-name)
|
|
439 (progn
|
|
440 (if (null browse-url-temp-file-name)
|
|
441 (progn
|
|
442 (setq browse-url-temp-file-name
|
|
443 (make-temp-name
|
|
444 (expand-file-name (buffer-name)
|
|
445 (or (getenv "TMPDIR") "/tmp"))))
|
|
446 (setq browse-url-temp-file-list
|
|
447 (cons browse-url-temp-file-name
|
|
448 browse-url-temp-file-list))))
|
|
449 (write-region (point-min) (point-max) browse-url-temp-file-name
|
|
450 nil 'no-message)))
|
|
451 (browse-url-of-file (or file-name browse-url-temp-file-name)))))
|
|
452
|
|
453 (defun browse-url-delete-temp-file (&optional temp-file-name)
|
|
454 ;; Delete browse-url-temp-file-name from the file system and from
|
|
455 ;; browse-url-temp-file-list. If optional arg TEMP-FILE-NAME is
|
|
456 ;; non-nil, delete it instead, but only from the file system --
|
|
457 ;; browse-url-temp-file-list is not affected.
|
|
458 (let ((file-name (or temp-file-name browse-url-temp-file-name)))
|
|
459 (if (and file-name (file-exists-p file-name))
|
|
460 (progn
|
|
461 (delete-file file-name)
|
|
462 (if (null temp-file-name)
|
|
463 (setq browse-url-temp-file-list
|
|
464 (delete browse-url-temp-file-name
|
|
465 browse-url-temp-file-list)))))))
|
|
466
|
|
467 (defun browse-url-delete-temp-file-list ()
|
|
468 ;; Delete all elements of browse-url-temp-file-list.
|
|
469 (while browse-url-temp-file-list
|
|
470 (browse-url-delete-temp-file (car browse-url-temp-file-list))
|
|
471 (setq browse-url-temp-file-list
|
|
472 (cdr browse-url-temp-file-list))))
|
|
473
|
|
474 (add-hook 'kill-buffer-hook 'browse-url-delete-temp-file)
|
|
475 (add-hook 'kill-emacs-hook 'browse-url-delete-temp-file-list)
|
|
476
|
|
477 (defun browse-url-of-dired-file ()
|
|
478 "In Dired, ask a WWW browser to display the file named on this line."
|
|
479 (interactive)
|
|
480 (browse-url-of-file (dired-get-filename)))
|
|
481
|
|
482 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
483 ;; Browser-specific functions
|
|
484
|
|
485 (defun browse-url-netscape (url &optional new-window)
|
|
486 "Ask the Netscape WWW browser to load URL.
|
|
487
|
|
488 Default to the URL around or before point. The strings in variable
|
|
489 `browse-url-netscape-arguments' are also passed to Netscape.
|
|
490
|
|
491 When called interactively, if variable `browse-url-new-window-p' is
|
|
492 non-nil, load the document in a new Netscape window, otherwise use a
|
|
493 random existing one. A non-nil interactive prefix argument reverses
|
|
494 the effect of browse-url-new-window-p.
|
|
495
|
|
496 When called non-interactively, optional second argument NEW-WINDOW is
|
|
497 used instead of browse-url-new-window-p."
|
|
498
|
|
499 (interactive (append (browse-url-interactive-arg "Netscape URL: ")
|
|
500 (list (not (eq (null browse-url-new-window-p)
|
|
501 (null current-prefix-arg))))))
|
|
502 (or (zerop
|
|
503 (apply 'call-process "netscape" nil nil nil
|
|
504 (append browse-url-netscape-arguments
|
|
505 (if new-window '("-noraise"))
|
|
506 (list "-remote"
|
|
507 (concat "openURL(" url
|
|
508 (if new-window ",new-window")
|
|
509 ")")))))
|
|
510 (progn ; Netscape not running - start it
|
|
511 (message "Starting Netscape...")
|
|
512 (apply 'start-process "netscape" nil "netscape"
|
|
513 (append browse-url-netscape-arguments (list url))))))
|
|
514
|
|
515 (defun browse-url-netscape-reload ()
|
|
516 "Ask Netscape to reload its current document."
|
|
517 (interactive)
|
|
518 (browse-url-netscape-command "reload"))
|
|
519
|
|
520 (defun browse-url-netscape-command (command)
|
|
521 "Send a remote control command to Netscape."
|
|
522 (apply 'start-process "netscape" nil "netscape"
|
|
523 (append browse-url-netscape-arguments
|
|
524 (list "-remote" command))))
|
|
525
|
|
526 (defun browse-url-mosaic (url)
|
|
527 "Ask the XMosaic WWW browser to load URL.
|
|
528 Default to the URL around or before point."
|
|
529 (interactive (browse-url-interactive-arg "Mosaic URL: "))
|
|
530 (let ((pidfile (expand-file-name "~/.mosaicpid"))
|
|
531 pid pidbuf)
|
|
532 (if (file-readable-p pidfile)
|
|
533 (save-excursion
|
|
534 (find-file pidfile)
|
|
535 (goto-char (point-min))
|
|
536 (setq pid (read (current-buffer)))
|
|
537 (kill-buffer nil)))
|
|
538 (if (and pid (zerop (signal-process pid 0))) ; Mosaic running
|
|
539 (save-excursion
|
|
540 (find-file (format "/tmp/Mosaic.%d" pid))
|
|
541 (erase-buffer)
|
|
542 (insert "goto\n" url "\n")
|
|
543 (save-buffer)
|
|
544 (kill-buffer nil)
|
|
545 ;; Send signal SIGUSR to Mosaic
|
|
546 (message "Signalling Mosaic...")
|
|
547 (signal-process pid browse-url-usr1-signal)
|
|
548 ;; Or you could try:
|
|
549 ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid))
|
|
550 )
|
|
551 ;; Mosaic not running - start it
|
|
552 (message "Starting Mosaic...")
|
|
553 (apply 'start-process "xmosaic" nil "xmosaic"
|
|
554 (append browse-url-mosaic-arguments (list url))))))
|
|
555
|
|
556 (defun browse-url-cci (url &optional new-window)
|
|
557 "Ask the XMosaic WWW browser to load URL.
|
|
558 Default to the URL around or before point.
|
|
559
|
|
560 This function only works for XMosaic version 2.5 or later. You must
|
|
561 select `CCI' from XMosaic's File menu, set the CCI Port Address to the
|
|
562 value of variable `browse-url-CCI-port', and enable `Accept requests'.
|
|
563
|
|
564 When called interactively, if variable `browse-url-new-window-p' is
|
|
565 non-nil, load the document in a new browser window, otherwise use a
|
|
566 random existing one. A non-nil interactive prefix argument reverses
|
|
567 the effect of browse-url-new-window-p.
|
|
568
|
|
569 When called non-interactively, optional second argument NEW-WINDOW is
|
|
570 used instead of browse-url-new-window-p."
|
|
571 (interactive (append (browse-url-interactive-arg "Mosaic URL: ")
|
|
572 (list (not (eq (null browse-url-new-window-p)
|
|
573 (null current-prefix-arg))))))
|
|
574 (open-network-stream "browse-url" " *browse-url*"
|
|
575 "localhost" browse-url-CCI-port)
|
|
576 ;; Todo: start browser if fails
|
|
577 (process-send-string "browse-url"
|
|
578 (concat "get url (" url ") output "
|
|
579 (if new-window "new" "current") "\r\n"))
|
|
580 (process-send-string "browse-url" "disconnect\r\n")
|
|
581 (delete-process "browse-url"))
|
|
582
|
|
583 (defun browse-url-iximosaic (url)
|
|
584 "Ask the IXIMosaic WWW browser to load URL.
|
|
585 Default to the URL around or before point."
|
|
586 (interactive (browse-url-interactive-arg "IXI Mosaic URL: "))
|
|
587 (start-process "tellw3b" nil "tellw3b"
|
|
588 "-service WWW_BROWSER ixi_showurl " url))
|
|
589
|
|
590 (defun browse-url-w3 (url)
|
|
591 "Ask the w3 WWW browser to load URL.
|
|
592 Default to the URL around or before point."
|
|
593 (interactive (browse-url-interactive-arg "W3 URL: "))
|
|
594 (w3-fetch url))
|
|
595
|
|
596 (provide 'browse-url)
|
|
597
|
|
598 ;;; browse-url.el ends here
|