- (let ((system-uses-terminfo t)) ; Lynx uses terminfo
- (if (fboundp 'make-term)
- (let ((term-term-name "vt100"))
- (set-buffer (make-term "browse-url" "lynx" nil url))
- (term-mode)
- (term-char-mode)
- (switch-to-buffer "*browse-url*"))
- (terminal-emulator "*browse-url*" "lynx" (list 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 new-buffer buf)
+ ;; 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 new-buffer
+ (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
+ (get-buffer-process buf)
+ ;; Don't leave around a dead one (especially because of its
+ ;; munged keymap.)
+ (lambda (process event)
+ (if (not (memq (process-status process) '(run stop)))
+ (let ((buf (process-buffer process)))
+ (if buf (kill-buffer buf)))))))
+ ;; 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 (eq (following-char) ?_)
+ (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")))))