]> code.delx.au - gnu-emacs/blobdiff - lisp/ibuf-macs.el
(url-http-mark-connection-as-free, url-http-find-free-connection):
[gnu-emacs] / lisp / ibuf-macs.el
index 3e026de2a082f611f24595aa70458e561f57ef15..009935e153949bcb9744978ac704f442667d8734 100644 (file)
@@ -1,12 +1,14 @@
 ;;; ibuf-macs.el --- macros for ibuffer
 
-;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
+;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Colin Walters <walters@verbum.org>
+;; Maintainer: John Paul Wallington <jpw@gnu.org>
 ;; Created: 6 Dec 2001
 ;; Keywords: buffer, convenience
 
-;; This file is not currently part of GNU Emacs.
+;; This file is part of GNU Emacs.
 
 ;; This program is free software; you can redistribute it and/or
 ;; modify it under the terms of the GNU General Public License as
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with this program ; see the file COPYING.  If not, write to
-;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
 
 ;;; Code:
 
@@ -34,7 +38,7 @@
 If TEST returns non-nil, bind `it' to the value, and evaluate
 TRUE-BODY.  Otherwise, evaluate forms in FALSE-BODY as if in `progn'.
 Compare with `if'."
-  (let ((sym (gensym "--ibuffer-aif-")))
+  (let ((sym (make-symbol "ibuffer-aif-sym")))
     `(let ((,sym ,test))
        (if ,sym
           (let ((it ,sym))
@@ -53,7 +57,7 @@ During evaluation of body, bind `it' to the value returned by TEST."
 
 (defmacro ibuffer-save-marks (&rest body)
   "Save the marked status of the buffers and execute BODY; restore marks."
-  (let ((bufsym (gensym)))
+  (let ((bufsym (make-symbol "bufsym")))
     `(let ((,bufsym (current-buffer))
           (ibuffer-save-marks-tmp-mark-list (ibuffer-current-state-list)))
        (unwind-protect
@@ -61,7 +65,7 @@ During evaluation of body, bind `it' to the value returned by TEST."
             (save-excursion
               ,@body))
         (with-current-buffer ,bufsym
-          (ibuffer-insert-buffers-and-marks
+          (ibuffer-redisplay-engine
            ;; Get rid of dead buffers
            (delq nil
                  (mapcar #'(lambda (e) (when (buffer-live-p (car e))
@@ -71,23 +75,31 @@ During evaluation of body, bind `it' to the value returned by TEST."
 ;; (put 'ibuffer-save-marks 'lisp-indent-function 0)
 
 ;;;###autoload
-(defmacro* define-ibuffer-column (symbol (&key name inline props) &rest body)
+(defmacro* define-ibuffer-column (symbol (&key name inline props summarizer 
+                                              header-mouse-map) &rest body)
   "Define a column SYMBOL for use with `ibuffer-formats'.
 
 BODY will be called with `buffer' bound to the buffer object, and
-`mark' bound to the current mark on the buffer.  The current buffer
-will be `buffer'.
+`mark' bound to the current mark on the buffer.  The original ibuffer
+buffer will be bound to `ibuffer-buf'.
 
 If NAME is given, it will be used as a title for the column.
 Otherwise, the title will default to a capitalized version of the
 SYMBOL's name.  PROPS is a plist of additional properties to add to
-the text, such as `mouse-face'.
+the text, such as `mouse-face'.  And SUMMARIZER, if given, is a
+function which will be passed a list of all the strings in its column;
+it should return a string to display at the bottom.
+
+If HEADER-MOUSE-MAP is given, it will be used as a keymap for the
+title of the column.
 
 Note that this macro expands into a `defun' for a function named
 ibuffer-make-column-NAME.  If INLINE is non-nil, then the form will be
 inlined into the compiled format versions.  This means that if you
 change its definition, you should explicitly call
-`ibuffer-recompile-formats'."
+`ibuffer-recompile-formats'.
+
+\(fn SYMBOL (&key NAME INLINE PROPS SUMMARIZER) &rest BODY)"
   (let* ((sym (intern (concat "ibuffer-make-column-"
                              (symbol-name symbol))))
         (bod-1 `(with-current-buffer buffer
@@ -106,12 +118,21 @@ change its definition, you should explicitly call
            ,(if (stringp name)
                 name
               (capitalize (symbol-name symbol))))
+       ,(if header-mouse-map `(put (quote ,sym) 'header-mouse-map ,header-mouse-map))
+       ,(if summarizer
+           ;; Store the name of the summarizing function.
+           `(put (quote ,sym) 'ibuffer-column-summarizer
+                 (quote ,summarizer)))
+       ,(if summarizer
+           ;; This will store the actual values of the column
+           ;; summary.
+           `(put (quote ,sym) 'ibuffer-column-summary nil))
        :autoload-end)))
 ;; (put 'define-ibuffer-column 'lisp-indent-function 'defun)
 
 ;;;###autoload
 (defmacro* define-ibuffer-sorter (name documentation
-                                      (&key 
+                                      (&key
                                        description)
                                       &rest body)
   "Define a method of sorting named NAME.
@@ -121,7 +142,9 @@ DESCRIPTION is a short string describing the sorting method.
 
 For sorting, the forms in BODY will be evaluated with `a' bound to one
 buffer object, and `b' bound to another.  BODY should return a non-nil
-value if and only if `a' is \"less than\" `b'."
+value if and only if `a' is \"less than\" `b'.
+
+\(fn NAME DOCUMENTATION (&key DESCRIPTION) &rest BODY)"
   `(progn
      (defun ,(intern (concat "ibuffer-do-sort-by-" (symbol-name name))) ()
        ,(or documentation "No :documentation specified for this sorting method.")
@@ -138,7 +161,7 @@ value if and only if `a' is \"less than\" `b'."
 ;;;###autoload
 (defmacro* define-ibuffer-op (op args
                                 documentation
-                                (&key 
+                                (&key
                                  interactive
                                  mark
                                  modifier-p
@@ -147,7 +170,9 @@ value if and only if `a' is \"less than\" `b'."
                                  (active-opstring "Operate on")
                                  complex)
                                 &rest body)
-  "Generate a function named `ibuffer-do-OP', which operates on a buffer.
+  "Generate a function which operates on a buffer.
+OP becomes the name of the function; if it doesn't begin with
+`ibuffer-do-', then that is prepended to it.
 When an operation is performed, this function will be called once for
 each marked buffer, with that buffer current.
 
@@ -173,9 +198,13 @@ ACTIVE-OPSTRING is a string which will be displayed to the user in a
 confirmation message, in the form:
  \"Really ACTIVE-OPSTRING x buffers?\"
 COMPLEX means this function is special; see the source code of this
-macro for exactly what it does."
+macro for exactly what it does.
+
+\(fn OP ARGS DOCUMENTATION (&key INTERACTIVE MARK MODIFIER-P DANGEROUS OPSTRING ACTIVE-OPSTRING COMPLEX) &rest BODY)"
   `(progn
-    (defun ,(intern (concat "ibuffer-do-" (symbol-name op))) ,args
+    (defun ,(intern (concat (if (string-match "^ibuffer-do" (symbol-name op))
+                               "" "ibuffer-do-") (symbol-name op)))
+      ,args
      ,(if (stringp documentation)
          documentation
        (format "%s marked buffers." active-opstring))
@@ -216,7 +245,7 @@ macro for exactly what it does."
                                  'ibuffer-map-deletion-lines)
                                 (t
                                  'ibuffer-map-marked-lines))
-                             #'(lambda (buf mark beg end)
+                             #'(lambda (buf mark)
                                  ,(if (eq modifier-p :maybe)
                                       `(let ((ibuffer-tmp-previous-buffer-modification
                                               (buffer-modified-p buf)))
@@ -235,7 +264,7 @@ macro for exactly what it does."
 
 ;;;###autoload
 (defmacro* define-ibuffer-filter (name documentation
-                                      (&key 
+                                      (&key
                                        reader
                                        description)
                                       &rest body)
@@ -247,14 +276,16 @@ DESCRIPTION is a short string describing the filter.
 BODY should contain forms which will be evaluated to test whether or
 not a particular buffer should be displayed or not.  The forms in BODY
 will be evaluated with BUF bound to the buffer object, and QUALIFIER
-bound to the current value of the filter."
+bound to the current value of the filter.
+
+\(fn NAME DOCUMENTATION (&key READER DESCRIPTION) &rest BODY)"
   (let ((fn-name (intern (concat "ibuffer-filter-by-" (symbol-name name)))))
-    `(progn 
+    `(progn
        (defun ,fn-name (qualifier)
         ,(concat (or documentation "This filter is not documented."))
         (interactive (list ,reader))
         (ibuffer-push-filter (cons ',name qualifier))
-        (message
+        (message "%s"
          (format ,(concat (format "Filter by %s added: " description)
                           " %s")
                  qualifier))
@@ -268,4 +299,5 @@ bound to the current value of the filter."
 
 (provide 'ibuf-macs)
 
+;;; arch-tag: 2748edce-82c9-4cd9-9d9d-bd73e43c20c5
 ;;; ibuf-macs.el ends here