annotate lisp/ibuf-macs.el @ 46205:6676ac71682b

Update mouse button info. Don't give the names of Emacs commands that the characters run. Clarify what SPC and DEL do. Clarify the description of the minibuffer. Wording change for completion. Explain Mouse-2 better.
author Richard M. Stallman <rms@gnu.org>
date Sun, 07 Jul 2002 11:31:31 +0000
parents 77b4e2d5f8dd
children c09fefd016a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
1 ;;; ibuf-macs.el --- macros for ibuffer
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
2
42770
a7530850a26c (toplevel): Require `cl' when compiling.
Colin Walters <walters@gnu.org>
parents: 42702
diff changeset
3 ;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
4
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
5 ;; Author: Colin Walters <walters@verbum.org>
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
6 ;; Created: 6 Dec 2001
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
7 ;; Keywords: buffer, convenience
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
8
44831
56a3e3132102 (ibuffer-save-marks): Call `ibuffer-redisplay-engine'.
Colin Walters <walters@gnu.org>
parents: 44573
diff changeset
9 ;; This file is part of GNU Emacs.
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
10
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
11 ;; This program is free software; you can redistribute it and/or
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
12 ;; modify it under the terms of the GNU General Public License as
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
13 ;; published by the Free Software Foundation; either version 2, or (at
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
14 ;; your option) any later version.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
15
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
16 ;; This program is distributed in the hope that it will be useful, but
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
19 ;; General Public License for more details.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
20
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
22 ;; along with this program ; see the file COPYING. If not, write to
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
23 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
24 ;; Boston, MA 02111-1307, USA.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
25
45078
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44831
diff changeset
26 ;;; Commentary:
829beb9a6a4b Follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 44831
diff changeset
27
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
28 ;;; Code:
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
29
42770
a7530850a26c (toplevel): Require `cl' when compiling.
Colin Walters <walters@gnu.org>
parents: 42702
diff changeset
30 (eval-when-compile
a7530850a26c (toplevel): Require `cl' when compiling.
Colin Walters <walters@gnu.org>
parents: 42702
diff changeset
31 (require 'cl))
a7530850a26c (toplevel): Require `cl' when compiling.
Colin Walters <walters@gnu.org>
parents: 42702
diff changeset
32
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
33 ;; From Paul Graham's "ANSI Common Lisp", adapted for Emacs Lisp here.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
34 (defmacro ibuffer-aif (test true-body &rest false-body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
35 "Evaluate TRUE-BODY or FALSE-BODY depending on value of TEST.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
36 If TEST returns non-nil, bind `it' to the value, and evaluate
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
37 TRUE-BODY. Otherwise, evaluate forms in FALSE-BODY as if in `progn'.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
38 Compare with `if'."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
39 (let ((sym (gensym "--ibuffer-aif-")))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
40 `(let ((,sym ,test))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
41 (if ,sym
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
42 (let ((it ,sym))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
43 ,true-body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
44 (progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
45 ,@false-body)))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
46 ;; (put 'ibuffer-aif 'lisp-indent-function 2)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
47
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
48 (defmacro ibuffer-awhen (test &rest body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
49 "Evaluate BODY if TEST returns non-nil.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
50 During evaluation of body, bind `it' to the value returned by TEST."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
51 `(ibuffer-aif ,test
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
52 (progn ,@body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
53 nil))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
54 ;; (put 'ibuffer-awhen 'lisp-indent-function 1)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
55
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
56 (defmacro ibuffer-save-marks (&rest body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
57 "Save the marked status of the buffers and execute BODY; restore marks."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
58 (let ((bufsym (gensym)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
59 `(let ((,bufsym (current-buffer))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
60 (ibuffer-save-marks-tmp-mark-list (ibuffer-current-state-list)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
61 (unwind-protect
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
62 (progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
63 (save-excursion
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
64 ,@body))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
65 (with-current-buffer ,bufsym
44831
56a3e3132102 (ibuffer-save-marks): Call `ibuffer-redisplay-engine'.
Colin Walters <walters@gnu.org>
parents: 44573
diff changeset
66 (ibuffer-redisplay-engine
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
67 ;; Get rid of dead buffers
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
68 (delq nil
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
69 (mapcar #'(lambda (e) (when (buffer-live-p (car e))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
70 e))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
71 ibuffer-save-marks-tmp-mark-list)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
72 (ibuffer-redisplay t))))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
73 ;; (put 'ibuffer-save-marks 'lisp-indent-function 0)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
74
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
75 ;;;###autoload
43103
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
76 (defmacro* define-ibuffer-column (symbol (&key name inline props
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
77 summarizer) &rest body)
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
78 "Define a column SYMBOL for use with `ibuffer-formats'.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
79
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
80 BODY will be called with `buffer' bound to the buffer object, and
45442
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
81 `mark' bound to the current mark on the buffer. The original ibuffer
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
82 buffer will be bound to `ibuffer-buf'.
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
83
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
84 If NAME is given, it will be used as a title for the column.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
85 Otherwise, the title will default to a capitalized version of the
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
86 SYMBOL's name. PROPS is a plist of additional properties to add to
43103
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
87 the text, such as `mouse-face'. And SUMMARIZER, if given, is a
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
88 function which will be passed a list of all the strings in its column;
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
89 it should return a string to display at the bottom.
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
90
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
91 Note that this macro expands into a `defun' for a function named
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
92 ibuffer-make-column-NAME. If INLINE is non-nil, then the form will be
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
93 inlined into the compiled format versions. This means that if you
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
94 change its definition, you should explicitly call
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
95 `ibuffer-recompile-formats'."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
96 (let* ((sym (intern (concat "ibuffer-make-column-"
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
97 (symbol-name symbol))))
43767
6bc5cbc8912d (define-ibuffer-column): Add :summarizer property.
Colin Walters <walters@gnu.org>
parents: 43103
diff changeset
98 (bod-1 `(with-current-buffer buffer
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
99 ,@body))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
100 (bod (if props
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
101 `(propertize
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
102 ,bod-1
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
103 ,@props)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
104 bod-1)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
105 `(progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
106 ,(if inline
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
107 `(push '(,sym ,bod) ibuffer-inline-columns)
45709
77b4e2d5f8dd (define-ibuffer-column): Don't create a third argument for the
Colin Walters <walters@gnu.org>
parents: 45442
diff changeset
108 `(defun ,sym (buffer mark)
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
109 ,bod))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
110 (put (quote ,sym) 'ibuffer-column-name
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
111 ,(if (stringp name)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
112 name
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
113 (capitalize (symbol-name symbol))))
43103
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
114 ,(if summarizer
43767
6bc5cbc8912d (define-ibuffer-column): Add :summarizer property.
Colin Walters <walters@gnu.org>
parents: 43103
diff changeset
115 ;; Store the name of the summarizing function.
43103
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
116 `(put (quote ,sym) 'ibuffer-column-summarizer
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
117 (quote ,summarizer)))
7f95aeaa47b3 (define-ibuffer-column): Add beginnings of support for a summary
Colin Walters <walters@gnu.org>
parents: 42770
diff changeset
118 ,(if summarizer
43767
6bc5cbc8912d (define-ibuffer-column): Add :summarizer property.
Colin Walters <walters@gnu.org>
parents: 43103
diff changeset
119 ;; This will store the actual values of the column
6bc5cbc8912d (define-ibuffer-column): Add :summarizer property.
Colin Walters <walters@gnu.org>
parents: 43103
diff changeset
120 ;; summary.
6bc5cbc8912d (define-ibuffer-column): Add :summarizer property.
Colin Walters <walters@gnu.org>
parents: 43103
diff changeset
121 `(put (quote ,sym) 'ibuffer-column-summary nil))
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
122 :autoload-end)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
123 ;; (put 'define-ibuffer-column 'lisp-indent-function 'defun)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
124
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
125 ;;;###autoload
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
126 (defmacro* define-ibuffer-sorter (name documentation
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
127 (&key
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
128 description)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
129 &rest body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
130 "Define a method of sorting named NAME.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
131 DOCUMENTATION is the documentation of the function, which will be called
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
132 `ibuffer-do-sort-by-NAME'.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
133 DESCRIPTION is a short string describing the sorting method.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
134
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
135 For sorting, the forms in BODY will be evaluated with `a' bound to one
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
136 buffer object, and `b' bound to another. BODY should return a non-nil
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
137 value if and only if `a' is \"less than\" `b'."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
138 `(progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
139 (defun ,(intern (concat "ibuffer-do-sort-by-" (symbol-name name))) ()
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
140 ,(or documentation "No :documentation specified for this sorting method.")
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
141 (interactive)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
142 (setq ibuffer-sorting-mode ',name)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
143 (ibuffer-redisplay t))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
144 (push (list ',name ,description
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
145 #'(lambda (a b)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
146 ,@body))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
147 ibuffer-sorting-functions-alist)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
148 :autoload-end))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
149 ;; (put 'define-ibuffer-sorter 'lisp-indent-function 1)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
150
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
151 ;;;###autoload
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
152 (defmacro* define-ibuffer-op (op args
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
153 documentation
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
154 (&key
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
155 interactive
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
156 mark
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
157 modifier-p
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
158 dangerous
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
159 (opstring "operated on")
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
160 (active-opstring "Operate on")
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
161 complex)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
162 &rest body)
45442
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
163 "Generate a function which operates on a buffer.
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
164 OP becomes the name of the function; if it doesn't begin with
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
165 `ibuffer-do-', then that is prepended to it.
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
166 When an operation is performed, this function will be called once for
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
167 each marked buffer, with that buffer current.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
168
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
169 ARGS becomes the formal parameters of the function.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
170 DOCUMENTATION becomes the docstring of the function.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
171 INTERACTIVE becomes the interactive specification of the function.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
172 MARK describes which type of mark (:deletion, or nil) this operation
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
173 uses. :deletion means the function operates on buffers marked for
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
174 deletion, otherwise it acts on normally marked buffers.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
175 MODIFIER-P describes how the function modifies buffers. This is used
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
176 to set the modification flag of the Ibuffer buffer itself. Valid
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
177 values are:
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
178 nil - the function never modifiers buffers
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
179 t - the function it always modifies buffers
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
180 :maybe - attempt to discover this information by comparing the
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
181 buffer's modification flag.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
182 DANGEROUS is a boolean which should be set if the user should be
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
183 prompted before performing this operation.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
184 OPSTRING is a string which will be displayed to the user after the
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
185 operation is complete, in the form:
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
186 \"Operation complete; OPSTRING x buffers\"
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
187 ACTIVE-OPSTRING is a string which will be displayed to the user in a
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
188 confirmation message, in the form:
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
189 \"Really ACTIVE-OPSTRING x buffers?\"
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
190 COMPLEX means this function is special; see the source code of this
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
191 macro for exactly what it does."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
192 `(progn
45442
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
193 (defun ,(intern (concat (if (string-match "^ibuffer-do" (symbol-name op))
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
194 "" "ibuffer-do-") (symbol-name op)))
5bc8bee6a228 (define-ibuffer-column): Add third argument `ibuffer-buf'.
Colin Walters <walters@gnu.org>
parents: 45078
diff changeset
195 ,args
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
196 ,(if (stringp documentation)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
197 documentation
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
198 (format "%s marked buffers." active-opstring))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
199 ,(if (not (null interactive))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
200 `(interactive ,interactive)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
201 '(interactive))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
202 (assert (eq major-mode 'ibuffer-mode))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
203 (setq ibuffer-did-modification nil)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
204 (let ((marked-names (,(case mark
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
205 (:deletion
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
206 'ibuffer-deletion-marked-buffer-names)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
207 (t
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
208 'ibuffer-marked-buffer-names)))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
209 (when (null marked-names)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
210 (setq marked-names (list (buffer-name (ibuffer-current-buffer))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
211 (ibuffer-set-mark ,(case mark
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
212 (:deletion
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
213 'ibuffer-deletion-char)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
214 (t
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
215 'ibuffer-marked-char))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
216 ,(let* ((finish (append
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
217 '(progn)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
218 (if (eq modifier-p t)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
219 '((setq ibuffer-did-modification t))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
220 ())
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
221 `((ibuffer-redisplay t)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
222 (message ,(concat "Operation finished; " opstring " %s buffers") count))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
223 (inner-body (if complex
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
224 `(progn ,@body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
225 `(progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
226 (with-current-buffer buf
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
227 (save-excursion
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
228 ,@body))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
229 t)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
230 (body `(let ((count
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
231 (,(case mark
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
232 (:deletion
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
233 'ibuffer-map-deletion-lines)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
234 (t
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
235 'ibuffer-map-marked-lines))
44573
3e16ea61b8c4 Update callers of `ibuffer-map-lines'.
Colin Walters <walters@gnu.org>
parents: 43767
diff changeset
236 #'(lambda (buf mark)
42702
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
237 ,(if (eq modifier-p :maybe)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
238 `(let ((ibuffer-tmp-previous-buffer-modification
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
239 (buffer-modified-p buf)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
240 (prog1 ,inner-body
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
241 (when (not (eq ibuffer-tmp-previous-buffer-modification
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
242 (buffer-modified-p buf)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
243 (setq ibuffer-did-modification t))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
244 inner-body)))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
245 ,finish)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
246 (if dangerous
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
247 `(when (ibuffer-confirm-operation-on ,active-opstring marked-names)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
248 ,body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
249 body))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
250 :autoload-end))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
251 ;; (put 'define-ibuffer-op 'lisp-indent-function 2)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
252
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
253 ;;;###autoload
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
254 (defmacro* define-ibuffer-filter (name documentation
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
255 (&key
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
256 reader
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
257 description)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
258 &rest body)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
259 "Define a filter named NAME.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
260 DOCUMENTATION is the documentation of the function.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
261 READER is a form which should read a qualifier from the user.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
262 DESCRIPTION is a short string describing the filter.
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
263
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
264 BODY should contain forms which will be evaluated to test whether or
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
265 not a particular buffer should be displayed or not. The forms in BODY
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
266 will be evaluated with BUF bound to the buffer object, and QUALIFIER
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
267 bound to the current value of the filter."
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
268 (let ((fn-name (intern (concat "ibuffer-filter-by-" (symbol-name name)))))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
269 `(progn
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
270 (defun ,fn-name (qualifier)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
271 ,(concat (or documentation "This filter is not documented."))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
272 (interactive (list ,reader))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
273 (ibuffer-push-filter (cons ',name qualifier))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
274 (message
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
275 (format ,(concat (format "Filter by %s added: " description)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
276 " %s")
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
277 qualifier))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
278 (ibuffer-update nil t))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
279 (push (list ',name ,description
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
280 #'(lambda (buf qualifier)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
281 ,@body))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
282 ibuffer-filtering-alist)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
283 :autoload-end)))
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
284 ;; (put 'define-ibuffer-filter 'lisp-indent-function 2)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
285
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
286 (provide 'ibuf-macs)
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
287
fb0b4579a45d Initial revision.
Colin Walters <walters@gnu.org>
parents:
diff changeset
288 ;;; ibuf-macs.el ends here