Merge from gnus--devo--0
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-992
This commit is contained in:
parent
11f6a31de4
commit
95838435c8
5 changed files with 206 additions and 64 deletions
|
@ -1,3 +1,10 @@
|
|||
2008-01-09 Katsumi Yamaoka <yamaoka@jpl.org>
|
||||
|
||||
* gnus.texi (Article Keymap): Add
|
||||
gnus-article-wide-reply-with-original; fix descriptions of
|
||||
gnus-article-reply-with-original and
|
||||
gnus-article-followup-with-original.
|
||||
|
||||
2008-01-09 Glenn Morris <rgm@gnu.org>
|
||||
|
||||
* nxml-mode.texi: Add @copying section.
|
||||
|
|
|
@ -11900,17 +11900,22 @@ Go to the previous button, if any (@code{gnus-article-prev-button}).
|
|||
@kindex R (Article)
|
||||
@findex gnus-article-reply-with-original
|
||||
Send a reply to the current article and yank the current article
|
||||
(@code{gnus-article-reply-with-original}). If given a prefix, make a
|
||||
wide reply. If the region is active, only yank the text in the
|
||||
region.
|
||||
(@code{gnus-article-reply-with-original}). If the region is active,
|
||||
only yank the text in the region.
|
||||
|
||||
@item S W
|
||||
@kindex S W (Article)
|
||||
@findex gnus-article-wide-reply-with-original
|
||||
Send a wide reply to the current article and yank the current article
|
||||
(@code{gnus-article-wide-reply-with-original}). If the region is
|
||||
active, only yank the text in the region.
|
||||
|
||||
@item F
|
||||
@kindex F (Article)
|
||||
@findex gnus-article-followup-with-original
|
||||
Send a followup to the current article and yank the current article
|
||||
(@code{gnus-article-followup-with-original}). If given a prefix, make
|
||||
a wide reply. If the region is active, only yank the text in the
|
||||
region.
|
||||
(@code{gnus-article-followup-with-original}). If the region is active,
|
||||
only yank the text in the region.
|
||||
|
||||
|
||||
@end table
|
||||
|
|
|
@ -1,3 +1,39 @@
|
|||
2008-01-10 Katsumi Yamaoka <yamaoka@jpl.org>
|
||||
|
||||
* gnus-art.el (gnus-article-read-summary-keys): Work for `C-h' on
|
||||
XEmacs.
|
||||
(gnus-article-describe-key, gnus-article-describe-key-briefly): Protect
|
||||
against non-character events.
|
||||
|
||||
* lpath.el: Fbind map-keymap for Emacs 21.
|
||||
|
||||
2008-01-09 Reiner Steib <Reiner.Steib@gmx.de>
|
||||
|
||||
* gnus-group.el (gnus-group-read-ephemeral-gmane-group-url): New
|
||||
command.
|
||||
(gnus-group-read-ephemeral-gmane-group): Use optional argument RANGE
|
||||
instead of END. Change name of the temp file.
|
||||
(gnus-group-gmane-group-download-format): Add doc string. Make it
|
||||
customizable.
|
||||
|
||||
2008-01-09 Katsumi Yamaoka <yamaoka@jpl.org>
|
||||
|
||||
* gnus-art.el (gnus-article-send-map): New keymap for `S' prefix keys;
|
||||
bind `S W' to gnus-article-wide-reply-with-original; set default
|
||||
binding to gnus-article-read-summary-send-keys.
|
||||
(gnus-article-read-summary-keys): Fix the order of keys; display
|
||||
continuation keys correctly in the echo area; describe bindings
|
||||
correctly when keys end with `C-h'.
|
||||
(gnus-article-read-summary-send-keys): New function.
|
||||
(gnus-article-describe-key, gnus-article-describe-key-briefly): Work
|
||||
for gnus-article-read-summary-send-keys; display continuation keys
|
||||
correctly in the echo area.
|
||||
(gnus-article-reply-with-original): Ignore prefix argument.
|
||||
(gnus-article-wide-reply-with-original): New function.
|
||||
|
||||
* lpath.el: Fbind character-to-event and set-keymap-default-binding for
|
||||
Emacs 21.
|
||||
|
||||
2008-01-08 Katsumi Yamaoka <yamaoka@jpl.org>
|
||||
|
||||
* gnus-bookmark.el (gnus-bookmark-mouse-available-p): Don't test for
|
||||
|
|
|
@ -4225,6 +4225,13 @@ If variable `gnus-use-long-file-name' is non-nil, it is
|
|||
(substitute-key-definition
|
||||
'undefined 'gnus-article-read-summary-keys gnus-article-mode-map)
|
||||
|
||||
(gnus-define-keys (gnus-article-send-map "S" gnus-article-mode-map)
|
||||
"W" gnus-article-wide-reply-with-original)
|
||||
(if (featurep 'xemacs)
|
||||
(set-keymap-default-binding gnus-article-send-map
|
||||
'gnus-article-read-summary-send-keys)
|
||||
(define-key gnus-article-send-map [t] 'gnus-article-read-summary-send-keys))
|
||||
|
||||
(defun gnus-article-make-menu-bar ()
|
||||
(unless (boundp 'gnus-article-commands-menu)
|
||||
(gnus-summary-make-menu-bar))
|
||||
|
@ -6243,17 +6250,37 @@ not have a face in `gnus-article-boring-faces'."
|
|||
(save-excursion
|
||||
(set-buffer gnus-article-current-summary)
|
||||
(let (gnus-pick-mode)
|
||||
(push (or key last-command-event) unread-command-events)
|
||||
(setq keys (if (featurep 'xemacs)
|
||||
(events-to-keys (read-key-sequence nil))
|
||||
(read-key-sequence nil)))))
|
||||
(setq unread-command-events (nconc unread-command-events
|
||||
(list (or key last-command-event)))
|
||||
keys (if (featurep 'xemacs)
|
||||
(events-to-keys (read-key-sequence nil t))
|
||||
(read-key-sequence nil t)))))
|
||||
|
||||
(message "")
|
||||
|
||||
(cond
|
||||
((eq (aref keys (1- (length keys))) ?\C-h)
|
||||
(with-current-buffer gnus-article-current-summary
|
||||
(describe-bindings (substring keys 0 -1))))
|
||||
(if (featurep 'xemacs)
|
||||
(let ((keymap (with-current-buffer gnus-article-current-summary
|
||||
(copy-keymap (current-local-map)))))
|
||||
(map-keymap
|
||||
(lambda (key def)
|
||||
(define-key keymap (vector ?S key) def))
|
||||
gnus-article-send-map)
|
||||
(with-temp-buffer
|
||||
(setq major-mode 'gnus-article-mode)
|
||||
(use-local-map keymap)
|
||||
(describe-bindings (substring keys 0 -1))))
|
||||
(let ((keymap (make-sparse-keymap))
|
||||
(map (copy-keymap gnus-article-send-map)))
|
||||
(define-key keymap "S" map)
|
||||
(define-key map [t] nil)
|
||||
(set-keymap-parent keymap
|
||||
(with-current-buffer gnus-article-current-summary
|
||||
(current-local-map)))
|
||||
(with-temp-buffer
|
||||
(use-local-map keymap)
|
||||
(describe-bindings (substring keys 0 -1))))))
|
||||
((or (member keys nosaves)
|
||||
(member keys nosave-but-article)
|
||||
(member keys nosave-in-article))
|
||||
|
@ -6339,53 +6366,63 @@ not have a face in `gnus-article-boring-faces'."
|
|||
(signal (car err) (cdr err))
|
||||
(ding))))))))
|
||||
|
||||
(defun gnus-article-read-summary-send-keys ()
|
||||
(interactive)
|
||||
(let ((unread-command-events (list (if (featurep 'xemacs)
|
||||
(character-to-event ?S)
|
||||
?S))))
|
||||
(gnus-article-read-summary-keys)))
|
||||
|
||||
(defun gnus-article-describe-key (key)
|
||||
"Display documentation of the function invoked by KEY. KEY is a string."
|
||||
(interactive "kDescribe key: ")
|
||||
"Display documentation of the function invoked by KEY.
|
||||
KEY is a string or a vector."
|
||||
(interactive (list (let ((cursor-in-echo-area t)) ;; better for XEmacs.
|
||||
(read-key-sequence "Describe key: "))))
|
||||
(gnus-article-check-buffer)
|
||||
(if (eq (key-binding key) 'gnus-article-read-summary-keys)
|
||||
(if (memq (key-binding key t) '(gnus-article-read-summary-keys
|
||||
gnus-article-read-summary-send-keys))
|
||||
(save-excursion
|
||||
(set-buffer gnus-article-current-summary)
|
||||
(let (gnus-pick-mode)
|
||||
(if (featurep 'xemacs)
|
||||
(progn
|
||||
(push (elt key 0) unread-command-events)
|
||||
(setq key (events-to-keys
|
||||
(read-key-sequence "Describe key: "))))
|
||||
(setq unread-command-events
|
||||
(mapcar
|
||||
(lambda (x) (if (>= x 128) (list 'meta (- x 128)) x))
|
||||
(string-to-list key)))
|
||||
(setq key (read-key-sequence "Describe key: "))))
|
||||
(describe-key key))
|
||||
(setq unread-command-events
|
||||
(if (featurep 'xemacs)
|
||||
(append key nil)
|
||||
(mapcar (lambda (x) (if (and (integerp x) (>= x 128))
|
||||
(list 'meta (- x 128))
|
||||
x))
|
||||
key)))
|
||||
(let ((cursor-in-echo-area t)
|
||||
gnus-pick-mode)
|
||||
(describe-key (read-key-sequence nil t))))
|
||||
(describe-key key)))
|
||||
|
||||
(defun gnus-article-describe-key-briefly (key &optional insert)
|
||||
"Display documentation of the function invoked by KEY. KEY is a string."
|
||||
(interactive "kDescribe key: \nP")
|
||||
"Display documentation of the function invoked by KEY.
|
||||
KEY is a string or a vector."
|
||||
(interactive (list (let ((cursor-in-echo-area t)) ;; better for XEmacs.
|
||||
(read-key-sequence "Describe key: "))
|
||||
current-prefix-arg))
|
||||
(gnus-article-check-buffer)
|
||||
(if (eq (key-binding key) 'gnus-article-read-summary-keys)
|
||||
(if (memq (key-binding key t) '(gnus-article-read-summary-keys
|
||||
gnus-article-read-summary-send-keys))
|
||||
(save-excursion
|
||||
(set-buffer gnus-article-current-summary)
|
||||
(let (gnus-pick-mode)
|
||||
(if (featurep 'xemacs)
|
||||
(progn
|
||||
(push (elt key 0) unread-command-events)
|
||||
(setq key (events-to-keys
|
||||
(read-key-sequence "Describe key: "))))
|
||||
(setq unread-command-events
|
||||
(mapcar
|
||||
(lambda (x) (if (>= x 128) (list 'meta (- x 128)) x))
|
||||
(string-to-list key)))
|
||||
(setq key (read-key-sequence "Describe key: "))))
|
||||
(describe-key-briefly key insert))
|
||||
(setq unread-command-events
|
||||
(if (featurep 'xemacs)
|
||||
(append key nil)
|
||||
(mapcar (lambda (x) (if (and (integerp x) (>= x 128))
|
||||
(list 'meta (- x 128))
|
||||
x))
|
||||
key)))
|
||||
(let ((cursor-in-echo-area t)
|
||||
gnus-pick-mode)
|
||||
(describe-key-briefly (read-key-sequence nil t) insert)))
|
||||
(describe-key-briefly key insert)))
|
||||
|
||||
(defun gnus-article-reply-with-original (&optional wide)
|
||||
"Start composing a reply mail to the current message.
|
||||
The text in the region will be yanked. If the region isn't active,
|
||||
the entire article will be yanked."
|
||||
(interactive "P")
|
||||
(interactive)
|
||||
(let ((article (cdr gnus-article-current))
|
||||
contents)
|
||||
(if (not (gnus-region-active-p))
|
||||
|
@ -6400,6 +6437,13 @@ the entire article will be yanked."
|
|||
(gnus-summary-reply
|
||||
(list (list article contents)) wide)))))
|
||||
|
||||
(defun gnus-article-wide-reply-with-original ()
|
||||
"Start composing a wide reply mail to the current message.
|
||||
The text in the region will be yanked. If the region isn't active,
|
||||
the entire article will be yanked."
|
||||
(interactive)
|
||||
(gnus-article-reply-with-original t))
|
||||
|
||||
(defun gnus-article-followup-with-original ()
|
||||
"Compose a followup to the current article.
|
||||
The text in the region will be yanked. If the region isn't active,
|
||||
|
|
|
@ -2320,44 +2320,94 @@ Return the name of the group if selection was successful."
|
|||
(message "Quit reading the ephemeral group")
|
||||
nil)))))
|
||||
|
||||
(defvar gnus-group-gmane-group-download-format
|
||||
"http://download.gmane.org/%s/%s/%s")
|
||||
(defcustom gnus-group-gmane-group-download-format
|
||||
"http://download.gmane.org/%s/%s/%s"
|
||||
"URL for downloading mbox files.
|
||||
It must contain three \"%s\". They correspond to the group, the
|
||||
minimal and maximal article numbers, respectively."
|
||||
:group 'gnus-group-foreign
|
||||
:version "23.0" ;; No Gnus
|
||||
:type 'string)
|
||||
|
||||
(autoload 'url-insert-file-contents "url-handlers")
|
||||
;; FIXME:
|
||||
;; - Add documentation, menu, key bindings, ...
|
||||
|
||||
;; FIXME: Make gnus-group-gmane-group-download-format customizable. Add
|
||||
;; documentation, menu, key bindings...
|
||||
|
||||
(defun gnus-group-read-ephemeral-gmane-group (group start end)
|
||||
(defun gnus-group-read-ephemeral-gmane-group (group start &optional range)
|
||||
"Read articles from Gmane group GROUP as an ephemeral group.
|
||||
START and END specify the articles range. The articles are
|
||||
downloaded via HTTP using the URL specified by
|
||||
`gnus-group-gmane-group-download-format'."
|
||||
START is the first article. RANGE specifies how many articles
|
||||
are fetched. The articles are downloaded via HTTP using the URL
|
||||
specified by `gnus-group-gmane-group-download-format'."
|
||||
;; See <http://gmane.org/export.php> for more information.
|
||||
(interactive
|
||||
(list
|
||||
(gnus-group-completing-read "Gmane group: ")
|
||||
(read-number "Start article number: ")
|
||||
(read-number "End article number: ")))
|
||||
(when (< (- end start) 0)
|
||||
(error "Invalid range."))
|
||||
(when (> (- end start)
|
||||
(min (or gnus-large-ephemeral-newsgroup 100) 100))
|
||||
(unless (y-or-n-p
|
||||
(format "Large range (%s to %s), continue anyway? "
|
||||
start end))
|
||||
(error "Range too large. Aborted.")))
|
||||
(let ((tmpfile (make-temp-file "gmane.gnus-temp-group-")))
|
||||
(read-number "How many articles: ")))
|
||||
(unless range (setq range 500))
|
||||
(when (< range 1)
|
||||
(error "Invalid range: %s" range))
|
||||
(let ((tmpfile (make-temp-file
|
||||
(format "%s.start-%s.range-%s." group start range)))
|
||||
(gnus-thread-sort-functions '(gnus-thread-sort-by-number)))
|
||||
(with-temp-file tmpfile
|
||||
(url-insert-file-contents
|
||||
(format gnus-group-gmane-group-download-format
|
||||
group start end))
|
||||
group start (+ start range)))
|
||||
(write-region (point-min) (point-max) tmpfile)
|
||||
(gnus-group-read-ephemeral-group
|
||||
"rs-gnus-read-gmane"
|
||||
(format "%s.start-%s.range-%s" group start range)
|
||||
`(nndoc ,tmpfile
|
||||
(nndoc-article-type guess))))
|
||||
(delete-file tmpfile)))
|
||||
|
||||
(defun gnus-group-read-ephemeral-gmane-group-url (url)
|
||||
"Create an ephemeral Gmane group from URL.
|
||||
|
||||
Valid input formats include:
|
||||
\"http://thread.gmane.org/gmane.foo.bar/12300/focus=12399\",
|
||||
\"http://thread.gmane.org/gmane.foo.bar/12345/\",
|
||||
\"http://article.gmane.org/gmane.foo.bar/12345/\",
|
||||
\"http://news.gmane.org/group/gmane.foo.bar/thread=12345\""
|
||||
;; - Feel free to add other useful Gmane URLs here! Maybe the URLs should
|
||||
;; be customizable?
|
||||
;; - The URLs should be added to `gnus-button-alist'. Probably we should
|
||||
;; prompt the user to decide: "View via `browse-url' or in Gnus? "
|
||||
;; (`gnus-group-read-ephemeral-gmane-group-url')
|
||||
(interactive
|
||||
(list (gnus-group-completing-read "Gmane URL: ")))
|
||||
(let (group start range)
|
||||
(cond
|
||||
;; URLs providing `group', `start' and `range':
|
||||
((string-match
|
||||
;; http://thread.gmane.org/gmane.emacs.devel/86326/focus=86525
|
||||
"^http://thread\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)/focus=\\([0-9]+\\)$"
|
||||
url)
|
||||
(setq group (match-string 1 url)
|
||||
start (string-to-number (match-string 2 url))
|
||||
;; Ensure that `range' is large enough to ensure focus article is
|
||||
;; included.
|
||||
range (- (string-to-number (match-string 3 url))
|
||||
start -1)))
|
||||
;; URLs providing `group' and `start':
|
||||
((or (string-match
|
||||
;; http://article.gmane.org/gmane.comp.gnu.make.bugs/3584
|
||||
"^http://\\(?:thread\\|article\\)\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
|
||||
url)
|
||||
(string-match
|
||||
;; Don't advertize these in the doc string yet:
|
||||
"^\\(?:nntp\\|news\\)://news\.gmane\.org/\\([^/]+\\)/\\([0-9]+\\)"
|
||||
url)
|
||||
(string-match
|
||||
;; http://news.gmane.org/group/gmane.emacs.gnus.general/thread=65099/force_load=t
|
||||
"^http://news\.gmane\.org/group/\\([^/]+\\)/thread=\\([0-9]+\\)"
|
||||
url))
|
||||
(setq group (match-string 1 url)
|
||||
start (string-to-number (match-string 2 url))))
|
||||
(t
|
||||
(error "Can't parse URL %s" url)))
|
||||
(gnus-group-read-ephemeral-gmane-group group start range)))
|
||||
|
||||
(defun gnus-group-jump-to-group (group &optional prompt)
|
||||
"Jump to newsgroup GROUP.
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue