mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-07 15:00:34 -08:00
* lisp/gnus/gnus-agent.el, lisp/gnus/gnus-art.el: * lisp/gnus/gnus-async.el, lisp/gnus/gnus-cache.el: * lisp/gnus/gnus-demon.el, lisp/gnus/gnus-group.el: * lisp/gnus/gnus-icalendar.el, lisp/gnus/gnus-logic.el: * lisp/gnus/gnus-msg.el, lisp/gnus/gnus-picon.el: * lisp/gnus/gnus-registry.el, lisp/gnus/gnus-salt.el: * lisp/gnus/gnus-score.el, lisp/gnus/gnus-spec.el: * lisp/gnus/gnus-srvr.el, lisp/gnus/gnus-start.el: * lisp/gnus/gnus-sum.el, lisp/gnus/gnus-topic.el: * lisp/gnus/gnus-util.el, lisp/gnus/gnus-uu.el, lisp/gnus/gnus-win.el: * lisp/gnus/mail-source.el, lisp/gnus/mm-decode.el: * lisp/gnus/mm-encode.el, lisp/gnus/mm-url.el, lisp/gnus/mm-view.el: * lisp/gnus/mml-smime.el, lisp/gnus/mml.el, lisp/gnus/mml2015.el: * lisp/gnus/nnbabyl.el, lisp/gnus/nndoc.el, lisp/gnus/nneething.el: * lisp/gnus/nnheader.el, lisp/gnus/nnimap.el, lisp/gnus/nnmail.el: * lisp/gnus/nnmaildir.el, lisp/gnus/nnoo.el, lisp/gnus/nnrss.el: * lisp/gnus/nnspool.el, lisp/gnus/nntp.el, lisp/gnus/nnvirtual.el: * lisp/gnus/nnweb.el, lisp/gnus/spam.el: Replace cl with cl-lib. * lisp/gnus/canlock.el, lisp/gnus/gnus-bcklg.el: * lisp/gnus/gnus-cite.el, lisp/gnus/gnus-cloud.el: * lisp/gnus/gnus-draft.el, lisp/gnus/gnus-dup.el: * lisp/gnus/gnus-fun.el, lisp/gnus/gnus-html.el: * lisp/gnus/gnus-int.el, lisp/gnus/gnus-kill.el, lisp/gnus/gnus-ml.el: * lisp/gnus/gnus-mlspl.el, lisp/gnus/gnus-range.el: * lisp/gnus/gnus-undo.el, lisp/gnus/gnus-vm.el: * lisp/gnus/mm-partial.el, lisp/gnus/mm-uu.el, lisp/gnus/mml1991.el: * lisp/gnus/nnagent.el, lisp/gnus/nndiary.el, lisp/gnus/nndir.el: * lisp/gnus/nndraft.el, lisp/gnus/nnfolder.el, lisp/gnus/nngateway.el: * lisp/gnus/nnmairix.el, lisp/gnus/nnmbox.el, lisp/gnus/nnmh.el: * lisp/gnus/nnml.el, lisp/gnus/score-mode.el, lisp/gnus/smiley.el: No need for cl.
153 lines
5 KiB
EmacsLisp
153 lines
5 KiB
EmacsLisp
;;; gnus-bcklg.el --- backlog functions for Gnus
|
|
|
|
;; Copyright (C) 1996-2018 Free Software Foundation, Inc.
|
|
|
|
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
|
|
;; Keywords: news
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
|
|
;;; Code:
|
|
|
|
(require 'gnus)
|
|
|
|
;;;
|
|
;;; Buffering of read articles.
|
|
;;;
|
|
|
|
(defvar gnus-backlog-buffer " *Gnus Backlog*")
|
|
(defvar gnus-backlog-articles nil)
|
|
(defvar gnus-backlog-hashtb nil)
|
|
|
|
(defun gnus-backlog-buffer ()
|
|
"Return the backlog buffer."
|
|
(or (get-buffer gnus-backlog-buffer)
|
|
(with-current-buffer (gnus-get-buffer-create gnus-backlog-buffer)
|
|
(buffer-disable-undo)
|
|
(setq buffer-read-only t)
|
|
(get-buffer gnus-backlog-buffer))))
|
|
|
|
(defun gnus-backlog-setup ()
|
|
"Initialize backlog variables."
|
|
(unless gnus-backlog-hashtb
|
|
(setq gnus-backlog-hashtb (gnus-make-hashtable 1024))))
|
|
|
|
(gnus-add-shutdown 'gnus-backlog-shutdown 'gnus)
|
|
|
|
(defun gnus-backlog-shutdown ()
|
|
"Clear all backlog variables and buffers."
|
|
(interactive)
|
|
(when (get-buffer gnus-backlog-buffer)
|
|
(gnus-kill-buffer gnus-backlog-buffer))
|
|
(setq gnus-backlog-hashtb nil
|
|
gnus-backlog-articles nil))
|
|
|
|
(defun gnus-backlog-enter-article (group number buffer)
|
|
(when (and (numberp number)
|
|
(not (gnus-virtual-group-p group)))
|
|
(gnus-backlog-setup)
|
|
(let ((ident (intern (concat group ":" (int-to-string number))
|
|
gnus-backlog-hashtb))
|
|
b)
|
|
(if (memq ident gnus-backlog-articles)
|
|
() ; It's already kept.
|
|
;; Remove the oldest article, if necessary.
|
|
(and (numberp gnus-keep-backlog)
|
|
(>= (length gnus-backlog-articles) gnus-keep-backlog)
|
|
(gnus-backlog-remove-oldest-article))
|
|
(push ident gnus-backlog-articles)
|
|
;; Insert the new article.
|
|
(with-current-buffer (gnus-backlog-buffer)
|
|
(let (buffer-read-only)
|
|
(goto-char (point-max))
|
|
(unless (bolp)
|
|
(insert "\n"))
|
|
(setq b (point))
|
|
(insert-buffer-substring buffer)
|
|
;; Tag the beginning of the article with the ident.
|
|
(if (> (point-max) b)
|
|
(put-text-property b (1+ b) 'gnus-backlog ident)
|
|
(gnus-error 3 "Article %d is blank" number))))))))
|
|
|
|
(defun gnus-backlog-remove-oldest-article ()
|
|
(with-current-buffer (gnus-backlog-buffer)
|
|
(goto-char (point-min))
|
|
(if (zerop (buffer-size))
|
|
() ; The buffer is empty.
|
|
(let ((ident (get-text-property (point) 'gnus-backlog))
|
|
buffer-read-only)
|
|
;; Remove the ident from the list of articles.
|
|
(when ident
|
|
(setq gnus-backlog-articles (delq ident gnus-backlog-articles)))
|
|
;; Delete the article itself.
|
|
(delete-region
|
|
(point) (next-single-property-change
|
|
(1+ (point)) 'gnus-backlog nil (point-max)))))))
|
|
|
|
(defun gnus-backlog-remove-article (group number)
|
|
"Remove article NUMBER in GROUP from the backlog."
|
|
(when (numberp number)
|
|
(gnus-backlog-setup)
|
|
(let ((ident (intern (concat group ":" (int-to-string number))
|
|
gnus-backlog-hashtb))
|
|
beg end)
|
|
(when (memq ident gnus-backlog-articles)
|
|
;; It was in the backlog.
|
|
(with-current-buffer (gnus-backlog-buffer)
|
|
(let (buffer-read-only)
|
|
(when (setq beg (text-property-any
|
|
(point-min) (point-max) 'gnus-backlog
|
|
ident))
|
|
;; Find the end (i. e., the beginning of the next article).
|
|
(setq end
|
|
(next-single-property-change
|
|
(1+ beg) 'gnus-backlog (current-buffer) (point-max)))
|
|
(delete-region beg end)
|
|
;; Return success.
|
|
t))
|
|
(setq gnus-backlog-articles (delq ident gnus-backlog-articles)))))))
|
|
|
|
(defun gnus-backlog-request-article (group number &optional buffer)
|
|
(when (and (numberp number)
|
|
(not (gnus-virtual-group-p group)))
|
|
(gnus-backlog-setup)
|
|
(let ((ident (intern (concat group ":" (int-to-string number))
|
|
gnus-backlog-hashtb))
|
|
beg end)
|
|
(when (memq ident gnus-backlog-articles)
|
|
;; It was in the backlog.
|
|
(with-current-buffer (gnus-backlog-buffer)
|
|
(if (not (setq beg (text-property-any
|
|
(point-min) (point-max) 'gnus-backlog
|
|
ident)))
|
|
;; It wasn't in the backlog after all.
|
|
(ignore
|
|
(setq gnus-backlog-articles (delq ident gnus-backlog-articles)))
|
|
;; Find the end (i. e., the beginning of the next article).
|
|
(setq end
|
|
(next-single-property-change
|
|
(1+ beg) 'gnus-backlog (current-buffer) (point-max)))))
|
|
(with-current-buffer (or buffer (current-buffer))
|
|
(let ((inhibit-read-only t))
|
|
(erase-buffer)
|
|
(insert-buffer-substring gnus-backlog-buffer beg end)))
|
|
t))))
|
|
|
|
(provide 'gnus-bcklg)
|
|
|
|
;;; gnus-bcklg.el ends here
|