3 |
;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. |
;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. |
4 |
|
|
5 |
;; Author: Colin Walters <walters@verbum.org> |
;; Author: Colin Walters <walters@verbum.org> |
6 |
|
;; Maintainer: John Paul Wallington <jpw@gnu.org> |
7 |
;; Created: 8 Sep 2000 |
;; Created: 8 Sep 2000 |
8 |
;; Keywords: buffer, convenience |
;; Keywords: buffer, convenience |
9 |
|
|
37 |
(require 'ibuf-macs) |
(require 'ibuf-macs) |
38 |
(require 'dired)) |
(require 'dired)) |
39 |
|
|
40 |
(require 'font-lock) |
(require 'font-core) |
|
|
|
|
;;; Compatibility |
|
|
(eval-and-compile |
|
|
(if (fboundp 'window-list) |
|
|
(defun ibuffer-window-list () |
|
|
(window-list nil 'nomini)) |
|
|
(defun ibuffer-window-list () |
|
|
(let ((ibuffer-window-list-result nil)) |
|
|
(walk-windows #'(lambda (win) (push win ibuffer-window-list-result)) 'nomini) |
|
|
(nreverse ibuffer-window-list-result))))) |
|
41 |
|
|
42 |
(defgroup ibuffer nil |
(defgroup ibuffer nil |
43 |
"An advanced replacement for `buffer-menu'. |
"An advanced replacement for `buffer-menu'. |
48 |
:group 'convenience) |
:group 'convenience) |
49 |
|
|
50 |
(defcustom ibuffer-formats '((mark modified read-only " " (name 16 16 :left :elide) |
(defcustom ibuffer-formats '((mark modified read-only " " (name 16 16 :left :elide) |
51 |
" " (size 6 -1 :right) |
" " (size 7 -1 :right) |
52 |
" " (mode 16 16 :right :elide) " " filename-and-process) |
" " (mode 16 16 :right :elide) " " filename-and-process) |
53 |
(mark " " (name 16 -1) " " filename)) |
(mark " " (name 16 -1) " " filename)) |
54 |
"A list of ways to display buffer lines. |
"A list of ways to display buffer lines. |
124 |
:group 'ibuffer) |
:group 'ibuffer) |
125 |
|
|
126 |
(defcustom ibuffer-fontification-alist |
(defcustom ibuffer-fontification-alist |
127 |
`((10 buffer-read-only font-lock-reference-face) |
`((10 buffer-read-only font-lock-constant-face) |
128 |
(15 (string-match "^*" (buffer-name)) font-lock-keyword-face) |
(15 (string-match "^*" (buffer-name)) font-lock-keyword-face) |
129 |
(20 (string-match "^ " (buffer-name)) font-lock-warning-face) |
(20 (and (string-match "^ " (buffer-name)) |
130 |
|
(null buffer-file-name)) |
131 |
|
italic) |
132 |
(25 (memq major-mode ibuffer-help-buffer-modes) font-lock-comment-face) |
(25 (memq major-mode ibuffer-help-buffer-modes) font-lock-comment-face) |
133 |
(30 (eq major-mode 'dired-mode) font-lock-function-name-face)) |
(30 (eq major-mode 'dired-mode) font-lock-function-name-face)) |
134 |
"An alist describing how to fontify buffers. |
"An alist describing how to fontify buffers. |
138 |
evaluates to non-nil, then FACE will be put on the buffer name. The |
evaluates to non-nil, then FACE will be put on the buffer name. The |
139 |
element with the highest PRIORITY takes precedence. |
element with the highest PRIORITY takes precedence. |
140 |
|
|
141 |
If you change this variable, you must kill the ibuffer buffer and |
If you change this variable, you must kill the Ibuffer buffer and |
142 |
recreate it for the change to take effect." |
recreate it for the change to take effect." |
143 |
:type '(repeat |
:type '(repeat |
144 |
(list (integer :tag "Priority") |
(list (integer :tag "Priority") |
147 |
:group 'ibuffer) |
:group 'ibuffer) |
148 |
|
|
149 |
(defcustom ibuffer-use-other-window nil |
(defcustom ibuffer-use-other-window nil |
150 |
"If non-nil, display the Ibuffer in another window by default." |
"If non-nil, display Ibuffer in another window by default." |
151 |
:type 'boolean |
:type 'boolean |
152 |
:group 'ibuffer) |
:group 'ibuffer) |
153 |
|
|
170 |
(defcustom ibuffer-default-sorting-mode 'recency |
(defcustom ibuffer-default-sorting-mode 'recency |
171 |
"The criteria by which to sort the buffers. |
"The criteria by which to sort the buffers. |
172 |
|
|
173 |
Note that this variable is local to each ibuffer buffer. Thus, you |
Note that this variable is local to each Ibuffer buffer. Thus, you |
174 |
can have multiple ibuffer buffers open, each with a different sorted |
can have multiple Ibuffer buffers open, each with a different sorted |
175 |
view of the buffers." |
view of the buffers." |
176 |
:type '(choice (const :tag "Last view time" :value recency) |
:type '(choice (const :tag "Last view time" :value recency) |
177 |
(const :tag "Lexicographic" :value alphabetic) |
(const :tag "Lexicographic" :value alphabetic) |
201 |
(defcustom ibuffer-maybe-show-predicates `(,(lambda (buf) |
(defcustom ibuffer-maybe-show-predicates `(,(lambda (buf) |
202 |
(and (string-match "^ " (buffer-name buf)) |
(and (string-match "^ " (buffer-name buf)) |
203 |
(null buffer-file-name)))) |
(null buffer-file-name)))) |
204 |
"A list of predicates (a regexp or function) for buffers to display conditionally. |
"A list of predicates for buffers to display conditionally. |
205 |
|
|
206 |
|
A predicate can be a regexp or a function. |
207 |
If a regexp, then it will be matched against the buffer's name. |
If a regexp, then it will be matched against the buffer's name. |
208 |
If a function, it will be called with the buffer as an argument, and |
If a function, it will be called with the buffer as an argument, and |
209 |
should return non-nil if this buffer should be shown. |
should return non-nil if this buffer should be shown. |
216 |
|
|
217 |
(defvar ibuffer-current-format nil) |
(defvar ibuffer-current-format nil) |
218 |
|
|
219 |
|
(defcustom ibuffer-movement-cycle t |
220 |
|
"If non-nil, then forward and backwards movement commands cycle." |
221 |
|
:type 'boolean |
222 |
|
:group 'ibuffer) |
223 |
|
|
224 |
(defcustom ibuffer-modified-char ?* |
(defcustom ibuffer-modified-char ?* |
225 |
"The character to display for modified buffers." |
"The character to display for modified buffers." |
226 |
:type 'character |
:type 'character |
255 |
:group 'ibuffer) |
:group 'ibuffer) |
256 |
|
|
257 |
(defcustom ibuffer-always-show-last-buffer nil |
(defcustom ibuffer-always-show-last-buffer nil |
258 |
"If non-nil, always display the previous buffer. This variable |
"If non-nil, always display the previous buffer. |
259 |
takes precedence over filtering, and even |
This variable takes precedence over filtering, and even |
260 |
`ibuffer-never-show-predicates'." |
`ibuffer-never-show-predicates'." |
261 |
:type '(choice (const :tag "Always" :value t) |
:type '(choice (const :tag "Always" :value t) |
262 |
(const :tag "Never" :value nil) |
(const :tag "Never" :value nil) |
264 |
:group 'ibuffer) |
:group 'ibuffer) |
265 |
|
|
266 |
(defcustom ibuffer-use-header-line (boundp 'header-line-format) |
(defcustom ibuffer-use-header-line (boundp 'header-line-format) |
267 |
"If non-nil, display a header line containing current filters. |
"If non-nil, display a header line containing current filters." |
|
This feature only works on Emacs 21 or later." |
|
268 |
:type 'boolean |
:type 'boolean |
269 |
:group 'ibuffer) |
:group 'ibuffer) |
270 |
|
|
271 |
(defcustom ibuffer-default-directory nil |
(defcustom ibuffer-default-directory nil |
272 |
"The default directory to use for a new ibuffer buffer. |
"The default directory to use for a new Ibuffer buffer. |
273 |
If nil, inherit the directory of the buffer in which `ibuffer' was |
If nil, inherit the directory of the buffer in which `ibuffer' was |
274 |
called. Otherwise, this variable should be a string naming a |
called. Otherwise, this variable should be a string naming a |
275 |
directory, like `default-directory'." |
directory, like `default-directory'." |
277 |
string) |
string) |
278 |
:group 'ibuffer) |
:group 'ibuffer) |
279 |
|
|
280 |
(defcustom ibuffer-help-buffer-modes '(help-mode apropos-mode |
(defcustom ibuffer-help-buffer-modes |
281 |
Info-mode Info-edit-mode) |
'(help-mode apropos-mode Info-mode Info-edit-mode) |
282 |
"List of \"Help\" major modes." |
"List of \"Help\" major modes." |
283 |
:type '(repeat function) |
:type '(repeat function) |
284 |
:group 'ibuffer) |
:group 'ibuffer) |
285 |
|
|
286 |
(defcustom ibuffer-hooks nil |
(defcustom ibuffer-hook nil |
287 |
"Hooks run when `ibuffer' is called." |
"Hook run when `ibuffer' is called." |
288 |
:type 'hook |
:type 'hook |
289 |
:group 'ibuffer) |
:group 'ibuffer) |
290 |
|
(defvaralias 'ibuffer-hooks 'ibuffer-hook) |
291 |
|
|
292 |
(defcustom ibuffer-mode-hooks nil |
(defcustom ibuffer-mode-hook nil |
293 |
"Hooks run upon entry into `ibuffer-mode'." |
"Hook run upon entry into `ibuffer-mode'." |
294 |
|
:type 'hook |
295 |
|
:group 'ibuffer) |
296 |
|
(defvaralias 'ibuffer-mode-hooks 'ibuffer-mode-hook) |
297 |
|
|
298 |
|
(defcustom ibuffer-load-hook nil |
299 |
|
"Hook run when Ibuffer is loaded." |
300 |
:type 'hook |
:type 'hook |
301 |
:group 'ibuffer) |
:group 'ibuffer) |
302 |
|
|
328 |
(regexp :tag "To"))) |
(regexp :tag "To"))) |
329 |
:group 'ibuffer) |
:group 'ibuffer) |
330 |
|
|
331 |
|
|
332 |
(defvar ibuffer-mode-map nil) |
(defvar ibuffer-mode-map nil) |
333 |
(defvar ibuffer-mode-operate-map nil) |
(defvar ibuffer-mode-operate-map nil) |
334 |
(defvar ibuffer-mode-groups-popup nil) |
(defvar ibuffer-mode-groups-popup nil) |
364 |
(define-key map (kbd "* e") 'ibuffer-mark-dissociated-buffers) |
(define-key map (kbd "* e") 'ibuffer-mark-dissociated-buffers) |
365 |
(define-key map (kbd "* h") 'ibuffer-mark-help-buffers) |
(define-key map (kbd "* h") 'ibuffer-mark-help-buffers) |
366 |
(define-key map (kbd ".") 'ibuffer-mark-old-buffers) |
(define-key map (kbd ".") 'ibuffer-mark-old-buffers) |
367 |
|
|
368 |
(define-key map (kbd "d") 'ibuffer-mark-for-delete) |
(define-key map (kbd "d") 'ibuffer-mark-for-delete) |
369 |
(define-key map (kbd "C-d") 'ibuffer-mark-for-delete-backwards) |
(define-key map (kbd "C-d") 'ibuffer-mark-for-delete-backwards) |
370 |
(define-key map (kbd "k") 'ibuffer-mark-for-delete) |
(define-key map (kbd "k") 'ibuffer-mark-for-delete) |
371 |
(define-key map (kbd "x") 'ibuffer-do-kill-on-deletion-marks) |
(define-key map (kbd "x") 'ibuffer-do-kill-on-deletion-marks) |
372 |
|
|
373 |
;; immediate operations |
;; immediate operations |
374 |
(define-key map (kbd "n") 'ibuffer-forward-line) |
(define-key map (kbd "n") 'ibuffer-forward-line) |
375 |
(define-key map (kbd "<down>") 'ibuffer-forward-line) |
(define-key map (kbd "<down>") 'ibuffer-forward-line) |
392 |
(define-key map (kbd "s m") 'ibuffer-do-sort-by-major-mode) |
(define-key map (kbd "s m") 'ibuffer-do-sort-by-major-mode) |
393 |
|
|
394 |
(define-key map (kbd "/ m") 'ibuffer-filter-by-mode) |
(define-key map (kbd "/ m") 'ibuffer-filter-by-mode) |
395 |
|
(define-key map (kbd "/ M") 'ibuffer-filter-by-used-mode) |
396 |
(define-key map (kbd "/ n") 'ibuffer-filter-by-name) |
(define-key map (kbd "/ n") 'ibuffer-filter-by-name) |
397 |
(define-key map (kbd "/ c") 'ibuffer-filter-by-content) |
(define-key map (kbd "/ c") 'ibuffer-filter-by-content) |
398 |
(define-key map (kbd "/ e") 'ibuffer-filter-by-predicate) |
(define-key map (kbd "/ e") 'ibuffer-filter-by-predicate) |
425 |
(define-key map (kbd "/ R") 'ibuffer-switch-to-saved-filter-groups) |
(define-key map (kbd "/ R") 'ibuffer-switch-to-saved-filter-groups) |
426 |
(define-key map (kbd "/ X") 'ibuffer-delete-saved-filter-groups) |
(define-key map (kbd "/ X") 'ibuffer-delete-saved-filter-groups) |
427 |
(define-key map (kbd "/ \\") 'ibuffer-clear-filter-groups) |
(define-key map (kbd "/ \\") 'ibuffer-clear-filter-groups) |
428 |
|
|
429 |
(define-key map (kbd "q") 'ibuffer-quit) |
(define-key map (kbd "q") 'ibuffer-quit) |
430 |
(define-key map (kbd "h") 'describe-mode) |
(define-key map (kbd "h") 'describe-mode) |
431 |
(define-key map (kbd "?") 'describe-mode) |
(define-key map (kbd "?") 'describe-mode) |
433 |
(define-key map (kbd "% n") 'ibuffer-mark-by-name-regexp) |
(define-key map (kbd "% n") 'ibuffer-mark-by-name-regexp) |
434 |
(define-key map (kbd "% m") 'ibuffer-mark-by-mode-regexp) |
(define-key map (kbd "% m") 'ibuffer-mark-by-mode-regexp) |
435 |
(define-key map (kbd "% f") 'ibuffer-mark-by-file-name-regexp) |
(define-key map (kbd "% f") 'ibuffer-mark-by-file-name-regexp) |
436 |
|
|
437 |
(define-key map (kbd "C-t") 'ibuffer-visit-tags-table) |
(define-key map (kbd "C-t") 'ibuffer-visit-tags-table) |
438 |
|
|
439 |
(define-key map (kbd "|") 'ibuffer-do-shell-command-pipe) |
(define-key map (kbd "|") 'ibuffer-do-shell-command-pipe) |
458 |
(define-key map (kbd "V") 'ibuffer-do-revert) |
(define-key map (kbd "V") 'ibuffer-do-revert) |
459 |
(define-key map (kbd "W") 'ibuffer-do-view-and-eval) |
(define-key map (kbd "W") 'ibuffer-do-view-and-eval) |
460 |
(define-key map (kbd "X") 'ibuffer-do-shell-command-pipe) |
(define-key map (kbd "X") 'ibuffer-do-shell-command-pipe) |
461 |
|
|
462 |
(define-key map (kbd "k") 'ibuffer-do-kill-lines) |
(define-key map (kbd "k") 'ibuffer-do-kill-lines) |
463 |
(define-key map (kbd "w") 'ibuffer-copy-filename-as-kill) |
(define-key map (kbd "w") 'ibuffer-copy-filename-as-kill) |
464 |
|
|
507 |
(define-key-after map [menu-bar view sort do-sort-by-recency] |
(define-key-after map [menu-bar view sort do-sort-by-recency] |
508 |
'(menu-item "Sort by view time" ibuffer-do-sort-by-recency |
'(menu-item "Sort by view time" ibuffer-do-sort-by-recency |
509 |
:help "Sort by the last time the buffer was displayed")) |
:help "Sort by the last time the buffer was displayed")) |
510 |
|
(define-key-after map [menu-bar view sort dashes] |
511 |
|
'("--")) |
512 |
(define-key-after map [menu-bar view sort invert-sorting] |
(define-key-after map [menu-bar view sort invert-sorting] |
513 |
'(menu-item "Reverse sorting order" ibuffer-invert-sorting)) |
'(menu-item "Reverse sorting order" ibuffer-invert-sorting)) |
514 |
(define-key-after map [menu-bar view sort toggle-sorting-mode] |
(define-key-after map [menu-bar view sort toggle-sorting-mode] |
523 |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers))) |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers))) |
524 |
(define-key-after map [menu-bar view filter filter-by-mode] |
(define-key-after map [menu-bar view filter filter-by-mode] |
525 |
'(menu-item "Add filter by major mode..." ibuffer-filter-by-mode)) |
'(menu-item "Add filter by major mode..." ibuffer-filter-by-mode)) |
526 |
|
(define-key-after map [menu-bar view filter filter-by-mode] |
527 |
|
'(menu-item "Add filter by major mode in use..." ibuffer-filter-by-used-mode)) |
528 |
(define-key-after map [menu-bar view filter filter-by-name] |
(define-key-after map [menu-bar view filter filter-by-name] |
529 |
'(menu-item "Add filter by buffer name..." ibuffer-filter-by-name)) |
'(menu-item "Add filter by buffer name..." ibuffer-filter-by-name)) |
530 |
(define-key-after map [menu-bar view filter filter-by-filename] |
(define-key-after map [menu-bar view filter filter-by-filename] |
558 |
(cdr ibuffer-filtering-qualifiers)))) |
(cdr ibuffer-filtering-qualifiers)))) |
559 |
(define-key-after map [menu-bar view filter save-filters] |
(define-key-after map [menu-bar view filter save-filters] |
560 |
'(menu-item "Save current filters permanently..." ibuffer-save-filters |
'(menu-item "Save current filters permanently..." ibuffer-save-filters |
561 |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers) |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers) |
562 |
:help "Use a mnemnonic name to store current filter stack")) |
:help "Use a mnemnonic name to store current filter stack")) |
563 |
(define-key-after map [menu-bar view filter switch-to-saved-filters] |
(define-key-after map [menu-bar view filter switch-to-saved-filters] |
564 |
'(menu-item "Restore permanently saved filters..." ibuffer-switch-to-saved-filters |
'(menu-item "Restore permanently saved filters..." ibuffer-switch-to-saved-filters |
581 |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers))) |
:enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers))) |
582 |
(define-key-after groups-map [forward-filter-group] |
(define-key-after groups-map [forward-filter-group] |
583 |
'(menu-item "Move point to the next filter group" |
'(menu-item "Move point to the next filter group" |
584 |
ibuffer-forward-filter-group)) |
ibuffer-forward-filter-group)) |
585 |
(define-key-after groups-map [backward-filter-group] |
(define-key-after groups-map [backward-filter-group] |
586 |
'(menu-item "Move point to the previous filter group" |
'(menu-item "Move point to the previous filter group" |
587 |
ibuffer-backward-filter-group)) |
ibuffer-backward-filter-group)) |
618 |
'(menu-item "Restore permanently saved filters..." |
'(menu-item "Restore permanently saved filters..." |
619 |
ibuffer-switch-to-saved-filter-groups |
ibuffer-switch-to-saved-filter-groups |
620 |
:enable (and (featurep 'ibuf-ext) ibuffer-saved-filter-groups) |
:enable (and (featurep 'ibuf-ext) ibuffer-saved-filter-groups) |
621 |
:help "Replace current filters with a saved stack")) |
:help "Replace current filters with a saved stack")) |
622 |
(define-key-after groups-map [delete-saved-filter-groups] |
(define-key-after groups-map [delete-saved-filter-groups] |
623 |
'(menu-item "Delete permanently saved filter groups..." |
'(menu-item "Delete permanently saved filter groups..." |
624 |
ibuffer-delete-saved-filter-groups |
ibuffer-delete-saved-filter-groups |
639 |
'(menu-item "Toggle Auto Mode" ibuffer-auto-mode |
'(menu-item "Toggle Auto Mode" ibuffer-auto-mode |
640 |
:help "Attempt to automatically update the Ibuffer buffer")) |
:help "Attempt to automatically update the Ibuffer buffer")) |
641 |
(define-key-after map [menu-bar view customize] |
(define-key-after map [menu-bar view customize] |
642 |
'(menu-item "Customize Ibuffer" (lambda () (interactive) |
'(menu-item "Customize Ibuffer" ibuffer-customize |
|
(customize-group 'ibuffer)) |
|
643 |
:help "Use Custom to customize Ibuffer")) |
:help "Use Custom to customize Ibuffer")) |
644 |
|
|
645 |
(define-key-after map [menu-bar mark] |
(define-key-after map [menu-bar mark] |
683 |
:help "Mark buffers which have not been viewed recently")) |
:help "Mark buffers which have not been viewed recently")) |
684 |
(define-key-after map [menu-bar mark unmark-all] |
(define-key-after map [menu-bar mark unmark-all] |
685 |
'(menu-item "Unmark All" ibuffer-unmark-all)) |
'(menu-item "Unmark All" ibuffer-unmark-all)) |
686 |
|
|
687 |
(define-key-after map [menu-bar mark dashes] |
(define-key-after map [menu-bar mark dashes] |
688 |
'("--")) |
'("--")) |
689 |
|
|
690 |
(define-key-after map [menu-bar mark mark-by-name-regexp] |
(define-key-after map [menu-bar mark mark-by-name-regexp] |
691 |
'(menu-item "Mark by buffer name (regexp)..." ibuffer-mark-by-name-regexp |
'(menu-item "Mark by buffer name (regexp)..." ibuffer-mark-by-name-regexp |
692 |
:help "Mark buffers whose name matches a regexp")) |
:help "Mark buffers whose name matches a regexp")) |
744 |
(define-key-after operate-map [do-view-and-eval] |
(define-key-after operate-map [do-view-and-eval] |
745 |
'(menu-item "Eval (viewing buffer)..." ibuffer-do-view-and-eval |
'(menu-item "Eval (viewing buffer)..." ibuffer-do-view-and-eval |
746 |
:help "Evaluate a Lisp form in each marked buffer while viewing it")) |
:help "Evaluate a Lisp form in each marked buffer while viewing it")) |
747 |
|
|
748 |
(setq ibuffer-mode-map map |
(setq ibuffer-mode-map map |
749 |
ibuffer-mode-operate-map operate-map |
ibuffer-mode-operate-map operate-map |
750 |
ibuffer-mode-groups-popup (copy-keymap groups-map)))) |
ibuffer-mode-groups-popup (copy-keymap groups-map)))) |
751 |
|
|
752 |
(define-key ibuffer-mode-groups-popup [kill-filter-group] |
(define-key ibuffer-mode-groups-popup [kill-filter-group] |
753 |
'(menu-item "Kill filter group" |
'(menu-item "Kill filter group" |
754 |
ibuffer-kill-line |
ibuffer-kill-line |
755 |
:enable (and (featurep 'ibuf-ext) ibuffer-filter-groups))) |
:enable (and (featurep 'ibuf-ext) ibuffer-filter-groups))) |
756 |
(define-key ibuffer-mode-groups-popup [yank-filter-group] |
(define-key ibuffer-mode-groups-popup [yank-filter-group] |
757 |
'(menu-item "Yank last killed filter group" |
'(menu-item "Yank last killed filter group" |
758 |
ibuffer-yank |
ibuffer-yank |
759 |
:enable (and (featurep 'ibuf-ext) ibuffer-filter-group-kill-ring))) |
:enable (and (featurep 'ibuf-ext) ibuffer-filter-group-kill-ring))) |
760 |
|
|
761 |
(defvar ibuffer-name-map nil) |
(defvar ibuffer-name-map nil) |
762 |
(unless ibuffer-name-map |
(unless ibuffer-name-map |
763 |
(let ((map (make-sparse-keymap))) |
(let ((map (make-sparse-keymap))) |
782 |
(define-key map [down-mouse-3] 'ibuffer-mouse-popup-menu) |
(define-key map [down-mouse-3] 'ibuffer-mouse-popup-menu) |
783 |
(setq ibuffer-mode-filter-group-map map))) |
(setq ibuffer-mode-filter-group-map map))) |
784 |
|
|
|
(defvar ibuffer-mode-hooks nil) |
|
|
|
|
785 |
(defvar ibuffer-delete-window-on-quit nil |
(defvar ibuffer-delete-window-on-quit nil |
786 |
"Whether or not to delete the window upon exiting `ibuffer'.") |
"Whether or not to delete the window upon exiting `ibuffer'.") |
787 |
|
|
865 |
(defun ibuffer-mouse-popup-menu (event) |
(defun ibuffer-mouse-popup-menu (event) |
866 |
"Display a menu of operations." |
"Display a menu of operations." |
867 |
(interactive "e") |
(interactive "e") |
868 |
(let ((origline (count-lines (point-min) (point)))) |
(let ((eventpt (posn-point (event-end event))) |
869 |
|
(origpt (point))) |
870 |
(unwind-protect |
(unwind-protect |
871 |
(progn |
(if (get-text-property eventpt 'ibuffer-filter-group-name) |
872 |
(mouse-set-point event) |
(progn |
873 |
(if (get-text-property (point) 'ibuffer-filter-group-name) |
(goto-char eventpt) |
874 |
(save-excursion |
(popup-menu ibuffer-mode-groups-popup)) |
875 |
(popup-menu ibuffer-mode-groups-popup)) |
(let ((inhibit-read-only t)) |
|
(setq buffer-read-only nil) |
|
876 |
(ibuffer-save-marks |
(ibuffer-save-marks |
877 |
;; hm. we could probably do this in a better fashion |
;; hm. we could probably do this in a better fashion |
878 |
(ibuffer-unmark-all ?\r) |
(ibuffer-unmark-all ?\r) |
879 |
(setq buffer-read-only nil) |
(save-excursion |
880 |
(ibuffer-set-mark ibuffer-marked-char) |
(goto-char eventpt) |
881 |
(setq buffer-read-only nil) |
(ibuffer-set-mark ibuffer-marked-char)) |
882 |
(save-excursion |
(save-excursion |
883 |
(popup-menu ibuffer-mode-operate-map))))) |
(popup-menu ibuffer-mode-operate-map))))) |
884 |
(progn |
(setq buffer-read-only t) |
885 |
(setq buffer-read-only t) |
(if (= eventpt (point)) |
886 |
(goto-line (1+ origline)))))) |
(goto-char origpt))))) |
887 |
|
|
888 |
(defun ibuffer-skip-properties (props direction) |
(defun ibuffer-skip-properties (props direction) |
889 |
(while (and (not (eobp)) |
(while (and (not (eobp)) |
890 |
(let ((hit nil)) |
(let ((hit nil)) |
894 |
(forward-line direction) |
(forward-line direction) |
895 |
(beginning-of-line))) |
(beginning-of-line))) |
896 |
|
|
897 |
|
(defun ibuffer-customize () |
898 |
|
"Begin customizing Ibuffer interactively." |
899 |
|
(interactive) |
900 |
|
(customize-group 'ibuffer)) |
901 |
|
|
902 |
(defun ibuffer-backward-line (&optional arg skip-group-names) |
(defun ibuffer-backward-line (&optional arg skip-group-names) |
903 |
"Move backwards ARG lines, wrapping around the list if necessary." |
"Move backwards ARG lines, wrapping around the list if necessary." |
904 |
(interactive "P") |
(interactive "P") |
907 |
(beginning-of-line) |
(beginning-of-line) |
908 |
(while (> arg 0) |
(while (> arg 0) |
909 |
(forward-line -1) |
(forward-line -1) |
910 |
(when (or (get-text-property (point) 'ibuffer-title) |
(when (and ibuffer-movement-cycle |
911 |
(and skip-group-names |
(or (get-text-property (point) 'ibuffer-title) |
912 |
(get-text-property (point) 'ibuffer-filter-group-name))) |
(and skip-group-names |
913 |
|
(get-text-property (point) 'ibuffer-filter-group-name)))) |
914 |
(goto-char (point-max)) |
(goto-char (point-max)) |
915 |
(beginning-of-line)) |
(beginning-of-line)) |
916 |
(ibuffer-skip-properties (append '(ibuffer-summary) |
(ibuffer-skip-properties (append '(ibuffer-summary) |
929 |
(unless arg |
(unless arg |
930 |
(setq arg 1)) |
(setq arg 1)) |
931 |
(beginning-of-line) |
(beginning-of-line) |
932 |
(when (or (eobp) |
(when (and ibuffer-movement-cycle |
933 |
(get-text-property (point) 'ibuffer-summary)) |
(or (eobp) |
934 |
|
(get-text-property (point) 'ibuffer-summary))) |
935 |
(goto-char (point-min))) |
(goto-char (point-min))) |
936 |
(when (or (get-text-property (point) 'ibuffer-title) |
(when (or (get-text-property (point) 'ibuffer-title) |
937 |
(and skip-group-names |
(and skip-group-names |
946 |
(ibuffer-backward-line (- arg)) |
(ibuffer-backward-line (- arg)) |
947 |
(while (> arg 0) |
(while (> arg 0) |
948 |
(forward-line 1) |
(forward-line 1) |
949 |
(when (or (eobp) |
(when (and ibuffer-movement-cycle |
950 |
(get-text-property (point) 'ibuffer-summary)) |
(or (eobp) |
951 |
|
(get-text-property (point) 'ibuffer-summary))) |
952 |
(goto-char (point-min))) |
(goto-char (point-min))) |
953 |
(decf arg) |
(decf arg) |
954 |
(ibuffer-skip-properties (append '(ibuffer-title) |
(ibuffer-skip-properties (append '(ibuffer-title) |
958 |
|
|
959 |
(defun ibuffer-visit-buffer (&optional single) |
(defun ibuffer-visit-buffer (&optional single) |
960 |
"Visit the buffer on this line. |
"Visit the buffer on this line. |
|
|
|
961 |
If optional argument SINGLE is non-nil, then also ensure there is only |
If optional argument SINGLE is non-nil, then also ensure there is only |
962 |
one window." |
one window." |
963 |
(interactive "P") |
(interactive "P") |
1034 |
(> (length marked-bufs) 3) |
(> (length marked-bufs) 3) |
1035 |
(not (y-or-n-p (format "Really create a new frame for %s buffers? " |
(not (y-or-n-p (format "Really create a new frame for %s buffers? " |
1036 |
(length marked-bufs))))) |
(length marked-bufs))))) |
1037 |
(set-buffer-modified-p nil) |
(set-buffer-modified-p nil) |
1038 |
(delete-other-windows) |
(delete-other-windows) |
1039 |
(switch-to-buffer (pop marked-bufs)) |
(switch-to-buffer (pop marked-bufs)) |
1040 |
(let ((height (/ (1- (if (eq type 'horizontally) (frame-width) |
(let ((height (/ (1- (if (eq type 'horizontally) (frame-width) |
1041 |
(frame-height))) |
(frame-height))) |
1042 |
(1+ (length marked-bufs))))) |
(1+ (length marked-bufs))))) |
1043 |
(mapcar (if (eq type 'other-frame) |
(mapcar (if (eq type 'other-frame) |
1044 |
#'(lambda (buf) |
#'(lambda (buf) |
1077 |
(ibuffer-columnize-and-insert-list names) |
(ibuffer-columnize-and-insert-list names) |
1078 |
(goto-char (point-min)) |
(goto-char (point-min)) |
1079 |
(setq buffer-read-only t)) |
(setq buffer-read-only t)) |
1080 |
(let ((lastwin (car (last (ibuffer-window-list))))) |
(let ((lastwin (car (last (window-list nil 'nomini))))) |
1081 |
;; Now attempt to display the buffer... |
;; Now attempt to display the buffer... |
1082 |
(save-window-excursion |
(save-window-excursion |
1083 |
(select-window lastwin) |
(select-window lastwin) |
1084 |
;; The window might be too small to split; in that case, |
;; The window might be too small to split; in that case, |
1085 |
;; try a few times to increase its size before giving up. |
;; try a few times to increase its size before giving up. |
1086 |
(let ((attempts 0) |
(let ((attempts 0) |
1087 |
(trying t)) |
(trying t)) |
1088 |
(while trying |
(while trying |
1094 |
;; Handle a failure |
;; Handle a failure |
1095 |
(if (or (> (incf attempts) 4) |
(if (or (> (incf attempts) 4) |
1096 |
(and (stringp (cadr err)) |
(and (stringp (cadr err)) |
1097 |
;; This definitely falls in the ghetto hack category... |
;; This definitely falls in the |
1098 |
|
;; ghetto hack category... |
1099 |
(not (string-match "too small" (cadr err))))) |
(not (string-match "too small" (cadr err))))) |
1100 |
(apply #'signal err) |
(apply #'signal err) |
1101 |
(enlarge-window 3)))))) |
(enlarge-window 3)))))) |
|
;; This part doesn't work correctly sometimes under XEmacs. |
|
1102 |
(select-window (next-window)) |
(select-window (next-window)) |
1103 |
(switch-to-buffer buf) |
(switch-to-buffer buf) |
1104 |
(unwind-protect |
(unwind-protect |
1115 |
(defun ibuffer-buffer-names-with-mark (mark) |
(defun ibuffer-buffer-names-with-mark (mark) |
1116 |
(let ((ibuffer-buffer-names-with-mark-result nil)) |
(let ((ibuffer-buffer-names-with-mark-result nil)) |
1117 |
(ibuffer-map-lines-nomodify |
(ibuffer-map-lines-nomodify |
1118 |
#'(lambda (buf mk) |
#'(lambda (buf mk) |
1119 |
(when (char-equal mark mk) |
(when (char-equal mark mk) |
1120 |
(push (buffer-name buf) |
(push (buffer-name buf) |
1121 |
ibuffer-buffer-names-with-mark-result)))) |
ibuffer-buffer-names-with-mark-result)))) |
1271 |
(progn |
(progn |
1272 |
(require 'ibuf-ext) |
(require 'ibuf-ext) |
1273 |
(ibuffer-mark-on-buffer #'identity mark it)) |
(ibuffer-mark-on-buffer #'identity mark it)) |
1274 |
(ibuffer-forward-line 0 t) |
(ibuffer-forward-line 0 t) |
1275 |
(let ((inhibit-read-only t)) |
(let ((inhibit-read-only t)) |
1276 |
(while (> arg 0) |
(while (> arg 0) |
1277 |
(ibuffer-set-mark mark) |
(ibuffer-set-mark mark) |
1338 |
(if uncompiledp |
(if uncompiledp |
1339 |
ibuffer-filter-format-alist |
ibuffer-filter-format-alist |
1340 |
ibuffer-compiled-filter-formats)))))) |
ibuffer-compiled-filter-formats)))))) |
1341 |
|
|
1342 |
(defun ibuffer-current-format (&optional uncompiledp) |
(defun ibuffer-current-format (&optional uncompiledp) |
1343 |
(or ibuffer-current-format |
(or ibuffer-current-format |
1344 |
(setq ibuffer-current-format 0)) |
(setq ibuffer-current-format 0)) |
1345 |
(nth ibuffer-current-format (ibuffer-current-formats uncompiledp))) |
(nth ibuffer-current-format (ibuffer-current-formats uncompiledp))) |
1346 |
|
|
1347 |
(defun ibuffer-expand-format-entry (form) |
(defun ibuffer-expand-format-entry (form) |
1348 |
(if (or (consp form) |
(if (or (consp form) |
1349 |
(symbolp form)) |
(symbolp form)) |
1350 |
(let ((sym (intern (concat "ibuffer-make-column-" |
(let ((sym (intern (concat "ibuffer-make-column-" |
1351 |
(symbol-name (if (consp form) |
(symbol-name (if (consp form) |
1352 |
(car form) |
(car form) |
1353 |
form)))))) |
form)))))) |
1354 |
(unless (or (fboundp sym) |
(unless (or (fboundp sym) |
1355 |
(assq sym ibuffer-inline-columns)) |
(assq sym ibuffer-inline-columns)) |
1356 |
(error "Unknown column %s in ibuffer-formats" form)) |
(error "Unknown column %s in ibuffer-formats" form)) |
1357 |
(let (min max align elide) |
(let (min max align elide) |
1358 |
(if (consp form) |
(if (consp form) |
1359 |
(setq min (or (nth 1 form) 0) |
(setq min (or (nth 1 form) 0) |
1360 |
max (or (nth 2 form) -1) |
max (or (nth 2 form) -1) |
1361 |
align (or (nth 3 form) :left) |
align (or (nth 3 form) :left) |
1362 |
elide (or (nth 4 form) nil)) |
elide (or (nth 4 form) nil)) |
1363 |
(setq min 0 |
(setq min 0 |
1364 |
max -1 |
max -1 |
1365 |
align :left |
align :left |
1366 |
elide nil)) |
elide nil)) |
1367 |
(list sym min max align elide))) |
(list sym min max align elide))) |
1368 |
form)) |
form)) |
1369 |
|
|
1370 |
(defun ibuffer-compile-make-eliding-form (strvar elide from-end-p) |
(defun ibuffer-compile-make-eliding-form (strvar elide from-end-p) |
1371 |
(let ((ellipsis (propertize ibuffer-eliding-string 'font-lock-face 'bold))) |
(let ((ellipsis (propertize ibuffer-eliding-string 'font-lock-face 'bold))) |
1372 |
(if (or elide ibuffer-elide-long-columns) |
(if (or elide ibuffer-elide-long-columns) |
1466 |
;; into our generated code. Otherwise, we just |
;; into our generated code. Otherwise, we just |
1467 |
;; generate a call to the column function. |
;; generate a call to the column function. |
1468 |
(ibuffer-aif (assq sym ibuffer-inline-columns) |
(ibuffer-aif (assq sym ibuffer-inline-columns) |
1469 |
(nth 1 it) |
(nth 1 it) |
1470 |
`(,sym buffer mark))) |
`(,sym buffer mark))) |
1471 |
;; You're not expected to understand this. Hell, I |
;; You're not expected to understand this. Hell, I |
1472 |
;; don't even understand it, and I wrote it five |
;; don't even understand it, and I wrote it five |
1473 |
;; minutes ago. |
;; minutes ago. |
1474 |
(insertgenfn (ibuffer-aif (get sym 'ibuffer-column-summarizer) |
(insertgenfn (ibuffer-aif (get sym 'ibuffer-column-summarizer) |
1475 |
;; I really, really wish Emacs Lisp had closures. |
;; I really, really wish Emacs Lisp had closures. |
1476 |
(lambda (arg sym) |
(lambda (arg sym) |
1477 |
`(insert |
`(insert |
1478 |
(let ((ret ,arg)) |
(let ((ret ,arg)) |
1479 |
(put ',sym 'ibuffer-column-summary |
(put ',sym 'ibuffer-column-summary |
1480 |
(cons ret (get ',sym 'ibuffer-column-summary))) |
(cons ret (get ',sym 'ibuffer-column-summary))) |
1481 |
ret))) |
ret))) |
1482 |
(lambda (arg sym) |
(lambda (arg sym) |
1483 |
`(insert ,arg)))) |
`(insert ,arg)))) |
1484 |
(mincompform `(< strlen ,(if (integerp min) |
(mincompform `(< strlen ,(if (integerp min) |
1487 |
(maxcompform `(> strlen ,(if (integerp max) |
(maxcompform `(> strlen ,(if (integerp max) |
1488 |
max |
max |
1489 |
'max)))) |
'max)))) |
1490 |
(if (or min-used max-used) |
(if (or min-used max-used) |
1491 |
;; The complex case, where we have to limit the |
;; The complex case, where we have to limit the |
1492 |
;; form to a maximum or minimum size. |
;; form to a maximum or minimum size. |
1493 |
(progn |
(progn |
1494 |
(when (and min-used (not (integerp min))) |
(when (and min-used (not (integerp min))) |
1495 |
(push `(min ,min) letbindings)) |
(push `(min ,min) letbindings)) |
1496 |
(when (and max-used (not (integerp max))) |
(when (and max-used (not (integerp max))) |
1497 |
(push `(max ,max) letbindings)) |
(push `(max ,max) letbindings)) |
1498 |
(push |
(push |
1499 |
(if (and min-used max-used) |
(if (and min-used max-used) |
1500 |
`(if ,mincompform |
`(if ,mincompform |
1501 |
,minform |
,minform |
1502 |
(if ,maxcompform |
(if ,maxcompform |
1503 |
,maxform)) |
,maxform)) |
1504 |
(if min-used |
(if min-used |
1505 |
`(when ,mincompform |
`(when ,mincompform |
1506 |
,minform) |
,minform) |
1507 |
`(when ,maxcompform |
`(when ,maxcompform |
1508 |
,maxform))) |
,maxform))) |
1509 |
outforms) |
outforms) |
1510 |
(push (append |
(push (append |
1511 |
`(setq str ,callform) |
`(setq str ,callform) |
1512 |
(when strlen-used |
(when strlen-used |
1513 |
`(strlen (length str)))) |
`(strlen (length str)))) |
1514 |
outforms) |
outforms) |
1515 |
(setq outforms |
(setq outforms |
1516 |
(append outforms (list (funcall insertgenfn 'str sym))))) |
(append outforms (list (funcall insertgenfn 'str sym))))) |
1517 |
;; The simple case; just insert the string. |
;; The simple case; just insert the string. |
1518 |
(push (funcall insertgenfn callform sym) outforms)) |
(push (funcall insertgenfn callform sym) outforms)) |
1519 |
;; Finally, return a `let' form which binds the |
;; Finally, return a `let' form which binds the |
1520 |
;; variables in `letbindings', and contains all the |
;; variables in `letbindings', and contains all the |
1521 |
;; code in `outforms'. |
;; code in `outforms'. |
1522 |
`(let ,letbindings |
`(let ,letbindings |
1523 |
,@outforms))))) |
,@outforms))))) |
1524 |
result)) |
result)) |
1525 |
(setq result |
(setq result |
1526 |
;; We don't want to unconditionally load the byte-compiler. |
;; We don't want to unconditionally load the byte-compiler. |
1551 |
"Recompile `ibuffer-formats'." |
"Recompile `ibuffer-formats'." |
1552 |
(interactive) |
(interactive) |
1553 |
(setq ibuffer-compiled-formats |
(setq ibuffer-compiled-formats |
1554 |
(mapcar #'ibuffer-compile-format ibuffer-formats)) |
(mapcar #'ibuffer-compile-format ibuffer-formats)) |
1555 |
(when (boundp 'ibuffer-filter-format-alist) |
(when (boundp 'ibuffer-filter-format-alist) |
1556 |
(setq ibuffer-compiled-filter-formats |
(setq ibuffer-compiled-filter-formats |
1557 |
(mapcar #'(lambda (entry) |
(mapcar #'(lambda (entry) |
1566 |
(ibuffer-awhen (and (consp form) |
(ibuffer-awhen (and (consp form) |
1567 |
(get (car form) 'ibuffer-column-summarizer)) |
(get (car form) 'ibuffer-column-summarizer)) |
1568 |
(put (car form) 'ibuffer-column-summary nil)))) |
(put (car form) 'ibuffer-column-summary nil)))) |
1569 |
|
|
1570 |
(defun ibuffer-check-formats () |
(defun ibuffer-check-formats () |
1571 |
(when (null ibuffer-formats) |
(when (null ibuffer-formats) |
1572 |
(error "No formats!")) |
(error "No formats!")) |
1611 |
(define-ibuffer-column name (:inline t |
(define-ibuffer-column name (:inline t |
1612 |
:props |
:props |
1613 |
('mouse-face 'highlight 'keymap ibuffer-name-map |
('mouse-face 'highlight 'keymap ibuffer-name-map |
1614 |
'ibuffer-name-column t |
'ibuffer-name-column t |
1615 |
'help-echo "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer")) |
'help-echo "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer")) |
1616 |
(propertize (buffer-name) 'font-lock-face (ibuffer-buffer-name-face buffer mark))) |
(propertize (buffer-name) 'font-lock-face (ibuffer-buffer-name-face buffer mark))) |
1617 |
|
|
1618 |
(define-ibuffer-column size (:inline t) |
(define-ibuffer-column size (:inline t) |
1619 |
(format "%s" (buffer-size))) |
(format "%s" (buffer-size))) |
1620 |
|
|
1621 |
(define-ibuffer-column mode (:inline t |
(define-ibuffer-column mode (:inline t |
1622 |
:props |
:props |
1623 |
('mouse-face 'highlight |
('mouse-face 'highlight |
1624 |
'keymap ibuffer-mode-name-map |
'keymap ibuffer-mode-name-map |
1625 |
'help-echo "mouse-2: filter by this mode")) |
'help-echo "mouse-2: filter by this mode")) |
1626 |
(format "%s" mode-name)) |
(format "%s" mode-name)) |
1627 |
|
|
1698 |
(ibuffer-current-format))) |
(ibuffer-current-format))) |
1699 |
(when ibuffer-shrink-to-minimum-size |
(when ibuffer-shrink-to-minimum-size |
1700 |
(ibuffer-shrink-to-fit))))))) |
(ibuffer-shrink-to-fit))))))) |
1701 |
|
|
1702 |
(defun ibuffer-map-on-mark (mark func) |
(defun ibuffer-map-on-mark (mark func) |
1703 |
(ibuffer-map-lines |
(ibuffer-map-lines |
1704 |
#'(lambda (buf mk) |
#'(lambda (buf mk) |
1713 |
If optional argument GROUP is non-nil, then only call FUNCTION on |
If optional argument GROUP is non-nil, then only call FUNCTION on |
1714 |
buffers in filtering group GROUP. |
buffers in filtering group GROUP. |
1715 |
|
|
1716 |
FUNCTION is called with four arguments: the buffer object itself, the |
FUNCTION is called with two arguments: |
1717 |
current mark symbol, and the beginning and ending line positions." |
the buffer object itself and the current mark symbol." |
1718 |
(assert (eq major-mode 'ibuffer-mode)) |
(assert (eq major-mode 'ibuffer-mode)) |
1719 |
(ibuffer-forward-line 0) |
(ibuffer-forward-line 0) |
1720 |
(let* ((orig-target-line (1+ (count-lines (save-excursion |
(let* ((orig-target-line (1+ (count-lines (save-excursion |
1729 |
(progn |
(progn |
1730 |
(setq buffer-read-only nil) |
(setq buffer-read-only nil) |
1731 |
(goto-char (point-min)) |
(goto-char (point-min)) |
1732 |
(ibuffer-forward-line 0 t) |
(ibuffer-forward-line 0 t) |
1733 |
(while (and (not (eobp)) |
(while (and (not (eobp)) |
1734 |
(not (get-text-property (point) 'ibuffer-summary)) |
(not (get-text-property (point) 'ibuffer-summary)) |
1735 |
(progn |
(progn |
1759 |
(1+ (line-end-position))) |
(1+ (line-end-position))) |
1760 |
(incf ibuffer-map-lines-count) |
(incf ibuffer-map-lines-count) |
1761 |
(when (< ibuffer-map-lines-total |
(when (< ibuffer-map-lines-total |
1762 |
orig-target-line) |
orig-target-line) |
1763 |
(decf target-line-offset))) |
(decf target-line-offset))) |
1764 |
(t |
(t |
1765 |
(incf ibuffer-map-lines-count) |
(incf ibuffer-map-lines-count) |
1817 |
(funcall pred buf)) |
(funcall pred buf)) |
1818 |
(setq hit t))) |
(setq hit t))) |
1819 |
hit)) |
hit)) |
1820 |
|
|
1821 |
(defun ibuffer-filter-buffers (ibuffer-buf last bmarklist all) |
(defun ibuffer-filter-buffers (ibuffer-buf last bmarklist all) |
1822 |
(let ((ext-loaded (featurep 'ibuf-ext))) |
(let ((ext-loaded (featurep 'ibuf-ext))) |
1823 |
(delq nil |
(delq nil |
1828 |
(when |
(when |
1829 |
;; This takes precedence over anything else |
;; This takes precedence over anything else |
1830 |
(or (and ibuffer-always-show-last-buffer |
(or (and ibuffer-always-show-last-buffer |
1831 |
(eq last buf)) |
(eq last buf)) |
1832 |
(funcall (if ext-loaded |
(funcall (if ext-loaded |
1833 |
#'ibuffer-ext-visible-p |
#'ibuffer-ext-visible-p |
1834 |
#'ibuffer-visible-p) |
#'ibuffer-visible-p) |
1835 |
buf all ibuffer-buf)) |
buf all ibuffer-buf)) |
1836 |
e))) |
e))) |
1837 |
bmarklist)))) |
bmarklist)))) |
1838 |
|
|
1841 |
(not |
(not |
1842 |
(ibuffer-buf-matches-predicates buf ibuffer-maybe-show-predicates))) |
(ibuffer-buf-matches-predicates buf ibuffer-maybe-show-predicates))) |
1843 |
(or ibuffer-view-ibuffer |
(or ibuffer-view-ibuffer |
1844 |
(and ibuffer-buf |
(and ibuffer-buf |
1845 |
(not (eq ibuffer-buf buf)))))) |
(not (eq ibuffer-buf buf)))))) |
1846 |
|
|
1847 |
;; This function is a special case; it's not defined by |
;; This function is a special case; it's not defined by |
1893 |
(min (cadr element)) |
(min (cadr element)) |
1894 |
;; (max (caddr element)) |
;; (max (caddr element)) |
1895 |
(align (cadddr element))) |
(align (cadddr element))) |
1896 |
;; Ignore a negative min when we're inserting the title |
;; Ignore a negative min when we're inserting the title |
1897 |
(when (minusp min) |
(when (minusp min) |
1898 |
(setq min (- min))) |
(setq min (- min))) |
1899 |
(let* ((name (or (get sym 'ibuffer-column-name) |
(let* ((name (or (get sym 'ibuffer-column-name) |
1982 |
|
|
1983 |
(defun ibuffer-redisplay (&optional silent) |
(defun ibuffer-redisplay (&optional silent) |
1984 |
"Redisplay the current list of buffers. |
"Redisplay the current list of buffers. |
|
|
|
1985 |
This does not show new buffers; use `ibuffer-update' for that. |
This does not show new buffers; use `ibuffer-update' for that. |
1986 |
|
|
1987 |
If SILENT is non-`nil', do not generate progress messages." |
If optional arg SILENT is non-nil, do not display progress messages." |
1988 |
(interactive) |
(interactive) |
1989 |
(ibuffer-forward-line 0) |
(ibuffer-forward-line 0) |
1990 |
(unless silent |
(unless silent |
2003 |
|
|
2004 |
(defun ibuffer-update (arg &optional silent) |
(defun ibuffer-update (arg &optional silent) |
2005 |
"Regenerate the list of all buffers. |
"Regenerate the list of all buffers. |
|
|
|
2006 |
Display buffers whose name matches one of `ibuffer-maybe-show-predicates' |
Display buffers whose name matches one of `ibuffer-maybe-show-predicates' |
2007 |
iff arg ARG is non-nil. |
iff arg ARG is non-nil. |
2008 |
|
|
2009 |
Do not display messages if SILENT is non-nil." |
If optional arg SILENT is non-nil, do not display progress messages." |
2010 |
(interactive "P") |
(interactive "P") |
2011 |
(ibuffer-forward-line 0) |
(ibuffer-forward-line 0) |
2012 |
(let* ((bufs (buffer-list)) |
(let* ((bufs (buffer-list)) |
2013 |
(blist (ibuffer-filter-buffers |
(blist (ibuffer-filter-buffers |
2014 |
(current-buffer) |
(current-buffer) |
2015 |
(if (and |
(if (and |
2016 |
(cadr bufs) |
(cadr bufs) |
2017 |
(eq ibuffer-always-show-last-buffer |
(eq ibuffer-always-show-last-buffer |
2018 |
:nomini) |
:nomini) |
2019 |
;; This is a hack. |
(minibufferp (cadr bufs))) |
2020 |
(string-match " \\*Minibuf" |
(caddr bufs) |
2021 |
(buffer-name (cadr bufs)))) |
(cadr bufs)) |
2022 |
(caddr bufs) |
(ibuffer-current-buffers-with-marks bufs) |
2023 |
(cadr bufs)) |
arg))) |
|
(ibuffer-current-buffers-with-marks bufs) |
|
|
arg))) |
|
2024 |
(when (null blist) |
(when (null blist) |
2025 |
(if (and (featurep 'ibuf-ext) |
(if (and (featurep 'ibuf-ext) |
2026 |
ibuffer-filtering-qualifiers) |
ibuffer-filtering-qualifiers) |
2201 |
(unwind-protect |
(unwind-protect |
2202 |
(progn |
(progn |
2203 |
(setq buffer-read-only nil) |
(setq buffer-read-only nil) |
2204 |
(run-hooks 'ibuffer-hooks)) |
(run-hooks 'ibuffer-hook)) |
2205 |
(setq buffer-read-only t)) |
(setq buffer-read-only t)) |
2206 |
(unless ibuffer-expert |
(unless ibuffer-expert |
2207 |
(message "Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help")))))) |
(message "Commands: m, u, t, RET, g, k, S, D, Q; q to quit; h for help")))))) |
2274 |
Filtering commands: |
Filtering commands: |
2275 |
|
|
2276 |
'\\[ibuffer-filter-by-mode]' - Add a filter by major mode. |
'\\[ibuffer-filter-by-mode]' - Add a filter by major mode. |
2277 |
|
'\\[ibuffer-filter-by-used-mode]' - Add a filter by major mode now in use. |
2278 |
'\\[ibuffer-filter-by-name]' - Add a filter by buffer name. |
'\\[ibuffer-filter-by-name]' - Add a filter by buffer name. |
2279 |
'\\[ibuffer-filter-by-content]' - Add a filter by buffer content. |
'\\[ibuffer-filter-by-content]' - Add a filter by buffer content. |
2280 |
'\\[ibuffer-filter-by-filename]' - Add a filter by filename. |
'\\[ibuffer-filter-by-filename]' - Add a filter by filename. |
2300 |
'\\[ibuffer-save-filter-groups]' - Save the current groups with a name. |
'\\[ibuffer-save-filter-groups]' - Save the current groups with a name. |
2301 |
'\\[ibuffer-switch-to-saved-filter-groups]' - Restore previously saved groups. |
'\\[ibuffer-switch-to-saved-filter-groups]' - Restore previously saved groups. |
2302 |
'\\[ibuffer-delete-saved-filter-groups]' - Delete previously saved groups. |
'\\[ibuffer-delete-saved-filter-groups]' - Delete previously saved groups. |
2303 |
|
|
2304 |
Sorting commands: |
Sorting commands: |
2305 |
|
|
2306 |
'\\[ibuffer-toggle-sorting-mode]' - Rotate between the various sorting modes. |
'\\[ibuffer-toggle-sorting-mode]' - Rotate between the various sorting modes. |
2391 |
;; This makes things less ugly for Emacs 21 users with a non-nil |
;; This makes things less ugly for Emacs 21 users with a non-nil |
2392 |
;; `show-trailing-whitespace'. |
;; `show-trailing-whitespace'. |
2393 |
(setq show-trailing-whitespace nil) |
(setq show-trailing-whitespace nil) |
2394 |
|
;; disable `show-paren-mode' buffer-locally |
2395 |
|
(if (bound-and-true-p show-paren-mode) |
2396 |
|
(set (make-local-variable 'show-paren-mode) nil)) |
2397 |
(set (make-local-variable 'revert-buffer-function) |
(set (make-local-variable 'revert-buffer-function) |
2398 |
#'ibuffer-update) |
#'ibuffer-update) |
|
;; Only use font-core.el. |
|
|
(set (make-local-variable 'font-lock-defaults) |
|
|
'(nil t nil nil nil (font-lock-core-only . t))) |
|
2399 |
(set (make-local-variable 'ibuffer-sorting-mode) |
(set (make-local-variable 'ibuffer-sorting-mode) |
2400 |
ibuffer-default-sorting-mode) |
ibuffer-default-sorting-mode) |
2401 |
(set (make-local-variable 'ibuffer-sorting-reversep) |
(set (make-local-variable 'ibuffer-sorting-reversep) |
2411 |
(set (make-local-variable 'ibuffer-cached-eliding-string) nil) |
(set (make-local-variable 'ibuffer-cached-eliding-string) nil) |
2412 |
(set (make-local-variable 'ibuffer-cached-elide-long-columns) nil) |
(set (make-local-variable 'ibuffer-cached-elide-long-columns) nil) |
2413 |
(set (make-local-variable 'ibuffer-current-format) nil) |
(set (make-local-variable 'ibuffer-current-format) nil) |
|
(set (make-local-variable 'ibuffer-did-modifiction) nil) |
|
2414 |
(set (make-local-variable 'ibuffer-delete-window-on-quit) nil) |
(set (make-local-variable 'ibuffer-delete-window-on-quit) nil) |
2415 |
(set (make-local-variable 'ibuffer-did-modification) nil) |
(set (make-local-variable 'ibuffer-did-modification) nil) |
2416 |
(set (make-local-variable 'ibuffer-tmp-hide-regexps) nil) |
(set (make-local-variable 'ibuffer-tmp-hide-regexps) nil) |
2420 |
(ibuffer-update-format) |
(ibuffer-update-format) |
2421 |
(when ibuffer-default-directory |
(when ibuffer-default-directory |
2422 |
(setq default-directory ibuffer-default-directory)) |
(setq default-directory ibuffer-default-directory)) |
2423 |
(run-hooks 'ibuffer-mode-hooks) |
(add-hook 'change-major-mode-hook 'font-lock-defontify nil t) |
2424 |
|
(run-hooks 'ibuffer-mode-hook) |
2425 |
;; called after mode hooks to allow the user to add filters |
;; called after mode hooks to allow the user to add filters |
2426 |
(ibuffer-update-mode-name)) |
(ibuffer-update-mode-name)) |
2427 |
|
|
2428 |
(provide 'ibuffer) |
(provide 'ibuffer) |
2429 |
|
|
2430 |
|
(run-hooks 'ibuffer-load-hook) |
2431 |
|
|
2432 |
;; Local Variables: |
;; Local Variables: |
2433 |
;; coding: iso-8859-1 |
;; coding: iso-8859-1 |
2434 |
;; End: |
;; End: |