]> code.delx.au - gnu-emacs/blobdiff - lisp/gnus/gnus-salt.el
Merge from origin/emacs-25
[gnu-emacs] / lisp / gnus / gnus-salt.el
index 6b8e105e6b899580d87ee85cb7b1479fadfc9a3e..fc85bd69baf0faf40f5799824ea3cdcef7ce79d0 100644 (file)
@@ -1,6 +1,6 @@
 ;;; gnus-salt.el --- alternate summary mode interfaces for Gnus
 
-;; Copyright (C) 1996-1999, 2001-2013 Free Software Foundation, Inc.
+;; Copyright (C) 1996-1999, 2001-2016 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: news
@@ -25,9 +25,6 @@
 ;;; Code:
 
 (eval-when-compile (require 'cl))
-(eval-when-compile
-  (when (featurep 'xemacs)
-    (require 'easy-mmode))) ; for `define-minor-mode'
 
 (require 'gnus)
 (require 'gnus-sum)
@@ -47,9 +44,6 @@
   :type 'hook
   :group 'gnus-summary-pick)
 
-(when (featurep 'xemacs)
-  (add-hook 'gnus-pick-mode-hook 'gnus-xmas-pick-menu-add))
-
 (defcustom gnus-mark-unpicked-articles-as-read nil
   "*If non-nil, mark all unpicked articles as read."
   :type 'boolean
@@ -62,7 +56,7 @@
   :group 'gnus-summary-pick)
 
 (defcustom gnus-summary-pick-line-format
-  "%-5P %U\%R\%z\%I\%(%[%4L: %-23,23n%]%) %s\n"
+  "%-5P %U\ %R\ %z\ %I\ %(%[%4L: %-23,23n%]%) %s\n"
   "*The format specification of the lines in pick buffers.
 It accepts the same format specs that `gnus-summary-line-format' does."
   :type 'string
@@ -76,7 +70,7 @@ It accepts the same format specs that `gnus-summary-line-format' does."
       " " gnus-pick-next-page
       "u" gnus-pick-unmark-article-or-thread
       "." gnus-pick-article-or-thread
-      gnus-down-mouse-2 gnus-pick-mouse-pick-region
+      [down-mouse-2] gnus-pick-mouse-pick-region
       "\r" gnus-pick-start-reading)
     map))
 
@@ -100,11 +94,6 @@ It accepts the same format specs that `gnus-summary-line-format' does."
        ["Start reading" gnus-pick-start-reading t]
        ["Switch pick mode off" gnus-pick-mode gnus-pick-mode]))))
 
-(eval-when-compile
-  (when (featurep 'xemacs)
-    (defvar gnus-pick-mode-on-hook)
-    (defvar gnus-pick-mode-off-hook)))
-
 (define-minor-mode gnus-pick-mode
   "Minor mode for providing a pick-and-read interface in Gnus summary buffers.
 
@@ -229,7 +218,7 @@ This must be bound to a button-down mouse event."
         (start-point (posn-point start-posn))
          (start-line (1+ (count-lines (point-min) start-point)))
         (start-window (posn-window start-posn))
-        (bounds (gnus-window-edges start-window))
+        (bounds (window-edges start-window))
         (top (nth 1 bounds))
         (bottom (if (window-minibuffer-p start-window)
                     (nth 3 bounds)
@@ -292,22 +281,25 @@ This must be bound to a button-down mouse event."
                  (mouse-scroll-subr start-window
                                     (1+ (- mouse-row bottom)))))))))))
       (when (consp event)
-       (let ((fun (key-binding (vector (car event)))))
+       (let (;; (fun (key-binding (vector (car event))))
+              )
          ;; Run the binding of the terminating up-event, if possible.
-       ;; In the case of a multiple click, it gives the wrong results,
+          ;; In the case of a multiple click, it gives the wrong results,
          ;; because it would fail to set up a region.
          (when nil
-      ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
-       ;; In this case, we can just let the up-event execute normally.
+            ;; (and (= (mod mouse-selection-click-count 3) 0) (fboundp fun))
+            ;; In this case, we can just let the up-event execute normally.
            (let ((end (event-end event)))
              ;; Set the position in the event before we replay it,
              ;; because otherwise it may have a position in the wrong
              ;; buffer.
              (setcar (cdr end) end-of-range)
              ;; Delete the overlay before calling the function,
-            ;; because delete-overlay increases buffer-modified-tick.
+              ;; because delete-overlay increases buffer-modified-tick.
              (push event unread-command-events))))))))
 
+(defvar scroll-in-place)
+
 (defun gnus-pick-next-page ()
   "Go to the next page.  If at the end of the buffer, start reading articles."
   (interactive)
@@ -336,11 +328,6 @@ This must be bound to a button-down mouse event."
       '("Pick"
        ["Switch binary mode off" gnus-binary-mode t]))))
 
-(eval-when-compile
-  (when (featurep 'xemacs)
-    (defvar gnus-binary-mode-on-hook)
-    (defvar gnus-binary-mode-off-hook)))
-
 (define-minor-mode gnus-binary-mode
   "Minor mode for providing a binary group interface in Gnus summary buffers."
   :lighter " Binary" :keymap gnus-binary-mode-map
@@ -356,7 +343,7 @@ This must be bound to a button-down mouse event."
     (when (gnus-visual-p 'binary-menu 'menu)
       (gnus-binary-make-menu-bar)))))
 
-(defun gnus-binary-display-article (article &optional all-header)
+(defun gnus-binary-display-article (article &optional _all-header)
   "Run ARTICLE through the binary decode functions."
   (when (gnus-summary-goto-subject article)
     (let ((gnus-view-pseudos (or gnus-view-pseudos 'automatic)))
@@ -416,13 +403,15 @@ Two predefined functions are available:
   :type 'hook
   :group 'gnus-summary-tree)
 
-(when (featurep 'xemacs)
-  (add-hook 'gnus-tree-mode-hook 'gnus-xmas-tree-menu-add)
-  (add-hook 'gnus-tree-mode-hook 'gnus-xmas-switch-horizontal-scrollbar-off))
-
-
 ;;; Internal variables.
 
+(defvar gnus-tmp-name)
+(defvar gnus-tmp-from)
+(defvar gnus-tmp-number)
+(defvar gnus-tmp-open-bracket)
+(defvar gnus-tmp-close-bracket)
+(defvar gnus-tmp-subject)
+
 (defvar gnus-tree-line-format-alist
   `((?n gnus-tmp-name ?s)
     (?f gnus-tmp-from ?s)
@@ -442,23 +431,23 @@ Two predefined functions are available:
 (defvar gnus-tree-displayed-thread nil)
 (defvar gnus-tree-inhibit nil)
 
-(defvar gnus-tree-mode-map nil)
-(put 'gnus-tree-mode 'mode-class 'special)
+(defvar gnus-tree-mode-map
+  (let ((map (make-keymap)))
+    (suppress-keymap map)
+    (gnus-define-keys
+        map
+      "\r" gnus-tree-select-article
+      [mouse-2] gnus-tree-pick-article
+      "\C-?" gnus-tree-read-summary-keys
+      "h" gnus-tree-show-summary
 
-(unless gnus-tree-mode-map
-  (setq gnus-tree-mode-map (make-keymap))
-  (suppress-keymap gnus-tree-mode-map)
-  (gnus-define-keys
-      gnus-tree-mode-map
-    "\r" gnus-tree-select-article
-    gnus-mouse-2 gnus-tree-pick-article
-    "\C-?" gnus-tree-read-summary-keys
-    "h" gnus-tree-show-summary
+      "\C-c\C-i" gnus-info-find-node)
 
-    "\C-c\C-i" gnus-info-find-node)
+    (substitute-key-definition
+     'undefined 'gnus-tree-read-summary-keys map)
+    map))
 
-  (substitute-key-definition
-   'undefined 'gnus-tree-read-summary-keys gnus-tree-mode-map))
+(put 'gnus-tree-mode 'mode-class 'special)
 
 (defun gnus-tree-make-menu-bar ()
   (unless (boundp 'gnus-tree-menu)
@@ -467,26 +456,20 @@ Two predefined functions are available:
       '("Tree"
        ["Select article" gnus-tree-select-article t]))))
 
-(defun gnus-tree-mode ()
+(define-derived-mode gnus-tree-mode fundamental-mode "Tree"
   "Major mode for displaying thread trees."
-  (interactive)
   (gnus-set-format 'tree-mode)
   (gnus-set-format 'tree t)
   (when (gnus-visual-p 'tree-menu 'menu)
     (gnus-tree-make-menu-bar))
-  (kill-all-local-variables)
   (gnus-simplify-mode-line)
-  (setq mode-name "Tree")
-  (setq major-mode 'gnus-tree-mode)
-  (use-local-map gnus-tree-mode-map)
   (buffer-disable-undo)
   (setq buffer-read-only t)
   (setq truncate-lines t)
-  (save-excursion
+  (save-current-buffer
     (gnus-set-work-buffer)
     (gnus-tree-node-insert (make-mail-header "") nil)
-    (setq gnus-tree-node-length (1- (point))))
-  (gnus-run-mode-hooks 'gnus-tree-mode-hook))
+    (setq gnus-tree-node-length (1- (point)))))
 
 (defun gnus-tree-read-summary-keys (&optional arg)
   "Read a summary buffer key sequence and execute it."
@@ -500,7 +483,7 @@ Two predefined functions are available:
       (when (setq win (get-buffer-window buf))
        (select-window win)
        (when gnus-selected-tree-overlay
-         (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1)))
+         (goto-char (or (overlay-end gnus-selected-tree-overlay) 1)))
        (gnus-tree-minimize)))))
 
 (defun gnus-tree-show-summary ()
@@ -543,7 +526,7 @@ Two predefined functions are available:
     (when tree-window
       (select-window tree-window)
       (when gnus-selected-tree-overlay
-       (goto-char (or (gnus-overlay-end gnus-selected-tree-overlay) 1)))
+       (goto-char (or (overlay-end gnus-selected-tree-overlay) 1)))
       (let* ((top (cond ((< (window-height) 4) 0)
                        ((< (window-height) 7) 1)
                        (t 2)))
@@ -562,7 +545,7 @@ Two predefined functions are available:
 (defun gnus-get-tree-buffer ()
   "Return the tree buffer properly initialized."
   (with-current-buffer (gnus-get-buffer-create gnus-tree-buffer)
-    (unless (eq major-mode 'gnus-tree-mode)
+    (unless (derived-mode-p 'gnus-tree-mode)
       (gnus-tree-mode))
     (current-buffer)))
 
@@ -571,7 +554,7 @@ Two predefined functions are available:
             (not (one-window-p)))
     (let ((windows 0)
          tot-win-height)
-      (walk-windows (lambda (window) (incf windows)))
+      (walk-windows (lambda (_window) (incf windows)))
       (setq tot-win-height
            (- (frame-height)
               (* window-min-height (1- windows))
@@ -635,30 +618,48 @@ Two predefined functions are available:
                (t (cdar gnus-tree-brackets))))
         (buffer-read-only nil)
         beg end)
-    (gnus-add-text-properties
+    (add-text-properties
      (setq beg (point))
      (setq end (progn (eval gnus-tree-line-format-spec) (point)))
      (list 'gnus-number gnus-tmp-number))
     (when (or t (gnus-visual-p 'tree-highlight 'highlight))
       (gnus-tree-highlight-node gnus-tmp-number beg end))))
 
+(defmacro gnus--let-eval (bindings evalsym &rest body)
+  "Build an environment in which to evaluate expressions.
+BINDINGS is a `let'-style list of bindings to use for the environment.
+EVALSYM is then bound in BODY to a function that takes a sexp and evaluates
+it in the environment specified by BINDINGS."
+  (declare (indent 2) (debug ((&rest (sym form)) sym body)))
+  (if (ignore-errors (let ((x 3)) (eq (eval '(- x 1) '((x . 4))) x)))
+      ;; Use lexical vars if possible.
+      `(let* ((env (list ,@(mapcar (lambda (binding)
+                                     `(cons ',(car binding) ,(cadr binding)))
+                                   bindings)))
+             (,evalsym (lambda (exp) (eval exp env))))
+         ,@body)
+    `(let (,@bindings (,evalsym #'eval)) ,@body)))
+
 (defun gnus-tree-highlight-node (article beg end)
   "Highlight current line according to `gnus-summary-highlight'."
   (let ((list gnus-summary-highlight)
        face)
     (with-current-buffer gnus-summary-buffer
-      (let* ((score (or (cdr (assq article gnus-newsgroup-scored))
+      (let ((uncached (memq article gnus-newsgroup-undownloaded)))
+        (gnus--let-eval
+            ((score (or (cdr (assq article gnus-newsgroup-scored))
                        gnus-summary-default-score 0))
             (default gnus-summary-default-score)
             (default-high gnus-summary-default-high-score)
             (default-low gnus-summary-default-low-score)
-             (uncached (memq article gnus-newsgroup-undownloaded))
+             (uncached uncached)
              (downloaded (not uncached))
             (mark (or (gnus-summary-article-mark article) gnus-unread-mark)))
-       ;; Eval the cars of the lists until we find a match.
-       (while (and list
-                   (not (eval (caar list))))
-         (setq list (cdr list)))))
+            evalfun
+          ;; Eval the cars of the lists until we find a match.
+          (while (and list
+                      (not (funcall evalfun (caar list))))
+            (setq list (cdr list))))))
     (unless (eq (setq face (cdar list)) (gnus-get-text-property-excluding-characters-with-faces beg 'face))
       (gnus-put-text-property-excluding-characters-with-faces
        beg end 'face
@@ -814,10 +815,10 @@ Two predefined functions are available:
          (gnus-generate-tree top)
          (setq gnus-tree-displayed-thread top))))))
 
-(defun gnus-tree-open (group)
+(defun gnus-tree-open ()
   (gnus-get-tree-buffer))
 
-(defun gnus-tree-close (group)
+(defun gnus-tree-close ()
   (gnus-kill-buffer gnus-tree-buffer))
 
 (defun gnus-tree-perhaps-minimize ()
@@ -833,15 +834,14 @@ Two predefined functions are available:
          region)
       (set-buffer gnus-tree-buffer)
       (when (setq region (gnus-tree-article-region article))
-       (when (or (not gnus-selected-tree-overlay)
-                 (gnus-extent-detached-p gnus-selected-tree-overlay))
+       (when (not gnus-selected-tree-overlay)
          ;; Create a new overlay.
-         (gnus-overlay-put
+         (overlay-put
           (setq gnus-selected-tree-overlay
-                (gnus-make-overlay (point-min) (1+ (point-min))))
+                (make-overlay (point-min) (1+ (point-min))))
           'face gnus-selected-tree-face))
        ;; Move the overlay to the article.
-       (gnus-move-overlay
+       (move-overlay
         gnus-selected-tree-overlay (goto-char (car region)) (cdr region))
        (gnus-tree-minimize)
        (gnus-tree-recenter)
@@ -857,15 +857,15 @@ Two predefined functions are available:
       (set-buffer buf))))
 
 (defun gnus-tree-highlight-article (article face)
-  (with-current-buffer (gnus-get-tree-buffer)
-    (let (region)
-      (when (setq region (gnus-tree-article-region article))
-       (gnus-put-text-property (car region) (cdr region) 'face face)
-       (set-window-point
-        (gnus-get-buffer-window (current-buffer) t) (cdr region))))))
-
-;;; Allow redefinition of functions.
-(gnus-ems-redefine)
+  ;; The save-excursion here is apparently necessary because
+  ;; `set-window-point' somehow manages to alter the buffer position.
+  (save-excursion
+    (with-current-buffer (gnus-get-tree-buffer)
+      (let (region)
+       (when (setq region (gnus-tree-article-region article))
+         (put-text-property (car region) (cdr region) 'face face)
+         (set-window-point
+          (gnus-get-buffer-window (current-buffer) t) (cdr region)))))))
 
 (provide 'gnus-salt)