(require 'gnus-ems)
(require 'easymenu)
(require 'custom)
+(require 'browse-url)
(defvar gnus-group-menu-hook nil
"*Hook run after the creation of the group mode menu.")
gnus-cite-attribution-alist)
gnus-button-message-id 3)
;; This is how URLs _should_ be embedded in text...
- ("<URL:\\([^\n\r>]*\\)>" 0 t gnus-button-url 1)
+ ("<URL:\\([^\n\r>]*\\)>" 0 t browse-url-browser-function 1)
;; Next regexp stolen from highlight-headers.el.
;; Modified by Vladimir Alexiev.
- ("\\b\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?[-a-zA-Z0-9_=?#$@~`%&*+|\\/.,]*[-a-zA-Z0-9_=#$@~`%&*+|\\/]" 0 t gnus-button-url 0))
+ ("\\b\\(s?https?\\|ftp\\|file\\|gopher\\|news\\|telnet\\|wais\\|mailto\\):\\(//[-a-zA-Z0-9_.]+:[0-9]*\\)?[-a-zA-Z0-9_=?#$@~`%&*+|\\/.,]*[-a-zA-Z0-9_=#$@~`%&*+|\\/]" 0 t browse-url-browser-function 0))
"Alist of regexps matching buttons in an article.
Each entry has the form (REGEXP BUTTON FORM CALLBACK PAR...), where
CALLBACK can also be a variable, in that case the value of that
variable it the real callback function.")
-;see gnus-cus.el
-;(eval-when-compile
-; (defvar browse-url-browser-function))
-
-;see gnus-cus.el
-;(defvar gnus-button-url
-; (cond ((boundp 'browse-url-browser-function) browse-url-browser-function)
-; ((fboundp 'w3-fetch) 'w3-fetch)
-; ((eq window-system 'x) 'gnus-netscape-open-url))
-; "*Function to fetch URL.
-;The function will be called with one argument, the URL to fetch.
-;Useful values of this function are:
-
-;w3-fetch:
-; defined in the w3 emacs package by William M. Perry.
-;gnus-netscape-open-url:
-; open url in existing netscape, start netscape if none found.
-;gnus-netscape-start-url:
-; start new netscape with url.")
-
\f
(eval-and-compile
(skip-chars-forward ": \t")
(let ((from (point)))
(goto-char end)
- (skip-chars-backward " \t")
+ (skip-chars-backward " \t\n")
(put-text-property from (point) 'face field-face)
(setq field-found t))))))
(goto-char begin)))))))
(gnus-article-add-button start end 'gnus-button-push
(set-marker (make-marker)
from)))))))))
-(defun gnus-netscape-open-url (url)
- "Open URL in netscape, or start new scape with URL."
- (let ((process (start-process (concat "netscape " url)
- nil
- "netscape"
- "-remote"
- (concat "openUrl(" url ")'"))))
- (set-process-sentinel process
- (` (lambda (process change)
- (or (eq (process-exit-status process) 0)
- (gnus-netscape-start-url (, url))))))))
-
-(defun gnus-netscape-start-url (url)
- "Start netscape with URL."
- (start-process (concat "netscape" url) nil "netscape" url))
-
;;; External functions:
(defun gnus-article-add-button (from to fun &optional data)
It is meant to be used for highlighting the article in some way. It
is not run if `gnus-visual' is nil.")
+(defun gnus-parse-headers-hook nil
+ "*A hook called before parsing the headers.")
+
(defvar gnus-exit-group-hook nil
"*A hook called when exiting (not quitting) summary mode.")
"gnus-bug@ifi.uio.no (The Gnus Bugfixing Girls + Boys)"
"The mail address of the Gnus maintainers.")
-(defconst gnus-version "Gnus v5.0.12"
+(defconst gnus-version "Gnus v5.0.13"
"Version number for this version of Gnus.")
(defvar gnus-info-nodes
(defun gnus-group-quit-config (group)
"Return the quit-config of GROUP."
- (cdr (assoc 'quit-config (gnus-find-method-for-group group))))
+ (nth 1 (assoc 'quit-config (gnus-find-method-for-group group))))
+
+(defun gnus-simplify-mode-line ()
+ "Make mode lines a bit simpler."
+ (setq mode-line-modified "-- ")
+ (if (listp mode-line-format)
+ (progn
+ (make-local-variable 'mode-line-format)
+ (setq mode-line-format (copy-sequence mode-line-format))
+ (and (equal (nth 3 mode-line-format) " ")
+ (setcar (nthcdr 3 mode-line-format) "")))))
;;; List and range functions
(defvar gnus-group-group-map nil)
(defvar gnus-group-mark-map nil)
(defvar gnus-group-list-map nil)
+(defvar gnus-group-help-map nil)
(defvar gnus-group-sub-map nil)
(put 'gnus-group-mode 'mode-class 'special)
(define-key gnus-group-mode-map "Z" 'gnus-group-clear-dribble)
(define-key gnus-group-mode-map "q" 'gnus-group-exit)
(define-key gnus-group-mode-map "Q" 'gnus-group-quit)
- (define-key gnus-group-mode-map "\M-f" 'gnus-group-fetch-faq)
(define-key gnus-group-mode-map "?" 'gnus-group-describe-briefly)
(define-key gnus-group-mode-map "\C-c\C-i" 'gnus-info-find-node)
(define-key gnus-group-mode-map "\M-e" 'gnus-group-edit-group-method)
(define-key gnus-group-list-map "m" 'gnus-group-list-matching)
(define-key gnus-group-list-map "M" 'gnus-group-list-all-matching)
+ (define-prefix-command 'gnus-group-help-map)
+ (define-key gnus-group-mode-map "H" 'gnus-group-help-map)
+ (define-key gnus-group-help-map "f" 'gnus-group-fetch-faq)
+
(define-prefix-command 'gnus-group-sub-map)
(define-key gnus-group-mode-map "S" 'gnus-group-sub-map)
(define-key gnus-group-sub-map "l" 'gnus-group-set-current-level)
(interactive)
(if gnus-visual (gnus-group-make-menu-bar))
(kill-all-local-variables)
- (setq mode-line-modified "-- ")
- (make-local-variable 'mode-line-format)
- (setq mode-line-format (copy-sequence mode-line-format))
- (and (equal (nth 3 mode-line-format) " ")
- (setcar (nthcdr 3 mode-line-format) ""))
+ (gnus-simplify-mode-line)
(setq major-mode 'gnus-group-mode)
(setq mode-name "Group")
(gnus-group-set-mode-line)
(interactive)
(kill-all-local-variables)
(if gnus-visual (gnus-browse-make-menu-bar))
- (setq mode-line-modified "-- ")
- (make-local-variable 'mode-line-format)
- (setq mode-line-format (copy-sequence mode-line-format))
- (and (equal (nth 3 mode-line-format) " ")
- (setcar (nthcdr 3 mode-line-format) ""))
+ (gnus-simplify-mode-line)
(setq major-mode 'gnus-browse-mode)
(setq mode-name "Browse Server")
(setq mode-line-process nil)
(set (car locals) nil))
(setq locals (cdr locals))))
(gnus-make-thread-indent-array)
- (setq mode-line-modified "-- ")
- (make-local-variable 'mode-line-format)
- (setq mode-line-format (copy-sequence mode-line-format))
- (and (equal (nth 3 mode-line-format) " ")
- (setcar (nthcdr 3 mode-line-format) ""))
+ (gnus-simplify-mode-line)
(setq major-mode 'gnus-summary-mode)
(setq mode-name "Summary")
(make-local-variable 'minor-mode-alist)
headers id dep end ref)
(save-excursion
(set-buffer nntp-server-buffer)
+ ;; Allow the user to mangle the headers before parsing them.
+ (run-hooks 'gnus-parse-headers-hook)
(goto-char (point-min))
;; Search to the beginning of the next header. Error messages
;; do not begin with 2 or 3.
number headers header)
(save-excursion
(set-buffer nntp-server-buffer)
+ ;; Allow the user to mangle the headers before parsing them.
+ (run-hooks 'gnus-parse-headers-hook)
(goto-char (point-min))
(while (and sequence (not (eobp)))
(setq number (read cur))
(gnus-request-article-this-buffer
(car articles) gnus-newsgroup-name)
(gnus-request-accept-article
- (if select-method (quote select-method) to-newsgroup)
+ (if select-method (list 'quote select-method) to-newsgroup)
(not (cdr articles)))))
(let* ((entry
(or
(defun gnus-summary-set-process-mark (article)
"Set the process mark on ARTICLE and update the summary line."
- (setq gnus-newsgroup-processable (cons article gnus-newsgroup-processable))
+ (setq gnus-newsgroup-processable
+ (cons article
+ (delq article gnus-newsgroup-processable)))
(let ((buffer-read-only nil))
(if (gnus-summary-goto-subject article)
(progn
;; Fix by Sudish Joseph <joseph@cis.ohio-state.edu>.
(gnus-set-global-variables)
(let ((buffer-read-only nil)
- (orig-article (gnus-summary-article-number))
+ (orig-article
+ (progn
+ (gnus-summary-search-forward t)
+ (gnus-summary-article-number)))
(marks (concat "^[" marks "]")))
(goto-char (point-min))
(if gnus-newsgroup-adaptive
(cons
(lambda ()
(let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
- (extract (funcall
- gnus-extract-address-components
- (mail-header-from header))))
- (concat (or (car extract) (cdr extract))
- "\r" (int-to-string (mail-header-number header))
- "\r" (mail-header-subject header))))
+ extract)
+ (if (not (vectorp header))
+ ""
+ (setq extract (funcall gnus-extract-address-components
+ (mail-header-from header)))
+ (concat (or (car extract) (cdr extract))
+ "\r" (int-to-string (mail-header-number header))
+ "\r" (mail-header-subject header)))))
'gnus-thread-sort-by-author)
reverse))
(cons
(lambda ()
(let* ((header (gnus-get-header-by-num (gnus-summary-article-number)))
- (extract (funcall
- gnus-extract-address-components
- (mail-header-from header))))
- (concat
- (downcase (gnus-simplify-subject (gnus-summary-subject-string) t))
- "\r" (int-to-string (mail-header-number header))
- "\r" (or (car extract) (cdr extract)))))
+ extract)
+ (if (not (vectorp header))
+ ""
+ (setq extract (funcall gnus-extract-address-components
+ (mail-header-from header)))
+ (concat
+ (downcase (gnus-simplify-subject (gnus-summary-subject-string) t))
+ "\r" (int-to-string (mail-header-number header))
+ "\r" (or (car extract) (cdr extract))))))
'gnus-thread-sort-by-subject)
reverse))
(interactive)
(if gnus-visual (gnus-article-make-menu-bar))
(kill-all-local-variables)
- (setq mode-line-modified "-- ")
- (make-local-variable 'mode-line-format)
- (setq mode-line-format (copy-sequence mode-line-format))
- (and (equal (nth 3 mode-line-format) " ")
- (setcar (nthcdr 3 mode-line-format) ""))
+ (gnus-simplify-mode-line)
(setq mode-name "Article")
(setq major-mode 'gnus-article-mode)
(make-local-variable 'minor-mode-alist)
;; Find new newsgroups and treat them.
(if (and init gnus-check-new-newsgroups gnus-read-active-file (not level)
- (gnus-server-opened gnus-select-method))
+ (gnus-check-server gnus-select-method))
(gnus-find-new-newsgroups))
;; Find the number of unread articles in each non-dead group.
(interactive)
(if gnus-visual (gnus-server-make-menu-bar))
(kill-all-local-variables)
- (setq mode-line-modified "-- ")
- (make-local-variable 'mode-line-format)
- (setq mode-line-format (copy-sequence mode-line-format))
- (and (equal (nth 3 mode-line-format) " ")
- (setcar (nthcdr 3 mode-line-format) ""))
+ (gnus-simplify-mode-line)
(setq major-mode 'gnus-server-mode)
(setq mode-name "Server")
; (gnus-group-set-mode-line)
'active)
'group))))
-(defun nntp-open-server (server &optional defs)
+(defun nntp-open-server (server &optional defs connectionless)
+ "Open the virtual server SERVER.
+If CONNECTIONLESS is non-nil, don't attempt to connect to any physical
+servers."
(nnheader-init-server-buffer)
(if (nntp-server-opened server)
t
(setq nntp-server-alist (delq state nntp-server-alist)))
(nnheader-set-init-variables nntp-server-variables defs)))
(setq nntp-current-server server)
- (or (nntp-server-opened server)
- (progn
- (if (member nntp-address nntp-timeout-servers)
- nil
- (run-hooks 'nntp-prepare-server-hook)
- (nntp-open-server-semi-internal nntp-address nntp-port-number))))))
+ ;; We have now changed to the proper virtual server. We then
+ ;; check that the physical server is opened.
+ (if (or (nntp-server-opened server)
+ connectionless)
+ ()
+ (if (member nntp-address nntp-timeout-servers)
+ nil
+ ;; We open a connection to the physical nntp server.
+ (run-hooks 'nntp-prepare-server-hook)
+ (nntp-open-server-semi-internal nntp-address nntp-port-number)))))
(defun nntp-close-server (&optional server)
"Close connection to SERVER."
- (nntp-possibly-change-server nil server)
+ (nntp-possibly-change-server nil server t)
(unwind-protect
(progn
;; Un-set default sentinel function before closing connection.
(defun nntp-request-group-description (group &optional server)
"Get description of GROUP."
- (if (nntp-possibly-change-server nil server)
- (prog1
- (nntp-send-command "^.*\r?\n" "XGTITLE" group)
- (nntp-decode-text))))
+ (nntp-possibly-change-server nil server)
+ (prog1
+ (nntp-send-command "^.*\r?\n" "XGTITLE" group)
+ (nntp-decode-text)))
(defun nntp-close-group (group &optional server)
(setq nntp-current-group nil)
()
(erase-buffer)
(if post
- (news-setup nil subject nil group nil)
+ (news-setup nil subject nil (or follow-to group) nil)
(save-excursion
(set-buffer article-buffer)
(goto-char (point-min))
(setq list (cdr list)))
(car list))
-(defun nntp-possibly-change-server (newsgroup server)
- ;; We see whether it is necessary to change the newsgroup.
- (and newsgroup
- (progn
- (not (equal newsgroup nntp-current-group))
- (nntp-request-group newsgroup server)))
- (and server
- (or (nntp-server-opened server)
- (nntp-open-server server))))
+(defun nntp-possibly-change-server (newsgroup server &optional connectionless)
+ "Check whether the virtual server needs changing."
+ (if (and server
+ (not (nntp-server-opened server)))
+ ;; This virtual server isn't open, so we (re)open it here.
+ (nntp-open-server server nil t))
+ (if (and newsgroup
+ (not (equal newsgroup nntp-current-group)))
+ ;; Set the proper current group.
+ (nntp-request-group newsgroup server)))
(defun nntp-try-list-active (group)
(nntp-list-active-group group)