Mercurial > emacs
view lisp/gnus/gnus-demon.el @ 19660:fa3d4e7a76d9
(reftex-customize): Added call to customize browse.
(reftex-show-commentary): New function.
(reftex-label-alist): Prefix may contain % escapes. Nth macro
argument may be context. May give two different context methods.
(reftex-default-label-alist-entries): Customization type changed.
(reftex-label-menu-flags): Extra flag for searches.
(reftex-cite-format): Changed completely, % escapes are now used.
(reftex-comment-citations): New variable.
(reftex-cite-comment-format): New variable.
(reftex-cite-punctuation): New variable.
(reftex-make-master-buffer): Changed name of master buffer,
removed interactive. Runs a hook on the buffer. Interprete
TEXINPUTS environment variable. Allow naked argument for \input.
Master buffer is now in fundamental mode.
(reftex-access-scan-info): Name of master buffer changed.
(reftex-section-regexp): Is now computed from section levels,
not set independantly.
(reftex-section-levels): Made customizable.
(reftex-label): Interpret % escapes in prefix. Use label format if given.
(reftex-replace-prefix-escapes): New function.
(reftex-uniquify-label): New function.
(reftex-next-label-number): Function definition removed.
(reftex-reference): Use reftex-uniquify-label.
Allow more general label commands.
(reftex-offer-label-menu):
Interpret new flag in reftex-label-menu-flags.
(reftex-make-and-insert-label-list): Use text properties to record label index.
(reftex-find-nearby-label): Allow more general label commands.
(reftex-scan-buffer-for-labels): Allow more general label commands.
(reftex-init-section-numbers): New function.
(reftex-allow-for-ctrl-m): New function.
(reftex-label-info-update): Allow more general label commands.
(reftex-label-info): New parameter derive.
(reftex-short-context): Interprete integer parse as nth arg of macro.
(reftex-nth-parens-substring): New function.
(reftex-select-item): Interprete the new 'cnt text property.
(reftex-pop-to-label): Allow more general label commands.
(reftex-nicify-text): Allow more general label commands.
(reftex-toc): Remember previous window configuration. Use text
properties to store info. Bind mouse-2.
(reftex-make-master-buffer): New Hook.
(reftex-last-window-height): New variable.
(reftex-toc-show-help): New function.
(reftex-toc-help): New constant.
(reftex-nearest-section): Use text properties to store info.
(reftex-empty-toc-buffer): New function.
(reftex-re-enlarge): New function.
(reftex-toc-goto-line): New function.
(reftex-toc-mouse-goto-line-and-hide): New function.
(reftex-cite-format-builtin): New constant.
(reftex-cite-format-default): Constant removed.
(reftex-cite-format-1-author-simple): Constant removed.
(reftex-cite-format-2-authors): Constant removed.
(reftex-get-bib-names): New function.
(reftex-get-bib-authors) Function removed.
(reftex-format-bib-entry): Use now reftex-get-bib-names.
(reftex-citation): Completely rewritten. Offers selection of
different cite macros first, then the reference menu. Works with
the various new variables mentioned above. Accept the `a' key to
use all selected citations.
(reftex-insert-bib-matches): New function.
(reftex-format-citation): Now interpretes % escapes.
(reftex-select-item): Emulate a search in the menu buffer.
Interpret the 'cnt text property.
(reftex-view-crossref): Allow more general label, cite and ref macros.
(reftex-highlight-overlays): Add third overlay for search
in menu buffer.
(reftex-label-alist-builtin): xalignat and xxalignat environments
added. Slightly reorganized.
(reftex-reset-scanning-information): Just empty *toc* buffer, do
not kill it.
(reftex-compute-ref-cite-tables): Read the new options in
`reftex-label-alist' and store them. Calculate the section regexp.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Mon, 01 Sep 1997 18:11:35 +0000 |
parents | 8d840c4548c0 |
children | 5f1ab3dd344d |
line wrap: on
line source
;;; gnus-demon.el --- daemonic Gnus behaviour ;; Copyright (C) 1995,96,97 Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no> ;; 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 2, 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; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, ;; Boston, MA 02111-1307, USA. ;;; Commentary: ;;; Code: (eval-when-compile (require 'cl)) (require 'gnus) (require 'gnus-int) (require 'nnheader) (eval-and-compile (if (string-match "XEmacs" (emacs-version)) (require 'itimer) (require 'timer))) (defgroup gnus-demon nil "Demonic behaviour." :group 'gnus) (defcustom gnus-demon-handlers nil "Alist of daemonic handlers to be run at intervals. Each handler is a list on the form \(FUNCTION TIME IDLE) FUNCTION is the function to be called. TIME is the number of `gnus-demon-timestep's between each call. If nil, never call. If t, call each `gnus-demon-timestep'. If IDLE is t, only call if Emacs has been idle for a while. If IDLE is a number, only call when Emacs has been idle more than this number of `gnus-demon-timestep's. If IDLE is nil, don't care about idleness. If IDLE is a number and TIME is nil, then call once each time Emacs has been idle for IDLE `gnus-demon-timestep's." :group 'gnus-demon :type '(repeat (list function (choice :tag "Time" (const :tag "never" nil) (const :tag "one" t) (integer :tag "steps" 1)) (choice :tag "Idle" (const :tag "don't care" nil) (const :tag "for a while" t) (integer :tag "steps" 1))))) (defcustom gnus-demon-timestep 60 "*Number of seconds in each demon timestep." :group 'gnus-demon :type 'integer) ;;; Internal variables. (defvar gnus-demon-timer nil) (defvar gnus-demon-idle-has-been-called nil) (defvar gnus-demon-idle-time 0) (defvar gnus-demon-handler-state nil) (defvar gnus-demon-last-keys nil) (defvar gnus-inhibit-demon nil "*If non-nil, no daemonic function will be run.") (eval-and-compile (autoload 'timezone-parse-date "timezone") (autoload 'timezone-make-arpa-date "timezone")) ;;; Functions. (defun gnus-demon-add-handler (function time idle) "Add the handler FUNCTION to be run at TIME and IDLE." ;; First remove any old handlers that use this function. (gnus-demon-remove-handler function) ;; Then add the new one. (push (list function time idle) gnus-demon-handlers) (gnus-demon-init)) (defun gnus-demon-remove-handler (function &optional no-init) "Remove the handler FUNCTION from the list of handlers." (setq gnus-demon-handlers (delq (assq function gnus-demon-handlers) gnus-demon-handlers)) (unless no-init (gnus-demon-init))) (defun gnus-demon-init () "Initialize the Gnus daemon." (interactive) (gnus-demon-cancel) (if (null gnus-demon-handlers) () ; Nothing to do. ;; Set up timer. (setq gnus-demon-timer (nnheader-run-at-time gnus-demon-timestep gnus-demon-timestep 'gnus-demon)) ;; Reset control variables. (setq gnus-demon-handler-state (mapcar (lambda (handler) (list (car handler) (gnus-demon-time-to-step (nth 1 handler)) (nth 2 handler))) gnus-demon-handlers)) (setq gnus-demon-idle-time 0) (setq gnus-demon-idle-has-been-called nil) (setq gnus-use-demon t))) (gnus-add-shutdown 'gnus-demon-cancel 'gnus) (defun gnus-demon-cancel () "Cancel any Gnus daemons." (interactive) (when gnus-demon-timer (nnheader-cancel-timer gnus-demon-timer)) (setq gnus-demon-timer nil gnus-use-demon nil) (condition-case () (nnheader-cancel-function-timers 'gnus-demon) (error t))) (defun gnus-demon-is-idle-p () "Whether Emacs is idle or not." ;; We do this simply by comparing the 100 most recent keystrokes ;; with the ones we had last time. If they are the same, one might ;; guess that Emacs is indeed idle. This only makes sense if one ;; calls this function seldom -- like once a minute, which is what ;; we do here. (let ((keys (recent-keys))) (or (equal keys gnus-demon-last-keys) (progn (setq gnus-demon-last-keys keys) nil)))) (defun gnus-demon-time-to-step (time) "Find out how many seconds to TIME, which is on the form \"17:43\"." (if (not (stringp time)) time (let* ((date (current-time-string)) (dv (timezone-parse-date date)) (tdate (timezone-make-arpa-date (string-to-number (aref dv 0)) (string-to-number (aref dv 1)) (string-to-number (aref dv 2)) time (or (aref dv 4) "UT"))) (nseconds (gnus-time-minus (gnus-encode-date tdate) (gnus-encode-date date)))) (round (/ (+ (if (< (car nseconds) 0) 86400 0) (* 65536 (car nseconds)) (nth 1 nseconds)) gnus-demon-timestep))))) (defun gnus-demon () "The Gnus daemon that takes care of running all Gnus handlers." ;; Increase or reset the time Emacs has been idle. (if (gnus-demon-is-idle-p) (incf gnus-demon-idle-time) (setq gnus-demon-idle-time 0) (setq gnus-demon-idle-has-been-called nil)) ;; Disable all daemonic stuff if we're in the minibuffer (when (and (not (window-minibuffer-p (selected-window))) (not gnus-inhibit-demon)) ;; Then we go through all the handler and call those that are ;; sufficiently ripe. (let ((handlers gnus-demon-handler-state) (gnus-inhibit-demon t) handler time idle) (while handlers (setq handler (pop handlers)) (cond ((numberp (setq time (nth 1 handler))) ;; These handlers use a regular timeout mechanism. We decrease ;; the timer if it hasn't reached zero yet. (unless (zerop time) (setcar (nthcdr 1 handler) (decf time))) (and (zerop time) ; If the timer now is zero... ;; Test for appropriate idleness (progn (setq idle (nth 2 handler)) (cond ((null idle) t) ; Don't care about idle. ((numberp idle) ; Numerical idle... (< idle gnus-demon-idle-time)) ; Idle timed out. (t (< 0 gnus-demon-idle-time)))) ; Or just need to be idle. ;; So we call the handler. (progn (funcall (car handler)) ;; And reset the timer. (setcar (nthcdr 1 handler) (gnus-demon-time-to-step (nth 1 (assq (car handler) gnus-demon-handlers))))))) ;; These are only supposed to be called when Emacs is idle. ((null (setq idle (nth 2 handler))) ;; We do nothing. ) ((not (numberp idle)) ;; We want to call this handler each and every time that ;; Emacs is idle. (funcall (car handler))) (t ;; We want to call this handler only if Emacs has been idle ;; for a specified number of timesteps. (and (not (memq (car handler) gnus-demon-idle-has-been-called)) (< idle gnus-demon-idle-time) (progn (funcall (car handler)) ;; Make sure the handler won't be called once more in ;; this idle-cycle. (push (car handler) gnus-demon-idle-has-been-called))))))))) (defun gnus-demon-add-nocem () "Add daemonic NoCeM handling to Gnus." (gnus-demon-add-handler 'gnus-demon-scan-nocem 60 t)) (defun gnus-demon-scan-nocem () "Scan NoCeM groups for NoCeM messages." (save-window-excursion (gnus-nocem-scan-groups))) (defun gnus-demon-add-disconnection () "Add daemonic server disconnection to Gnus." (gnus-demon-add-handler 'gnus-demon-close-connections nil 30)) (defun gnus-demon-close-connections () (save-window-excursion (gnus-close-backends))) (defun gnus-demon-add-scanmail () "Add daemonic scanning of mail from the mail backends." (gnus-demon-add-handler 'gnus-demon-scan-mail 120 60)) (defun gnus-demon-scan-mail () (save-window-excursion (let ((servers gnus-opened-servers) server) (while (setq server (car (pop servers))) (and (gnus-check-backend-function 'request-scan (car server)) (or (gnus-server-opened server) (gnus-open-server server)) (gnus-request-scan nil server)))))) (defun gnus-demon-add-rescan () "Add daemonic scanning of new articles from all backends." (gnus-demon-add-handler 'gnus-demon-scan-news 120 60)) (defun gnus-demon-scan-news () (save-window-excursion (when (gnus-alive-p) (save-excursion (set-buffer gnus-group-buffer) (gnus-group-get-new-news))))) (defun gnus-demon-add-scan-timestamps () "Add daemonic updating of timestamps in empty newgroups." (gnus-demon-add-handler 'gnus-demon-scan-timestamps nil 30)) (defun gnus-demon-scan-timestamps () "Set the timestamp on all newsgroups with no unread and no ticked articles." (when (gnus-alive-p) (let ((cur-time (current-time)) (newsrc (cdr gnus-newsrc-alist)) info group unread has-ticked) (while (setq info (pop newsrc)) (setq group (gnus-info-group info) unread (gnus-group-unread group) has-ticked (cdr (assq 'tick (gnus-info-marks info)))) (when (and (numberp unread) (= unread 0) (not has-ticked)) (gnus-group-set-parameter group 'timestamp cur-time)))))) (provide 'gnus-demon) ;;; gnus-demon.el ends here