--- browse-url.el 2007-10-19 18:56:52.000000000 -0400 +++ browse-url.original.el 2007-10-19 18:19:04.000000000 -0400 @@ -46,17 +46,16 @@ ;; browse-url-cci XMosaic 2.5 ;; browse-url-w3 w3 0 ;; browse-url-w3-gnudoit w3 remotely +;; browse-url-iximosaic IXI Mosaic ? ;; browse-url-lynx-* Lynx 0 +;; browse-url-grail Grail 0.3b1 +;; browse-url-mmm MMM ? ;; browse-url-generic arbitrary ;; browse-url-default-windows-browser MS-Windows browser ;; browse-url-default-macosx-browser Mac OS X browser ;; browse-url-gnome-moz GNOME interface to Mozilla ;; browse-url-kde KDE konqueror (kfm) -;; browse-url-elinks-* Elinks Don't know (tried with 0.12.GIT) -;; browse-url-links-emacs Links (tried with 2.1) -;; browse-url-links2-emacs Links2 -;; browse-url-netrik-emacs Netrik (tried with 1.15.3) -;; browse-url-w3m-emacs W3M +;; browse-url-elinks Elinks Don't know (tried with 0.12.GIT) ;; [A version of the Netscape browser is now free software ;; , albeit not GPLed, so it is @@ -81,6 +80,14 @@ ;; Emacs process is available from ;; . +;; Grail is the freely available WWW browser implemented in Python, a +;; cool object-oriented freely available interpreted language. Grail +;; 0.3b1 was the first version to have remote control as distributed. +;; For more information on Grail see +;; and for more information on +;; Python see . Grail support in +;; browse-url.el written by Barry Warsaw . + ;; Lynx is now distributed by the FSF. See also ;; . @@ -210,14 +217,12 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Variables -(eval-when-compile - (require 'cl) - (require 'dired) - (require 'executable) - (require 'term) - (require 'thingatpt) - (require 'url-handlers) - (require 'w3-auto nil t)) +(eval-when-compile (require 'cl) + (require 'thingatpt) + (require 'term) + (require 'dired) + (require 'executable) + (require 'w3-auto nil t)) (defgroup browse-url nil "Use a web browser to look at a URL." @@ -242,35 +247,38 @@ function is passed the URL and any other args of `browse-url'. The last regexp should probably be \".\" to specify a default browser." :type '(choice - (function-item :tag "Emacs W3" :value browse-url-w3) - (function-item :tag "W3 in another Emacs via `gnudoit'" - :value browse-url-w3-gnudoit) - (function-item :tag "Mozilla" :value browse-url-mozilla) - (function-item :tag "Firefox" :value browse-url-firefox) - (function-item :tag "Galeon" :value browse-url-galeon) - (function-item :tag "Epiphany" :value browse-url-epiphany) - (function-item :tag "Netscape" :value browse-url-netscape) - (function-item :tag "Mosaic" :value browse-url-mosaic) - (function-item :tag "Mosaic using CCI" :value browse-url-cci) - (function-item :tag "Lynx in an xterm window" - :value browse-url-lynx-xterm) - (function-item :tag "Lynx in an Emacs window" - :value browse-url-lynx-emacs) - (function-item :tag "KDE" :value browse-url-kde) - (function-item :tag "Elinks" :value browse-url-elinks) - (function-item :tag "Specified by `Browse Url Generic Program'" - :value browse-url-generic) - (function-item :tag "Default Windows browser" - :value browse-url-default-windows-browser) - (function-item :tag "Default Mac OS X browser" - :value browse-url-default-macosx-browser) - (function-item :tag "GNOME invoking Mozilla" - :value browse-url-gnome-moz) - (function-item :tag "Default browser" - :value browse-url-default-browser) - (function :tag "Your own function") - (alist :tag "Regexp/function association list" - :key-type regexp :value-type function)) + (function-item :tag "Emacs W3" :value browse-url-w3) + (function-item :tag "W3 in another Emacs via `gnudoit'" + :value browse-url-w3-gnudoit) + (function-item :tag "Mozilla" :value browse-url-mozilla) + (function-item :tag "Firefox" :value browse-url-firefox) + (function-item :tag "Galeon" :value browse-url-galeon) + (function-item :tag "Epiphany" :value browse-url-epiphany) + (function-item :tag "Netscape" :value browse-url-netscape) + (function-item :tag "Mosaic" :value browse-url-mosaic) + (function-item :tag "Mosaic using CCI" :value browse-url-cci) + (function-item :tag "IXI Mosaic" :value browse-url-iximosaic) + (function-item :tag "Lynx in an xterm window" + :value browse-url-lynx-xterm) + (function-item :tag "Lynx in an Emacs window" + :value browse-url-lynx-emacs) + (function-item :tag "Grail" :value browse-url-grail) + (function-item :tag "MMM" :value browse-url-mmm) + (function-item :tag "KDE" :value browse-url-kde) + (function-item :tag "Elinks" :value browse-url-elinks) + (function-item :tag "Specified by `Browse Url Generic Program'" + :value browse-url-generic) + (function-item :tag "Default Windows browser" + :value browse-url-default-windows-browser) + (function-item :tag "Default Mac OS X browser" + :value browse-url-default-macosx-browser) + (function-item :tag "GNOME invoking Mozilla" + :value browse-url-gnome-moz) + (function-item :tag "Default browser" + :value browse-url-default-browser) + (function :tag "Your own function") + (alist :tag "Regexp/function association list" + :key-type regexp :value-type function)) :version "21.1" :group 'browse-url) @@ -521,9 +529,9 @@ :type '(repeat (string :tag "Argument")) :group 'browse-url) -(defcustom browse-url-text-emacs-args (and (not window-system) +(defcustom browse-url-lynx-emacs-args (and (not window-system) '("-show_cursor")) - "A list of strings defining options for text browsers in an Emacs buffer. + "A list of strings defining options for Lynx in an Emacs buffer. The default is none in a window system, otherwise `-show_cursor' to indicate the position of the current link in the absence of @@ -568,10 +576,10 @@ :type 'number :group 'browse-url) -(defcustom browse-url-text-input-field 'avoid - "Action on selecting an existing text browser buffer at an input field. -What to do when sending a new URL to an existing test browser buffer in Emacs -if the text browser cursor is on an input field (in which case the `g' command +(defcustom browse-url-lynx-input-field 'avoid + "Action on selecting an existing Lynx buffer at an input field. +What to do when sending a new URL to an existing Lynx buffer in Emacs +if the Lynx cursor is on an input field (in which case the `g' command would be entered as data). Such fields are recognized by the underlines ____. Allowed values: nil: disregard it, 'warn: warn the user and don't emit the URL, 'avoid: try to avoid the field by moving @@ -582,13 +590,13 @@ :version "20.3" :group 'browse-url) -(defcustom browse-url-text-input-attempts 10 - "How many times to try to move down from a series of text browser input fields." +(defcustom browse-url-lynx-input-attempts 10 + "How many times to try to move down from a series of lynx input fields." :type 'integer :group 'browse-url) -(defcustom browse-url-text-input-delay 0.2 - "How many seconds to wait for a text browser between moves down from an input field." +(defcustom browse-url-lynx-input-delay 0.2 + "How many seconds to wait for lynx between moves down from an input field." :type 'number :group 'browse-url) @@ -615,13 +623,13 @@ "URL-encode the chars in TEXT that match CHARS. CHARS is a regexp-like character alternative (e.g., \"[,)$]\")." (let ((encoded-text (copy-sequence text)) - (s 0)) + (s 0)) (while (setq s (string-match chars encoded-text s)) (setq encoded-text - (replace-match (format "%%%x" - (string-to-char (match-string 0 encoded-text))) - t t encoded-text) - s (1+ s))) + (replace-match (format "%%%x" + (string-to-char (match-string 0 encoded-text))) + t t encoded-text) + s (1+ s))) encoded-text)) (defun browse-url-encode-url (url) @@ -643,6 +651,7 @@ ;; Having this as a separate function called by the browser-specific ;; functions allows them to be stand-alone commands, making it easier ;; to switch between browsers. + (defun browse-url-interactive-arg (prompt) "Read a URL from the minibuffer, prompting with PROMPT. If `transient-mark-mode' is non-nil and the mark is active, @@ -655,14 +664,14 @@ (let ((event (elt (this-command-keys) 0))) (and (listp event) (mouse-set-point event))) (list (read-string prompt (or (and transient-mark-mode mark-active - ;; rfc2396 Appendix E. - (replace-regexp-in-string - "[\t\r\f\n ]+" "" - (buffer-substring-no-properties - (region-beginning) (region-end)))) - (browse-url-url-at-point))) - (not (eq (null browse-url-new-window-flag) - (null current-prefix-arg))))) + ;; rfc2396 Appendix E. + (replace-regexp-in-string + "[\t\r\f\n ]+" "" + (buffer-substring-no-properties + (region-beginning) (region-end)))) + (browse-url-url-at-point))) + (not (eq (null browse-url-new-window-flag) + (null current-prefix-arg))))) ;; called-interactive-p needs to be called at a function's top-level, hence ;; this macro. We use that rather than interactive-p because @@ -688,10 +697,10 @@ (error "Current buffer has no file")) (let ((buf (get-file-buffer file))) (if buf - (with-current-buffer buf - (cond ((not (buffer-modified-p))) - (browse-url-save-file (save-buffer)) - (t (message "%s modified since last save" file)))))) + (with-current-buffer buf + (cond ((not (buffer-modified-p))) + (browse-url-save-file (save-buffer)) + (t (message "%s modified since last save" file)))))) (browse-url (browse-url-file-url file)) (run-hooks 'browse-url-of-file-hook)) @@ -699,8 +708,8 @@ "Return the URL corresponding to FILE. Use variable `browse-url-filename-alist' to map filenames to URLs." (let ((coding (and default-enable-multibyte-characters - (or file-name-coding-system - default-file-name-coding-system)))) + (or file-name-coding-system + default-file-name-coding-system)))) (if coding (setq file (encode-coding-string file coding)))) (setq file (browse-url-url-encode-chars file "[*\"()',=;?% ]")) (dolist (map browse-url-filename-alist) @@ -718,20 +727,20 @@ (save-excursion (and buffer (set-buffer buffer)) (let ((file-name - ;; Ignore real name if restricted - (and (= (- (point-max) (point-min)) (buffer-size)) - (or buffer-file-name - (and (boundp 'dired-directory) dired-directory))))) + ;; Ignore real name if restricted + (and (= (- (point-max) (point-min)) (buffer-size)) + (or buffer-file-name + (and (boundp 'dired-directory) dired-directory))))) (or file-name - (progn - (or browse-url-temp-file-name - (setq browse-url-temp-file-name - (convert-standard-filename - (make-temp-file - (expand-file-name "burl" browse-url-temp-dir) - nil ".html")))) - (setq file-name browse-url-temp-file-name) - (write-region (point-min) (point-max) file-name nil 'no-message))) + (progn + (or browse-url-temp-file-name + (setq browse-url-temp-file-name + (convert-standard-filename + (make-temp-file + (expand-file-name "burl" browse-url-temp-dir) + nil ".html")))) + (setq file-name browse-url-temp-file-name) + (write-region (point-min) (point-max) file-name nil 'no-message))) (browse-url-of-file file-name)))) (defun browse-url-delete-temp-file (&optional temp-file-name) @@ -739,7 +748,7 @@ ;; If optional arg TEMP-FILE-NAME is non-nil, delete it instead (let ((file-name (or temp-file-name browse-url-temp-file-name))) (if (and file-name (file-exists-p file-name)) - (delete-file file-name)))) + (delete-file file-name)))) (add-hook 'kill-buffer-hook 'browse-url-delete-temp-file) @@ -797,9 +806,9 @@ (interactive "P") (let ((url (browse-url-url-at-point))) (if url - (browse-url url (if arg - (not browse-url-new-window-flag) - browse-url-new-window-flag)) + (browse-url url (if arg + (not browse-url-new-window-flag) + browse-url-new-window-flag)) (error "No URL found")))) ;;;###autoload @@ -827,8 +836,8 @@ (interactive (browse-url-interactive-arg "URL: ")) (if (eq system-type 'ms-dos) (if dos-windows-version - (shell-command (concat "start " (shell-quote-argument url))) - (error "Browsing URLs is not supported on this system")) + (shell-command (concat "start " (shell-quote-argument url))) + (error "Browsing URLs is not supported on this system")) (w32-shell-execute "open" url))) (defun browse-url-default-macosx-browser (url &optional new-window) @@ -844,7 +853,7 @@ environment, otherwise just use the current environment." (let ((display (or browse-url-browser-display (browse-url-emacs-display)))) (if display - (cons (concat "DISPLAY=" display) process-environment) + (cons (concat "DISPLAY=" display) process-environment) process-environment))) (defun browse-url-emacs-display () @@ -871,8 +880,8 @@ used instead of `browse-url-new-window-flag'. The order attempted is gnome-moz-remote, Mozilla, Firefox, -Galeon, Konqueror, Netscape, Mosaic, Lynx in an -xterm, and then W3." +Galeon, Konqueror, Netscape, Mosaic, IXI Mosaic, Lynx in an +xterm, MMM, and then W3." (apply (cond ((executable-find browse-url-gnome-moz-program) 'browse-url-gnome-moz) @@ -882,7 +891,9 @@ ((executable-find browse-url-kde-program) 'browse-url-kde) ((executable-find browse-url-netscape-program) 'browse-url-netscape) ((executable-find browse-url-mosaic-program) 'browse-url-mosaic) + ((executable-find "tellw3b") 'browse-url-iximosaic) ((executable-find browse-url-xterm-program) 'browse-url-lynx-xterm) + ((executable-find "mmm") 'browse-url-mmm) ((locate-library "w3") 'browse-url-w3) (t (lambda (&ignore args) (error "No usable browser found")))) @@ -908,37 +919,37 @@ (interactive (browse-url-interactive-arg "URL: ")) (setq url (browse-url-encode-url url)) (let* ((process-environment (browse-url-process-environment)) - (process - (apply 'start-process - (concat "netscape " url) nil - browse-url-netscape-program - (append - browse-url-netscape-arguments - (if (eq window-system 'w32) - (list url) - (append - (if new-window '("-noraise")) - (list "-remote" - (concat "openURL(" url - (if (browse-url-maybe-new-window - new-window) - (if browse-url-netscape-new-window-is-tab - ",new-tab" - ",new-window")) - ")")))))))) + (process + (apply 'start-process + (concat "netscape " url) nil + browse-url-netscape-program + (append + browse-url-netscape-arguments + (if (eq window-system 'w32) + (list url) + (append + (if new-window '("-noraise")) + (list "-remote" + (concat "openURL(" url + (if (browse-url-maybe-new-window + new-window) + (if browse-url-netscape-new-window-is-tab + ",new-tab" + ",new-window")) + ")")))))))) (set-process-sentinel process - `(lambda (process change) - (browse-url-netscape-sentinel process ,url))))) + `(lambda (process change) + (browse-url-netscape-sentinel process ,url))))) (defun browse-url-netscape-sentinel (process url) "Handle a change to the process communicating with Netscape." (or (eq (process-exit-status process) 0) (let* ((process-environment (browse-url-process-environment))) - ;; Netscape not running - start it - (message "Starting %s..." browse-url-netscape-program) - (apply 'start-process (concat "netscape" url) nil - browse-url-netscape-program - (append browse-url-netscape-startup-arguments (list url)))))) + ;; Netscape not running - start it + (message "Starting %s..." browse-url-netscape-program) + (apply 'start-process (concat "netscape" url) nil + browse-url-netscape-program + (append browse-url-netscape-startup-arguments (list url)))))) (defun browse-url-netscape-reload () "Ask Netscape to reload its current document. @@ -947,8 +958,8 @@ ;; Backwards incompatibility reported by ;; . (browse-url-netscape-send (if (>= browse-url-netscape-version 4) - "xfeDoCommand(reload)" - "reload"))) + "xfeDoCommand(reload)" + "reload"))) (defun browse-url-netscape-send (command) "Send a remote control command to Netscape." @@ -979,33 +990,33 @@ (setq url (browse-url-encode-url url)) (let* ((process-environment (browse-url-process-environment)) (process - (apply 'start-process - (concat "mozilla " url) nil - browse-url-mozilla-program - (append - browse-url-mozilla-arguments - (list "-remote" - (concat "openURL(" - url - (if (browse-url-maybe-new-window - new-window) - (if browse-url-mozilla-new-window-is-tab - ",new-tab" - ",new-window")) - ")")))))) + (apply 'start-process + (concat "mozilla " url) nil + browse-url-mozilla-program + (append + browse-url-mozilla-arguments + (list "-remote" + (concat "openURL(" + url + (if (browse-url-maybe-new-window + new-window) + (if browse-url-mozilla-new-window-is-tab + ",new-tab" + ",new-window")) + ")")))))) (set-process-sentinel process - `(lambda (process change) - (browse-url-mozilla-sentinel process ,url))))) + `(lambda (process change) + (browse-url-mozilla-sentinel process ,url))))) (defun browse-url-mozilla-sentinel (process url) "Handle a change to the process communicating with Mozilla." (or (eq (process-exit-status process) 0) (let* ((process-environment (browse-url-process-environment))) - ;; Mozilla is not running - start it - (message "Starting %s..." browse-url-mozilla-program) - (apply 'start-process (concat "mozilla " url) nil - browse-url-mozilla-program - (append browse-url-mozilla-startup-arguments (list url)))))) + ;; Mozilla is not running - start it + (message "Starting %s..." browse-url-mozilla-program) + (apply 'start-process (concat "mozilla " url) nil + browse-url-mozilla-program + (append browse-url-mozilla-startup-arguments (list url)))))) ;;;###autoload (defun browse-url-firefox (url &optional new-window) @@ -1036,37 +1047,37 @@ (interactive (browse-url-interactive-arg "URL: ")) (setq url (browse-url-encode-url url)) (let* ((process-environment (browse-url-process-environment)) - (process - (apply 'start-process - (concat "firefox " url) nil - browse-url-firefox-program - (append - browse-url-firefox-arguments - (if (or (featurep 'dos-w32) - (string-match "win32" system-configuration)) - (list url) - (list "-remote" - (concat "openURL(" - url - (if (browse-url-maybe-new-window - new-window) - (if browse-url-firefox-new-window-is-tab - ",new-tab" - ",new-window")) - ")"))))))) + (process + (apply 'start-process + (concat "firefox " url) nil + browse-url-firefox-program + (append + browse-url-firefox-arguments + (if (or (featurep 'dos-w32) + (string-match "win32" system-configuration)) + (list url) + (list "-remote" + (concat "openURL(" + url + (if (browse-url-maybe-new-window + new-window) + (if browse-url-firefox-new-window-is-tab + ",new-tab" + ",new-window")) + ")"))))))) (set-process-sentinel process - `(lambda (process change) - (browse-url-firefox-sentinel process ,url))))) + `(lambda (process change) + (browse-url-firefox-sentinel process ,url))))) (defun browse-url-firefox-sentinel (process url) "Handle a change to the process communicating with Firefox." (or (eq (process-exit-status process) 0) (let* ((process-environment (browse-url-process-environment))) - ;; Firefox is not running - start it - (message "Starting Firefox...") - (apply 'start-process (concat "firefox " url) nil - browse-url-firefox-program - (append browse-url-firefox-startup-arguments (list url)))))) + ;; Firefox is not running - start it + (message "Starting Firefox...") + (apply 'start-process (concat "firefox " url) nil + browse-url-firefox-program + (append browse-url-firefox-startup-arguments (list url)))))) ;;;###autoload (defun browse-url-galeon (url &optional new-window) @@ -1089,30 +1100,30 @@ (setq url (browse-url-encode-url url)) (let* ((process-environment (browse-url-process-environment)) (process (apply 'start-process - (concat "galeon " url) - nil - browse-url-galeon-program - (append - browse-url-galeon-arguments + (concat "galeon " url) + nil + browse-url-galeon-program + (append + browse-url-galeon-arguments (if (browse-url-maybe-new-window new-window) - (if browse-url-galeon-new-window-is-tab - '("--new-tab") - '("--new-window" "--noraise")) + (if browse-url-galeon-new-window-is-tab + '("--new-tab") + '("--new-window" "--noraise")) '("--existing")) (list url))))) (set-process-sentinel process - `(lambda (process change) - (browse-url-galeon-sentinel process ,url))))) + `(lambda (process change) + (browse-url-galeon-sentinel process ,url))))) (defun browse-url-galeon-sentinel (process url) "Handle a change to the process communicating with Galeon." (or (eq (process-exit-status process) 0) (let* ((process-environment (browse-url-process-environment))) - ;; Galeon is not running - start it - (message "Starting %s..." browse-url-galeon-program) - (apply 'start-process (concat "galeon " url) nil - browse-url-galeon-program - (append browse-url-galeon-startup-arguments (list url)))))) + ;; Galeon is not running - start it + (message "Starting %s..." browse-url-galeon-program) + (apply 'start-process (concat "galeon " url) nil + browse-url-galeon-program + (append browse-url-galeon-startup-arguments (list url)))))) (defun browse-url-epiphany (url &optional new-window) "Ask the Epiphany WWW browser to load URL. @@ -1134,30 +1145,30 @@ (setq url (browse-url-encode-url url)) (let* ((process-environment (browse-url-process-environment)) (process (apply 'start-process - (concat "epiphany " url) - nil - browse-url-epiphany-program - (append - browse-url-epiphany-arguments + (concat "epiphany " url) + nil + browse-url-epiphany-program + (append + browse-url-epiphany-arguments (if (browse-url-maybe-new-window new-window) - (if browse-url-epiphany-new-window-is-tab - '("--new-tab") - '("--new-window" "--noraise")) + (if browse-url-epiphany-new-window-is-tab + '("--new-tab") + '("--new-window" "--noraise")) '("--existing")) (list url))))) (set-process-sentinel process - `(lambda (process change) - (browse-url-epiphany-sentinel process ,url))))) + `(lambda (process change) + (browse-url-epiphany-sentinel process ,url))))) (defun browse-url-epiphany-sentinel (process url) "Handle a change to the process communicating with Epiphany." (or (eq (process-exit-status process) 0) (let* ((process-environment (browse-url-process-environment))) - ;; Epiphany is not running - start it - (message "Starting %s..." browse-url-epiphany-program) - (apply 'start-process (concat "epiphany " url) nil - browse-url-epiphany-program - (append browse-url-epiphany-startup-arguments (list url)))))) + ;; Epiphany is not running - start it + (message "Starting %s..." browse-url-epiphany-program) + (apply 'start-process (concat "epiphany " url) nil + browse-url-epiphany-program + (append browse-url-epiphany-startup-arguments (list url)))))) ;;;###autoload (defun browse-url-emacs (url &optional new-window) @@ -1188,13 +1199,13 @@ used instead of `browse-url-new-window-flag'." (interactive (browse-url-interactive-arg "URL: ")) (apply 'start-process (concat "gnome-moz-remote " url) - nil - browse-url-gnome-moz-program - (append - browse-url-gnome-moz-arguments - (if (browse-url-maybe-new-window new-window) - '("--newwin")) - (list "--raise" url)))) + nil + browse-url-gnome-moz-program + (append + browse-url-gnome-moz-arguments + (if (browse-url-maybe-new-window new-window) + '("--newwin")) + (list "--raise" url)))) ;; --- Mosaic --- @@ -1216,36 +1227,58 @@ used instead of `browse-url-new-window-flag'." (interactive (browse-url-interactive-arg "Mosaic URL: ")) (let ((pidfile (expand-file-name browse-url-mosaic-pidfile)) - pid) + pid) (if (file-readable-p pidfile) - (save-excursion - (find-file pidfile) - (goto-char (point-min)) - (setq pid (read (current-buffer))) - (kill-buffer nil))) + (save-excursion + (find-file pidfile) + (goto-char (point-min)) + (setq pid (read (current-buffer))) + (kill-buffer nil))) (if (and pid (zerop (signal-process pid 0))) ; Mosaic running - (save-excursion - (find-file (format "/tmp/Mosaic.%d" pid)) - (erase-buffer) - (insert (if (browse-url-maybe-new-window new-window) - "newwin\n" - "goto\n") - url "\n") - (save-buffer) - (kill-buffer nil) - ;; Send signal SIGUSR to Mosaic - (message "Signaling Mosaic...") - (signal-process pid 'SIGUSR1) - ;; Or you could try: - ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid)) - (message "Signaling Mosaic...done") - ) + (save-excursion + (find-file (format "/tmp/Mosaic.%d" pid)) + (erase-buffer) + (insert (if (browse-url-maybe-new-window new-window) + "newwin\n" + "goto\n") + url "\n") + (save-buffer) + (kill-buffer nil) + ;; Send signal SIGUSR to Mosaic + (message "Signaling Mosaic...") + (signal-process pid 'SIGUSR1) + ;; Or you could try: + ;; (call-process "kill" nil 0 nil "-USR1" (int-to-string pid)) + (message "Signaling Mosaic...done") + ) ;; Mosaic not running - start it (message "Starting %s..." browse-url-mosaic-program) (apply 'start-process "xmosaic" nil browse-url-mosaic-program - (append browse-url-mosaic-arguments (list url))) + (append browse-url-mosaic-arguments (list url))) (message "Starting %s...done" browse-url-mosaic-program)))) +;; --- Grail --- + +(defvar browse-url-grail + (concat (or (getenv "GRAILDIR") "~/.grail") "/user/rcgrail.py") + "Location of Grail remote control client script `rcgrail.py'. +Typically found in $GRAILDIR/rcgrail.py, or ~/.grail/user/rcgrail.py.") + +;;;###autoload +(defun browse-url-grail (url &optional new-window) + "Ask the Grail WWW browser to load URL. +Default to the URL around or before point. Runs the program in the +variable `browse-url-grail'." + (interactive (browse-url-interactive-arg "Grail URL: ")) + (message "Sending URL to Grail...") + (with-current-buffer (get-buffer-create " *Shell Command Output*") + (erase-buffer) + ;; don't worry about this failing. + (if (browse-url-maybe-new-window new-window) + (call-process browse-url-grail nil 0 nil "-b" url) + (call-process browse-url-grail nil 0 nil url)) + (message "Sending URL to Grail... done"))) + ;; --- Mosaic using CCI --- ;;;###autoload @@ -1266,17 +1299,28 @@ used instead of `browse-url-new-window-flag'." (interactive (browse-url-interactive-arg "Mosaic URL: ")) (open-network-stream "browse-url" " *browse-url*" - browse-url-CCI-host browse-url-CCI-port) + browse-url-CCI-host browse-url-CCI-port) ;; Todo: start browser if fails (process-send-string "browse-url" - (concat "get url (" url ") output " - (if (browse-url-maybe-new-window new-window) - "new" - "current") - "\r\n")) + (concat "get url (" url ") output " + (if (browse-url-maybe-new-window new-window) + "new" + "current") + "\r\n")) (process-send-string "browse-url" "disconnect\r\n") (delete-process "browse-url")) +;; --- IXI Mosaic --- + +;;;###autoload +(defun browse-url-iximosaic (url &optional new-window) + ;; new-window ignored + "Ask the IXIMosaic WWW browser to load URL. +Default to the URL around or before point." + (interactive (browse-url-interactive-arg "IXI Mosaic URL: ")) + (start-process "tellw3b" nil "tellw3b" + "-service WWW_BROWSER ixi_showurl " url)) + ;; --- W3 --- ;;;###autoload @@ -1304,42 +1348,62 @@ `browse-url-gnudoit-args'. Default to the URL around or before point." (interactive (browse-url-interactive-arg "W3 URL: ")) (apply 'start-process (concat "gnudoit:" url) nil - browse-url-gnudoit-program - (append browse-url-gnudoit-args - (list (concat "(w3-fetch \"" url "\")") - "(raise-frame)")))) + browse-url-gnudoit-program + (append browse-url-gnudoit-args + (list (concat "(w3-fetch \"" url "\")") + "(raise-frame)")))) -;; A general function for browsing within an Emacs frame using a specified text-browser -(defun browse-url-text-browser-emacs (url generic &optional new-buffer) - "Ask for a Web address and an arbitrary text browser. +;; --- Lynx in an xterm --- + +;;;###autoload +(defun browse-url-lynx-xterm (url &optional new-window) + ;; new-window ignored + "Ask the Lynx WWW browser to load URL. +Default to the URL around or before point. A new Lynx process is run +in an Xterm window using the Xterm program named by `browse-url-xterm-program' +with possible additional arguments `browse-url-xterm-args'." + (interactive (browse-url-interactive-arg "Lynx URL: ")) + (apply #'start-process `(,(concat "lynx" url) nil ,browse-url-xterm-program + ,@browse-url-xterm-args "-e" "lynx" + ,url))) + +;; --- Lynx in an Emacs "term" window --- + +;;;###autoload +(defun browse-url-lynx-emacs (url &optional new-buffer) + "Ask the Lynx WWW browser to load URL. +Default to the URL around or before point. With a prefix argument, run +a new Lynx process in a new buffer. When called interactively, if variable `browse-url-new-window-flag' is -non-nil, load the document in a new text browser in a new term window, +non-nil, load the document in a new lynx in a new term window, otherwise use any existing one. A non-nil interactive prefix argument reverses the effect of `browse-url-new-window-flag'. When called non-interactively, optional second argument NEW-WINDOW is used instead of `browse-url-new-window-flag'." - (interactive "MWeb address: \nMBrowser: ") - - (let* ((buf (get-buffer "*text-browser*")) - (proc (and buf (get-buffer-process buf))) - (n browse-url-text-input-attempts)) + (interactive (browse-url-interactive-arg "Lynx URL: ")) + (let* ((system-uses-terminfo t) ; Lynx uses terminfo + ;; (term-term-name "vt100") ; ?? + (buf (get-buffer "*lynx*")) + (proc (and buf (get-buffer-process buf))) + (n browse-url-lynx-input-attempts)) (if (and (browse-url-maybe-new-window new-buffer) buf) - ;; Rename away the OLD buffer. This isn't very polite, but - ;; term insists on working in a buffer named, eg, *lynx* and would - ;; choke on *lynx*<1> - (progn (set-buffer buf) - (rename-uniquely))) + ;; Rename away the OLD buffer. This isn't very polite, but + ;; term insists on working in a buffer named *lynx* and would + ;; choke on *lynx*<1> + (progn (set-buffer buf) + (rename-uniquely))) (if (or (browse-url-maybe-new-window new-buffer) - (not buf) - (not proc) - (not (memq (process-status proc) '(run stop)))) - ;; start a new text browser - (progn - (setq buf (apply #'make-term - `("text-browser" ,generic nil ,@browse-url-text-emacs-args - ,url))) + (not buf) + (not proc) + (not (memq (process-status proc) '(run stop)))) + ;; start a new lynx + (progn + (setq buf + (apply #'make-term + `("lynx" "lynx" nil ,@browse-url-lynx-emacs-args + ,url))) (switch-to-buffer buf) (term-char-mode) (set-process-sentinel @@ -1350,69 +1414,42 @@ (if (not (memq (process-status process) '(run stop))) (let ((buf (process-buffer process))) (if buf (kill-buffer buf))))))) - ;; send the url to the text-browser in the old buffer + ;; send the url to lynx in the old buffer (let ((win (get-buffer-window buf t))) - (if win - (select-window win) - (switch-to-buffer buf))) + (if win + (select-window win) + (switch-to-buffer buf))) (if (eq (following-char) ?_) - (cond ((eq browse-url-text-input-field 'warn) - (error "Please move out of the input field first")) - ((eq browse-url-text-input-field 'avoid) - (while (and (eq (following-char) ?_) (> n 0)) - (term-send-down) ; down arrow - (sit-for browse-url-text-input-delay)) - (if (eq (following-char) ?_) - (error "Cannot move out of the input field, sorry"))))) - (term-send-string proc (concat "g" ; goto - "\C-u" ; kill default url - url - "\r"))))) - -(defun browse-url-links-emacs (url &optional new-buffer) - "Specializes browse-url-text-browser-emacs so it calls Links." - (interactive (browse-url-interactive-arg "URL for Links: ")) - (browse-url-text-browser-emacs url "links" new-buffer)) - -;; Untested -(defun browse-url-links2-emacs (url &optional new-buffer) - "Specializes browse-url-text-browser-emacs so it calls Links2." - (interactive (browse-url-interactive-arg "URL for Links2: ")) - (browse-url-text-browser-emacs url "links2" new-buffer)) - -(defun browse-url-netrik-emacs (url &optional new-buffer) - "Specializes browse-url-text-browser-emacs so it calls Netrik." - (interactive (browse-url-interactive-arg "URL for Netrik: ")) - (browse-url-text-browser-emacs url "netrik" new-buffer)) - -;; Untested -(defun browse-url-w3m-emacs (url &optional new-buffer) - "Specializes browse-url-text-browser-emacs so it calls w3m." - (interactive (browse-url-interactive-arg "URL for w3m: ")) - (browse-url-text-browser-emacs url "w3m" new-buffer)) - -;; --- Lynx in an Emacs "term" window --- - -;;;###autoload -(defun browse-url-lynx-emacs (url &optional new-buffer) - "Specializes browse-url-text-browser-emacs so it calls Lynx." - (interactive (browse-url-interactive-arg "URL for Lynx: ")) - (browse-url-text-browser-emacs url "lynx" new-buffer)) + (cond ((eq browse-url-lynx-input-field 'warn) + (error "Please move out of the input field first")) + ((eq browse-url-lynx-input-field 'avoid) + (while (and (eq (following-char) ?_) (> n 0)) + (term-send-down) ; down arrow + (sit-for browse-url-lynx-input-delay)) + (if (eq (following-char) ?_) + (error "Cannot move out of the input field, sorry"))))) + (term-send-string proc (concat "g" ; goto + "\C-u" ; kill default url + url + "\r"))))) -;; --- Lynx in an xterm --- +;; --- MMM --- ;;;###autoload -(defun browse-url-lynx-xterm (url &optional new-window) - ;; new-window ignored - "Ask the Lynx WWW browser to load URL. -Default to the URL around or before point. A new Lynx process is run -in an Xterm window using the Xterm program named by `browse-url-xterm-program' -with possible additional arguments `browse-url-xterm-args'." - (interactive (browse-url-interactive-arg "Lynx URL: ")) - (apply #'start-process `(,(concat "lynx" url) nil ,browse-url-xterm-program - ,@browse-url-xterm-args "-e" "lynx" - ,url))) - +(defun browse-url-mmm (url &optional new-window) + "Ask the MMM WWW browser to load URL. +Default to the URL around or before point." + (interactive (browse-url-interactive-arg "MMM URL: ")) + (message "Sending URL to MMM...") + (with-current-buffer (get-buffer-create " *Shell Command Output*") + (erase-buffer) + ;; mmm_remote just SEGVs if the file isn't there... + (if (or (file-exists-p (expand-file-name "~/.mmm_remote")) + ;; location in v 0.4: + (file-exists-p (expand-file-name "~/.mmm/remote"))) + (call-process "mmm_remote" nil 0 nil url) + (call-process "mmm" nil 0 nil "-external" url)) + (message "Sending URL to MMM... done"))) ;; --- mailto --- @@ -1436,23 +1473,23 @@ (interactive (browse-url-interactive-arg "Mailto URL: ")) (save-excursion (let* ((alist (rfc2368-parse-mailto-url url)) - (to (assoc "To" alist)) - (subject (assoc "Subject" alist)) - (body (assoc "Body" alist)) - (rest (delete to (delete subject (delete body alist)))) - (to (cdr to)) - (subject (cdr subject)) - (body (cdr body)) - (mail-citation-hook (unless body mail-citation-hook))) + (to (assoc "To" alist)) + (subject (assoc "Subject" alist)) + (body (assoc "Body" alist)) + (rest (delete to (delete subject (delete body alist)))) + (to (cdr to)) + (subject (cdr subject)) + (body (cdr body)) + (mail-citation-hook (unless body mail-citation-hook))) (if (browse-url-maybe-new-window new-window) - (compose-mail-other-window to subject rest nil - (if body - (list 'insert body) - (list 'insert-buffer (current-buffer)))) - (compose-mail to subject rest nil nil - (if body - (list 'insert body) - (list 'insert-buffer (current-buffer)))))))) + (compose-mail-other-window to subject rest nil + (if body + (list 'insert body) + (list 'insert-buffer (current-buffer)))) + (compose-mail to subject rest nil nil + (if body + (list 'insert body) + (list 'insert-buffer (current-buffer)))))))) ;; --- Random browser --- @@ -1468,8 +1505,8 @@ (if (not browse-url-generic-program) (error "No browser defined (`browse-url-generic-program')")) (apply 'call-process browse-url-generic-program nil - 0 nil - (append browse-url-generic-args (list url)))) + 0 nil + (append browse-url-generic-args (list url)))) ;;;###autoload (defun browse-url-kde (url &optional new-window) @@ -1478,19 +1515,19 @@ (interactive (browse-url-interactive-arg "KDE URL: ")) (message "Sending URL to KDE...") (apply #'start-process (concat "KDE " url) nil browse-url-kde-program - (append browse-url-kde-args (list url)))) + (append browse-url-kde-args (list url)))) (defun browse-url-elinks-new-window (url) "Ask the Elinks WWW browser to load URL in a new window." - (let ((process-environment (browse-url-process-environment))) + (let ((process-environment (browse-url-process-environment))) (apply #'start-process - (append (list (concat "elinks:" url) - nil) - browse-url-elinks-wrapper - (list "elinks" url))))) + (append (list (concat "elinks:" url) + nil) + browse-url-elinks-wrapper + (list "elinks" url))))) ;;;###autoload -(defun browse-url-elinks-emacs (url &optional new-buffer) +(defun browse-url-elinks (url &optional new-window) "Ask the Elinks WWW browser to load URL. Default to the URL around the point. @@ -1498,11 +1535,17 @@ none yet running, a newly started instance. The Elinks command will be prepended by the program+arguments -from `browse-url-elinks-wrapper'. - -This specializes browse-url-text-browser-emacs so it calls Elinks." - (interactive (browse-url-interactive-arg "URL for Elinks: ")) - (browse-url-text-browser-emacs url "elinks" new-buffer)) +from `browse-url-elinks-wrapper'." + (interactive (browse-url-interactive-arg "URL: ")) + (setq url (browse-url-encode-url url)) + (if new-window + (browse-url-elinks-new-window url) + (let ((process-environment (browse-url-process-environment)) + (elinks-ping-process (start-process "elinks-ping" nil + "elinks" "-remote" "ping()"))) + (set-process-sentinel elinks-ping-process + `(lambda (process change) + (browse-url-elinks-sentinel process ,url)))))) (defun browse-url-elinks-sentinel (process url) "Determines if Elinks is running or a new one has to be started." @@ -1517,11 +1560,11 @@ ;; Found an instance, open URL in new tab. (let ((process-environment (browse-url-process-environment))) (start-process (concat "elinks:" url) nil - "elinks" "-remote" - (concat "openURL(\"" url "\",new-tab)")))) + "elinks" "-remote" + (concat "openURL(\"" url "\",new-tab)")))) (otherwise (error "Unrecognized exit-code %d of process `elinks'" - exit-status))))) + exit-status))))) (provide 'browse-url)