Mercurial > emacs
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) |