comparison lisp/ibuf-ext.el @ 44855:663ebf8868d8

(ibuffer-filtering-groups): Renamed to `ibuffer-filter-groups'. All users updated. (ibuffer-show-empty-filter-groups): New variable. (ibuffer-saved-filter-groups): New variable. (ibuffer-maybe-save-stuff): Renamed from `ibuffer-maybe-save-saved-filters'. Callers updated. Handle `ibuffer-saved-filter-groups'. (ibuffer-hidden-filtering-groups): Renamed to `ibuffer-hidden-filter-groups'. (ibuffer-filter-group-kill-ring): New variable. (ibuffer-save-with-custom): Doc fix. (ibuffer-set-filter-groups-by-mode): New function. (ibuffer-clear-filter-groups): New function. (ibuffer-current-filter-groups-with-position): Renamed from `ibuffer-current-filter-groups'. Callers updated. (ibuffer-kill-filter-group): New function. (ibuffer-kill-line): New function. (ibuffer-yank): New function. (ibuffer-save-filter-groups): New function. (ibuffer-delete-saved-filter-groups): New function. (ibuffer-switch-to-saved-filter-groups): New function. (ibuffer-mark-on-buffer): Add optional arguments for adding a specific mark, and marking on a specific group.
author Colin Walters <walters@gnu.org>
date Thu, 25 Apr 2002 19:03:55 +0000
parents 771798f69a5c
children 15b639b48157
comparison
equal deleted inserted replaced
44854:6cd35f994b33 44855:663ebf8868d8
144 :group 'ibuffer) 144 :group 'ibuffer)
145 145
146 (defvar ibuffer-cached-filter-formats nil) 146 (defvar ibuffer-cached-filter-formats nil)
147 (defvar ibuffer-compiled-filter-formats nil) 147 (defvar ibuffer-compiled-filter-formats nil)
148 148
149 (defvar ibuffer-filtering-groups nil 149 (defvar ibuffer-filter-groups nil
150 "A list like ((\"NAME\" ((SYMBOL . QUALIFIER) ...) ...) which groups buffers. 150 "A list like ((\"NAME\" ((SYMBOL . QUALIFIER) ...) ...) which groups buffers.
151 See also `ibuffer-filtering-alist'.") 151 The SYMBOL should be one from `ibuffer-filtering-alist'.
152 152 The QUALIFIER should be the same as QUALIFIER in
153 (defvar ibuffer-hidden-filtering-groups nil 153 `ibuffer-filtering-qualifiers'.")
154
155 (defcustom ibuffer-show-empty-filter-groups t
156 "If non-nil, then show the names of filter groups which are empty."
157 :type 'boolean
158 :group 'ibuffer)
159
160 (defcustom ibuffer-saved-filter-groups
161 '(("gnus"
162 ((or (mode . message-mode)
163 (mode . mail-mode)
164 (mode . gnus-group-mode)
165 (mode . gnus-summary-mode)
166 (mode . gnus-article-mode))))
167 ("programming"
168 ((or (mode . emacs-lisp-mode)
169 (mode . cperl-mode)
170 (mode . c-mode)
171 (mode . java-mode)
172 (mode . idl-mode)
173 (mode . lisp-mode)))))
174
175 "An alist of filtering groups to switch between.
176
177 This variable should look like ((\"STRING\" QUALIFIERS)
178 (\"STRING\" QUALIFIERS) ...), where
179 QUALIFIERS is a list of the same form as
180 `ibuffer-filtering-qualifiers'.
181
182 See also the variables `ibuffer-filter-groups',
183 `ibuffer-filtering-qualifiers', `ibuffer-filtering-alist', and the
184 functions `ibuffer-switch-to-saved-filter-group',
185 `ibuffer-save-filter-group'."
186 :type '(repeat sexp)
187 :group 'ibuffer)
188
189 (defvar ibuffer-hidden-filter-groups nil
154 "A list of filtering groups which are currently hidden.") 190 "A list of filtering groups which are currently hidden.")
191
192 (defvar ibuffer-filter-group-kill-ring nil)
155 193
156 (defcustom ibuffer-old-time 72 194 (defcustom ibuffer-old-time 72
157 "The number of hours before a buffer is considered \"old\"." 195 "The number of hours before a buffer is considered \"old\"."
158 :type '(choice (const :tag "72 hours (3 days)" 72) 196 :type '(choice (const :tag "72 hours (3 days)" 72)
159 (const :tag "48 hours (2 days)" 48) 197 (const :tag "48 hours (2 days)" 48)
161 (integer :tag "hours")) 199 (integer :tag "hours"))
162 :group 'ibuffer) 200 :group 'ibuffer)
163 201
164 (defcustom ibuffer-save-with-custom t 202 (defcustom ibuffer-save-with-custom t
165 "If non-nil, then use Custom to save interactively changed variables. 203 "If non-nil, then use Custom to save interactively changed variables.
166 Currently, this only applies to `ibuffer-saved-filters'." 204 Currently, this only applies to `ibuffer-saved-filters' and
205 `ibuffer-saved-filter-groups."
167 :type 'boolean 206 :type 'boolean
168 :group 'ibuffer) 207 :group 'ibuffer)
169 208
170 (defun ibuffer-ext-visible-p (buf all &optional ibuffer-buf) 209 (defun ibuffer-ext-visible-p (buf all &optional ibuffer-buf)
171 (or 210 (or
251 290
252 (defun ibuffer-toggle-filter-group-1 (posn) 291 (defun ibuffer-toggle-filter-group-1 (posn)
253 (let ((name (get-text-property posn 'ibuffer-filter-group-name))) 292 (let ((name (get-text-property posn 'ibuffer-filter-group-name)))
254 (unless (stringp name) 293 (unless (stringp name)
255 (error "No filtering group name present")) 294 (error "No filtering group name present"))
256 (if (member name ibuffer-hidden-filtering-groups) 295 (if (member name ibuffer-hidden-filter-groups)
257 (setq ibuffer-hidden-filtering-groups 296 (setq ibuffer-hidden-filter-groups
258 (delete name ibuffer-hidden-filtering-groups)) 297 (delete name ibuffer-hidden-filter-groups))
259 (push name ibuffer-hidden-filtering-groups)) 298 (push name ibuffer-hidden-filter-groups))
260 (ibuffer-update nil t))) 299 (ibuffer-update nil t)))
261 300
262 ;;;###autoload 301 ;;;###autoload
263 (defun ibuffer-forward-filter-group (&optional count) 302 (defun ibuffer-forward-filter-group (&optional count)
264 "Move point forwards by COUNT filtering groups." 303 "Move point forwards by COUNT filtering groups."
476 (funcall (caddr filterdat) 515 (funcall (caddr filterdat)
477 buf 516 buf
478 (cdr filter)))))))))) 517 (cdr filter))))))))))
479 518
480 (defun ibuffer-generate-filter-groups (bmarklist) 519 (defun ibuffer-generate-filter-groups (bmarklist)
481 (let ((filtering-group-alist (append ibuffer-filtering-groups 520 (let ((filter-group-alist (append ibuffer-filter-groups
482 (list (cons "Default" nil))))) 521 (list (cons "Default" nil)))))
483 ;; (dolist (hidden ibuffer-hidden-filtering-groups) 522 ;; (dolist (hidden ibuffer-hidden-filter-groups)
484 ;; (setq filtering-group-alist (ibuffer-delete-alist 523 ;; (setq filter-group-alist (ibuffer-delete-alist
485 ;; hidden filtering-group-alist))) 524 ;; hidden filter-group-alist)))
486 (let ((vec (make-vector (length filtering-group-alist) nil)) 525 (let ((vec (make-vector (length filter-group-alist) nil))
487 (i 0)) 526 (i 0))
488 (dolist (filtergroup filtering-group-alist) 527 (dolist (filtergroup filter-group-alist)
489 (let ((filterset (cdr filtergroup))) 528 (let ((filterset (cdr filtergroup)))
490 (multiple-value-bind (hip-crowd lamers) 529 (multiple-value-bind (hip-crowd lamers)
491 (ibuffer-split-list (lambda (bufmark) 530 (ibuffer-split-list (lambda (bufmark)
492 (ibuffer-included-in-filters-p (car bufmark) 531 (ibuffer-included-in-filters-p (car bufmark)
493 filterset)) 532 filterset))
495 (aset vec i hip-crowd) 534 (aset vec i hip-crowd)
496 (incf i) 535 (incf i)
497 (setq bmarklist lamers)))) 536 (setq bmarklist lamers))))
498 (let ((ret nil)) 537 (let ((ret nil))
499 (dotimes (j i ret) 538 (dotimes (j i ret)
500 (push (cons (car (nth j filtering-group-alist)) 539 (push (cons (car (nth j filter-group-alist))
501 (aref vec j)) 540 (aref vec j))
502 ret)))))) 541 ret))))))
503 542
504 ;;;###autoload 543 ;;;###autoload
505 (defun ibuffer-filters-to-filter-group (name) 544 (defun ibuffer-filters-to-filter-group (name)
506 "Make the current filters into a filtering group." 545 "Make the current filters into a filtering group."
507 (interactive "sName for filtering group: ") 546 (interactive "sName for filtering group: ")
508 (when (null ibuffer-filtering-qualifiers) 547 (when (null ibuffer-filtering-qualifiers)
509 (error "No filters in effect")) 548 (error "No filters in effect"))
510 (push (cons name ibuffer-filtering-qualifiers) ibuffer-filtering-groups) 549 (push (cons name ibuffer-filtering-qualifiers) ibuffer-filter-groups)
511 (ibuffer-filter-disable)) 550 (ibuffer-filter-disable))
551
552 ;;;###autoload
553 (defun ibuffer-set-filter-groups-by-mode ()
554 "Set the current filter groups to filter by mode."
555 (interactive)
556 (setq ibuffer-filter-groups
557 (mapcar (lambda (mode)
558 (cons (format "%s" mode) `((mode . ,mode))))
559 (delete-duplicates
560 (mapcar (lambda (buf) (with-current-buffer buf major-mode))
561 (buffer-list)))))
562 (ibuffer-update nil t))
512 563
513 ;;;###autoload 564 ;;;###autoload
514 (defun ibuffer-pop-filter-group () 565 (defun ibuffer-pop-filter-group ()
515 "Remove the first filtering group." 566 "Remove the first filtering group."
516 (interactive) 567 (interactive)
517 (when (null ibuffer-filtering-groups) 568 (when (null ibuffer-filter-groups)
518 (error "No filtering groups active")) 569 (error "No filtering groups active"))
519 (pop ibuffer-filtering-groups) 570 (pop ibuffer-filter-groups)
520 (ibuffer-update nil t)) 571 (ibuffer-update nil t))
572
573 ;;;###autoload
574 (defun ibuffer-clear-filter-groups ()
575 "Remove all filtering groups."
576 (interactive)
577 (setq ibuffer-filter-groups nil)
578 (ibuffer-update nil t))
579
580 (defun ibuffer-current-filter-groups-with-position ()
581 (save-excursion
582 (goto-char (point-min))
583 (let ((pos nil)
584 (result nil))
585 (while (and (not (eobp))
586 (setq pos (next-single-property-change
587 (point) 'ibuffer-filter-group-name)))
588 (goto-char pos)
589 (push (cons (get-text-property (point) 'ibuffer-filter-group-name)
590 pos)
591 result)
592 (goto-char (next-single-property-change
593 pos 'ibuffer-filter-group-name)))
594 (nreverse result))))
521 595
522 ;;;###autoload 596 ;;;###autoload
523 (defun ibuffer-jump-to-filter-group (name) 597 (defun ibuffer-jump-to-filter-group (name)
524 "Move point to the filter group whose name is NAME." 598 "Move point to the filter group whose name is NAME."
525 (interactive (list nil)) 599 (interactive (list nil))
526 (let ((table (ibuffer-current-filter-groups))) 600 (let ((table (ibuffer-current-filter-groups-with-position)))
527 (when (interactive-p) 601 (when (interactive-p)
528 (setq name (completing-read "Jump to filter group: " table nil t))) 602 (setq name (completing-read "Jump to filter group: " table nil t)))
529 (ibuffer-aif (assoc name table) 603 (ibuffer-aif (assoc name table)
530 (goto-char (cdr it)) 604 (goto-char (cdr it))
531 (error "No filter group with name %s" name)))) 605 (error "No filter group with name %s" name))))
606
607 ;;;###autoload
608 (defun ibuffer-kill-filter-group (name)
609 "Delete the filtering group named NAME."
610 (interactive (list nil))
611 (when (interactive-p)
612 (setq name (completing-read "Kill filter group: "
613 ibuffer-filter-groups nil t)))
614 (ibuffer-aif (assoc name ibuffer-filter-groups)
615 (setq ibuffer-filter-groups (ibuffer-delete-alist
616 name ibuffer-filter-groups))
617 (error "No filter group with name \"%s\"" name))
618 (ibuffer-update nil t))
619
620 ;;;###autoload
621 (defun ibuffer-kill-line (&optional arg)
622 (interactive "P")
623 (ibuffer-aif (save-excursion
624 (ibuffer-forward-line 0)
625 (get-text-property (point) 'ibuffer-filter-group-name))
626 (progn
627 (when (equal it "Default")
628 (error "Can't kill default filtering group"))
629 (push (assoc it ibuffer-filter-groups) ibuffer-filter-group-kill-ring)
630 (ibuffer-kill-filter-group it))
631 (funcall (if (interactive-p) #'call-interactively #'funcall)
632 #'kill-line arg)))
633
634 ;;;###autoload
635 (defun ibuffer-yank (&optional arg)
636 (interactive "P")
637 (unless ibuffer-filter-group-kill-ring
638 (error "ibuffer-filter-group-kill-ring is empty"))
639 (save-excursion
640 (ibuffer-forward-line 0)
641 (let* ((last-killed (pop ibuffer-filter-group-kill-ring))
642 (all-groups ibuffer-filter-groups)
643 (cur (or (get-text-property (point) 'ibuffer-filter-group-name)
644 (get-text-property (point) 'ibuffer-filter-group)
645 (last all-groups)))
646 (pos (or (position cur (mapcar #'car all-groups) :test #'equal)
647 (1- (length all-groups)))))
648 (cond ((= pos 0)
649 (push last-killed ibuffer-filter-groups))
650 ((= pos (1- (length all-groups)))
651 (nconc ibuffer-filter-groups (list last-killed)))
652 (t
653 (let ((cell (nthcdr pos ibuffer-filter-groups)))
654 (setf (cdr cell) (cons (car cell) (cdr cell)))
655 (setf (car cell) last-killed))))))
656 (ibuffer-update nil t))
657
658 ;;;###autoload
659 (defun ibuffer-save-filter-groups (name groups)
660 "Save all active filter groups GROUPS as NAME.
661 They are added to `ibuffer-saved-filter-groups'. Interactively,
662 prompt for NAME, and use the current filters."
663 (interactive
664 (if (null ibuffer-filter-groups)
665 (error "No filter groups active")
666 (list
667 (read-from-minibuffer "Save current filter groups as: ")
668 ibuffer-filter-groups)))
669 (ibuffer-aif (assoc name ibuffer-saved-filter-groups)
670 (setcdr it groups)
671 (push (list name groups) ibuffer-saved-filter-groups))
672 (ibuffer-maybe-save-stuff)
673 (ibuffer-update-mode-name))
674
675 ;;;###autoload
676 (defun ibuffer-delete-saved-filter-groups (name)
677 "Delete saved filter groups with NAME.
678 They are removed from `ibuffer-saved-filter-groups'."
679 (interactive
680 (list
681 (if (null ibuffer-saved-filter-groups)
682 (error "No saved filters")
683 (completing-read "Delete saved filters: "
684 ibuffer-saved-filter-groups nil t))))
685 (setq ibuffer-saved-filter-groups
686 (ibuffer-delete-alist name ibuffer-saved-filter-groups))
687 (ibuffer-maybe-save-stuff)
688 (ibuffer-update nil t))
689
690 ;;;###autoload
691 (defun ibuffer-switch-to-saved-filter-groups (name)
692 "Set this buffer's filter groups to saved version with NAME.
693 The value from `ibuffer-saved-filters' is used.
694 If prefix argument ADD is non-nil, then add the saved filters instead
695 of replacing the current filters."
696 (interactive
697 (list
698 (if (null ibuffer-saved-filter-groups)
699 (error "No saved filters")
700 (completing-read "Switch to saved filter group: "
701 ibuffer-saved-filter-groups nil t))))
702 (setq ibuffer-filter-groups (assoc name ibuffer-saved-filter-groups))
703 (ibuffer-update nil t))
532 704
533 ;;;###autoload 705 ;;;###autoload
534 (defun ibuffer-filter-disable () 706 (defun ibuffer-filter-disable ()
535 "Disable all filters currently in effect in this buffer." 707 "Disable all filters currently in effect in this buffer."
536 (interactive) 708 (interactive)
631 (push (nconc (list 'or first) (cdr second)) ibuffer-filtering-qualifiers) 803 (push (nconc (list 'or first) (cdr second)) ibuffer-filtering-qualifiers)
632 (push (list 'or first second) 804 (push (list 'or first second)
633 ibuffer-filtering-qualifiers)))) 805 ibuffer-filtering-qualifiers))))
634 (ibuffer-update nil t)) 806 (ibuffer-update nil t))
635 807
636 (defun ibuffer-maybe-save-saved-filters () 808 (defun ibuffer-maybe-save-stuff ()
637 (when ibuffer-save-with-custom 809 (when ibuffer-save-with-custom
638 (if (fboundp 'customize-save-variable) 810 (if (fboundp 'customize-save-variable)
639 (progn 811 (progn
640 (customize-save-variable 'ibuffer-saved-filters 812 (customize-save-variable 'ibuffer-saved-filters
641 ibuffer-saved-filters)) 813 ibuffer-saved-filters)
814 (customize-save-variable 'ibuffer-saved-filter-groups
815 ibuffer-saved-filter-groups))
642 (message "Not saved permanently: Customize not available")))) 816 (message "Not saved permanently: Customize not available"))))
643 817
644 ;;;###autoload 818 ;;;###autoload
645 (defun ibuffer-save-filters (name filters) 819 (defun ibuffer-save-filters (name filters)
646 "Save FILTERS in this buffer with name NAME in `ibuffer-saved-filters'. 820 "Save FILTERS in this buffer with name NAME in `ibuffer-saved-filters'.
652 (read-from-minibuffer "Save current filters as: ") 826 (read-from-minibuffer "Save current filters as: ")
653 ibuffer-filtering-qualifiers))) 827 ibuffer-filtering-qualifiers)))
654 (ibuffer-aif (assoc name ibuffer-saved-filters) 828 (ibuffer-aif (assoc name ibuffer-saved-filters)
655 (setcdr it filters) 829 (setcdr it filters)
656 (push (list name filters) ibuffer-saved-filters)) 830 (push (list name filters) ibuffer-saved-filters))
657 (ibuffer-maybe-save-saved-filters) 831 (ibuffer-maybe-save-stuff)
658 (ibuffer-update-mode-name)) 832 (ibuffer-update-mode-name))
659 833
660 ;;;###autoload 834 ;;;###autoload
661 (defun ibuffer-delete-saved-filters (name) 835 (defun ibuffer-delete-saved-filters (name)
662 "Delete saved filters with NAME from `ibuffer-saved-filters'." 836 "Delete saved filters with NAME from `ibuffer-saved-filters'."
666 (error "No saved filters") 840 (error "No saved filters")
667 (completing-read "Delete saved filters: " 841 (completing-read "Delete saved filters: "
668 ibuffer-saved-filters nil t)))) 842 ibuffer-saved-filters nil t))))
669 (setq ibuffer-saved-filters 843 (setq ibuffer-saved-filters
670 (ibuffer-delete-alist name ibuffer-saved-filters)) 844 (ibuffer-delete-alist name ibuffer-saved-filters))
671 (ibuffer-maybe-save-saved-filters) 845 (ibuffer-maybe-save-stuff)
672 (ibuffer-update nil t)) 846 (ibuffer-update nil t))
673 847
674 ;;;###autoload 848 ;;;###autoload
675 (defun ibuffer-add-saved-filters (name) 849 (defun ibuffer-add-saved-filters (name)
676 "Add saved filters from `ibuffer-saved-filters' to this buffer's filters." 850 "Add saved filters from `ibuffer-saved-filters' to this buffer's filters."
1046 (file-name-nondirectory name))) 1220 (file-name-nondirectory name)))
1047 "")) 1221 ""))
1048 " ")))) 1222 " "))))
1049 (push ibuffer-copy-filename-as-kill-result kill-ring)))) 1223 (push ibuffer-copy-filename-as-kill-result kill-ring))))
1050 1224
1051 (defun ibuffer-mark-on-buffer (func) 1225 (defun ibuffer-mark-on-buffer (func &optional ibuffer-mark-on-buffer-mark group)
1052 (let ((count 1226 (let ((count
1053 (ibuffer-map-lines 1227 (ibuffer-map-lines
1054 #'(lambda (buf mark) 1228 #'(lambda (buf mark)
1055 (when (funcall func buf) 1229 (when (funcall func buf)
1056 (ibuffer-set-mark-1 ibuffer-marked-char) 1230 (ibuffer-set-mark-1 (or ibuffer-mark-on-buffer-mark
1057 t))))) 1231 ibuffer-marked-char))
1232 t))
1233 nil
1234 group)))
1058 (ibuffer-redisplay t) 1235 (ibuffer-redisplay t)
1059 (message "Marked %s buffers" count))) 1236 (message "Marked %s buffers" count)))
1060 1237
1061 ;;;###autoload 1238 ;;;###autoload
1062 (defun ibuffer-mark-by-name-regexp (regexp) 1239 (defun ibuffer-mark-by-name-regexp (regexp)