/[emacs]/emacs/lisp/ibuffer.el
ViewVC logotype

Diff of /emacs/lisp/ibuffer.el

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.32 by walters, Sun Jun 9 00:16:29 2002 UTC revision 1.32.2.1 by miles, Fri Apr 4 06:20:07 2003 UTC
# Line 3  Line 3 
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    
# Line 36  Line 37 
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'.
# Line 57  the ability to filter the displayed buff Line 48  the ability to filter the displayed buff
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.
# Line 133  elisp byte-compiler." Line 124  elisp byte-compiler."
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.
# Line 145  buffer, and FACE is the face to use for Line 138  buffer, and FACE is the face to use for
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")
# Line 154  recreate it for the change to take effec Line 147  recreate it for the change to take effec
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    
# Line 177  recreate it for the change to take effec Line 170  recreate it for the change to take effec
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)
# Line 208  This variable is deprecated; use the :el Line 201  This variable is deprecated; use the :el
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.
# Line 221  specialized filtering occurs before real Line 216  specialized filtering occurs before real
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
# Line 255  state, size, etc." Line 255  state, size, etc."
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)
# Line 264  takes precedence over filtering, and eve Line 264  takes precedence over filtering, and eve
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'."
# Line 278  directory, like `default-directory'." Line 277  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    
# Line 322  directory, like `default-directory'." Line 328  directory, like `default-directory'."
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)
# Line 357  directory, like `default-directory'." Line 364  directory, like `default-directory'."
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)
# Line 385  directory, like `default-directory'." Line 392  directory, like `default-directory'."
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)
# Line 417  directory, like `default-directory'." Line 425  directory, like `default-directory'."
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)
# Line 425  directory, like `default-directory'." Line 433  directory, like `default-directory'."
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)
# Line 450  directory, like `default-directory'." Line 458  directory, like `default-directory'."
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    
# Line 499  directory, like `default-directory'." Line 507  directory, like `default-directory'."
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]
# Line 513  directory, like `default-directory'." Line 523  directory, like `default-directory'."
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]
# Line 546  directory, like `default-directory'." Line 558  directory, like `default-directory'."
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
# Line 569  directory, like `default-directory'." Line 581  directory, like `default-directory'."
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))
# Line 606  directory, like `default-directory'." Line 618  directory, like `default-directory'."
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
# Line 627  directory, like `default-directory'." Line 639  directory, like `default-directory'."
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]
# Line 672  directory, like `default-directory'." Line 683  directory, like `default-directory'."
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"))
# Line 733  directory, like `default-directory'." Line 744  directory, like `default-directory'."
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)))
# Line 771  directory, like `default-directory'." Line 782  directory, like `default-directory'."
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    
# Line 856  width and the longest string in LIST." Line 865  width and the longest string in LIST."
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))
# Line 885  width and the longest string in LIST." Line 894  width and the longest string in LIST."
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")
# Line 893  width and the longest string in LIST." Line 907  width and the longest string in LIST."
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)
# Line 914  width and the longest string in LIST." Line 929  width and the longest string in LIST."
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
# Line 930  width and the longest string in LIST." Line 946  width and the longest string in LIST."
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)
# Line 941  width and the longest string in LIST." Line 958  width and the longest string in LIST."
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")
# Line 1018  a new window in the current frame, split Line 1034  a new window in the current frame, split
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)
# Line 1061  a new window in the current frame, split Line 1077  a new window in the current frame, split
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
# Line 1078  a new window in the current frame, split Line 1094  a new window in the current frame, split
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
# Line 1099  a new window in the current frame, split Line 1115  a new window in the current frame, split
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))))
# Line 1255  If point is on a group name, this functi Line 1271  If point is on a group name, this functi
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)
# Line 1322  If point is on a group name, this functi Line 1338  If point is on a group name, this functi
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)
# Line 1450  If point is on a group name, this functi Line 1466  If point is on a group name, this functi
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)
# Line 1471  If point is on a group name, this functi Line 1487  If point is on a group name, this functi
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.
# Line 1535  If point is on a group name, this functi Line 1551  If point is on a group name, this functi
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)
# Line 1550  If point is on a group name, this functi Line 1566  If point is on a group name, this functi
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!"))
# Line 1595  If point is on a group name, this functi Line 1611  If point is on a group name, this functi
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    
# Line 1682  If point is on a group name, this functi Line 1698  If point is on a group name, this functi
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)
# Line 1697  Don't set the ibuffer modification flag Line 1713  Don't set the ibuffer modification flag
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
# Line 1713  current mark symbol, and the beginning a Line 1729  current mark symbol, and the beginning a
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
# Line 1743  current mark symbol, and the beginning a Line 1759  current mark symbol, and the beginning a
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)
# Line 1801  the value of point at the beginning of t Line 1817  the value of point at the beginning of t
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
# Line 1812  the value of point at the beginning of t Line 1828  the value of point at the beginning of t
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    
# Line 1825  the value of point at the beginning of t Line 1841  the value of point at the beginning of t
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
# Line 1877  the value of point at the beginning of t Line 1893  the value of point at the beginning of t
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)
# Line 1966  the value of point at the beginning of t Line 1982  the value of point at the beginning of t
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
# Line 1988  If SILENT is non-`nil', do not generate Line 2003  If SILENT is non-`nil', do not generate
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)
# Line 2189  locally in this buffer." Line 2201  locally in this buffer."
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"))))))
# Line 2262  Marking commands: Line 2274  Marking commands:
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.
# Line 2287  Filter group commands: Line 2300  Filter group commands:
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.
# Line 2378  will be inserted before the group at poi Line 2391  will be inserted before the group at poi
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)
# Line 2398  will be inserted before the group at poi Line 2411  will be inserted before the group at poi
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)
# Line 2408  will be inserted before the group at poi Line 2420  will be inserted before the group at poi
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:

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.32.2.1

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26