diff options
author | John Paul Wallington <jpw@pobox.com> | 2003-01-24 04:54:17 +0000 |
---|---|---|
committer | John Paul Wallington <jpw@pobox.com> | 2003-01-24 04:54:17 +0000 |
commit | 4e4a724c11389875ad6842f3a37febd0081f7307 (patch) | |
tree | 4bcf3a7e7b65984cd8b46adcddcc41931f03417c /lisp/ibuffer.el | |
parent | 2a026b0452500dff9772640365ff9a91510939ba (diff) | |
download | emacs-4e4a724c11389875ad6842f3a37febd0081f7307.tar.gz |
* ibuffer.el (ibuffer-window-list): Remove.
(ibuffer-confirm-operation-on): Use `window-list' instead.
(ibuffer-load-hook): New customizable variable.
(toplevel): Run it.
(ibuffer-customize): New command.
(ibuffer-mode-map): Bind it.
(ibuffer-mode-map): Add menu seperator in View>Sort menu.
(ibuffer-mode): Tidy.
(ibuffer-fontification-alist, ibuffer-always-show-last-buffer)
(ibuffer-default-directory, ibuffer-default-sorting-mode)
(ibuffer-maybe-show-predicates, ibuffer-hook, ibuffer-mode-hook)
(ibuffer-map-lines): Doc fixes.
Update mail address.
* ibuf-ext.el (ibuffer-copy-filename-as-kill): C-u means relative
filenames. Use `kill-new'.
Update mail address.
* ibuf-macs.el
Update mail address.
Diffstat (limited to 'lisp/ibuffer.el')
-rw-r--r-- | lisp/ibuffer.el | 259 |
1 files changed, 132 insertions, 127 deletions
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el index 0fa9207bf54..9fa551e3718 100644 --- a/lisp/ibuffer.el +++ b/lisp/ibuffer.el @@ -3,7 +3,7 @@ ;; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ;; Author: Colin Walters <walters@verbum.org> -;; Maintainer: John Paul Wallington <jpw@shootybangbang.com> +;; Maintainer: John Paul Wallington <jpw@gnu.org> ;; Created: 8 Sep 2000 ;; Keywords: buffer, convenience @@ -39,16 +39,6 @@ (require 'font-lock) -;;; 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))))) - (defgroup ibuffer nil "An advanced replacement for `buffer-menu'. @@ -148,7 +138,7 @@ buffer, and FACE is the face to use for fontification. If the FORM evaluates to non-nil, then FACE will be put on the buffer name. The element with the highest PRIORITY takes precedence. -If you change this variable, you must kill the ibuffer buffer and +If you change this variable, you must kill the Ibuffer buffer and recreate it for the change to take effect." :type '(repeat (list (integer :tag "Priority") @@ -180,8 +170,8 @@ recreate it for the change to take effect." (defcustom ibuffer-default-sorting-mode 'recency "The criteria by which to sort the buffers. -Note that this variable is local to each ibuffer buffer. Thus, you -can have multiple ibuffer buffers open, each with a different sorted +Note that this variable is local to each Ibuffer buffer. Thus, you +can have multiple Ibuffer buffers open, each with a different sorted view of the buffers." :type '(choice (const :tag "Last view time" :value recency) (const :tag "Lexicographic" :value alphabetic) @@ -211,7 +201,9 @@ This variable is deprecated; use the :elide argument of (defcustom ibuffer-maybe-show-predicates `(,(lambda (buf) (and (string-match "^ " (buffer-name buf)) (null buffer-file-name)))) - "A list of predicates (a regexp or function) for buffers to display conditionally. + "A list of predicates for buffers to display conditionally. + +A predicate can be a regexp or a function. If a regexp, then it will be matched against the buffer's name. If a function, it will be called with the buffer as an argument, and should return non-nil if this buffer should be shown. @@ -263,8 +255,8 @@ state, size, etc." :group 'ibuffer) (defcustom ibuffer-always-show-last-buffer nil - "If non-nil, always display the previous buffer. This variable -takes precedence over filtering, and even + "If non-nil, always display the previous buffer. +This variable takes precedence over filtering, and even `ibuffer-never-show-predicates'." :type '(choice (const :tag "Always" :value t) (const :tag "Never" :value nil) @@ -277,7 +269,7 @@ takes precedence over filtering, and even :group 'ibuffer) (defcustom ibuffer-default-directory nil - "The default directory to use for a new ibuffer buffer. + "The default directory to use for a new Ibuffer buffer. If nil, inherit the directory of the buffer in which `ibuffer' was called. Otherwise, this variable should be a string naming a directory, like `default-directory'." @@ -285,24 +277,29 @@ directory, like `default-directory'." string) :group 'ibuffer) -(defcustom ibuffer-help-buffer-modes '(help-mode apropos-mode - Info-mode Info-edit-mode) +(defcustom ibuffer-help-buffer-modes + '(help-mode apropos-mode Info-mode Info-edit-mode) "List of \"Help\" major modes." :type '(repeat function) :group 'ibuffer) (defcustom ibuffer-hook nil - "Hooks run when `ibuffer' is called." + "Hook run when `ibuffer' is called." :type 'hook :group 'ibuffer) (defvaralias 'ibuffer-hooks 'ibuffer-hook) (defcustom ibuffer-mode-hook nil - "Hooks run upon entry into `ibuffer-mode'." + "Hook run upon entry into `ibuffer-mode'." :type 'hook :group 'ibuffer) (defvaralias 'ibuffer-mode-hooks 'ibuffer-mode-hook) +(defcustom ibuffer-load-hook nil + "Hook run when Ibuffer is loaded." + :type 'hook + :group 'ibuffer) + (defcustom ibuffer-marked-face 'font-lock-warning-face "Face used for displaying marked buffers." :type 'face @@ -331,6 +328,7 @@ directory, like `default-directory'." (regexp :tag "To"))) :group 'ibuffer) + (defvar ibuffer-mode-map nil) (defvar ibuffer-mode-operate-map nil) (defvar ibuffer-mode-groups-popup nil) @@ -509,6 +507,8 @@ directory, like `default-directory'." (define-key-after map [menu-bar view sort do-sort-by-recency] '(menu-item "Sort by view time" ibuffer-do-sort-by-recency :help "Sort by the last time the buffer was displayed")) + (define-key-after map [menu-bar view sort dashes] + '("--")) (define-key-after map [menu-bar view sort invert-sorting] '(menu-item "Reverse sorting order" ibuffer-invert-sorting)) (define-key-after map [menu-bar view sort toggle-sorting-mode] @@ -558,7 +558,7 @@ directory, like `default-directory'." (cdr ibuffer-filtering-qualifiers)))) (define-key-after map [menu-bar view filter save-filters] '(menu-item "Save current filters permanently..." ibuffer-save-filters - :enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers) + :enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers) :help "Use a mnemnonic name to store current filter stack")) (define-key-after map [menu-bar view filter switch-to-saved-filters] '(menu-item "Restore permanently saved filters..." ibuffer-switch-to-saved-filters @@ -581,7 +581,7 @@ directory, like `default-directory'." :enable (and (featurep 'ibuf-ext) ibuffer-filtering-qualifiers))) (define-key-after groups-map [forward-filter-group] '(menu-item "Move point to the next filter group" - ibuffer-forward-filter-group)) + ibuffer-forward-filter-group)) (define-key-after groups-map [backward-filter-group] '(menu-item "Move point to the previous filter group" ibuffer-backward-filter-group)) @@ -618,7 +618,7 @@ directory, like `default-directory'." '(menu-item "Restore permanently saved filters..." ibuffer-switch-to-saved-filter-groups :enable (and (featurep 'ibuf-ext) ibuffer-saved-filter-groups) - :help "Replace current filters with a saved stack")) + :help "Replace current filters with a saved stack")) (define-key-after groups-map [delete-saved-filter-groups] '(menu-item "Delete permanently saved filter groups..." ibuffer-delete-saved-filter-groups @@ -639,8 +639,7 @@ directory, like `default-directory'." '(menu-item "Toggle Auto Mode" ibuffer-auto-mode :help "Attempt to automatically update the Ibuffer buffer")) (define-key-after map [menu-bar view customize] - '(menu-item "Customize Ibuffer" (lambda () (interactive) - (customize-group 'ibuffer)) + '(menu-item "Customize Ibuffer" ibuffer-customize :help "Use Custom to customize Ibuffer")) (define-key-after map [menu-bar mark] @@ -751,14 +750,14 @@ directory, like `default-directory'." ibuffer-mode-groups-popup (copy-keymap groups-map)))) (define-key ibuffer-mode-groups-popup [kill-filter-group] - '(menu-item "Kill filter group" - ibuffer-kill-line - :enable (and (featurep 'ibuf-ext) ibuffer-filter-groups))) + '(menu-item "Kill filter group" + ibuffer-kill-line + :enable (and (featurep 'ibuf-ext) ibuffer-filter-groups))) (define-key ibuffer-mode-groups-popup [yank-filter-group] - '(menu-item "Yank last killed filter group" - ibuffer-yank - :enable (and (featurep 'ibuf-ext) ibuffer-filter-group-kill-ring))) - + '(menu-item "Yank last killed filter group" + ibuffer-yank + :enable (and (featurep 'ibuf-ext) ibuffer-filter-group-kill-ring))) + (defvar ibuffer-name-map nil) (unless ibuffer-name-map (let ((map (make-sparse-keymap))) @@ -875,13 +874,13 @@ width and the longest string in LIST." (popup-menu ibuffer-mode-groups-popup)) (let ((inhibit-read-only t)) (ibuffer-save-marks - ;; hm. we could probably do this in a better fashion - (ibuffer-unmark-all ?\r) - (save-excursion - (goto-char eventpt) - (ibuffer-set-mark ibuffer-marked-char)) - (save-excursion - (popup-menu ibuffer-mode-operate-map))))) + ;; hm. we could probably do this in a better fashion + (ibuffer-unmark-all ?\r) + (save-excursion + (goto-char eventpt) + (ibuffer-set-mark ibuffer-marked-char)) + (save-excursion + (popup-menu ibuffer-mode-operate-map))))) (setq buffer-read-only t) (if (= eventpt (point)) (goto-char origpt))))) @@ -895,6 +894,11 @@ width and the longest string in LIST." (forward-line direction) (beginning-of-line))) +(defun ibuffer-customize () + "Begin customizing Ibuffer interactively." + (interactive) + (customize-group 'ibuffer)) + (defun ibuffer-backward-line (&optional arg skip-group-names) "Move backwards ARG lines, wrapping around the list if necessary." (interactive "P") @@ -1030,11 +1034,11 @@ a new window in the current frame, splitting vertically." (> (length marked-bufs) 3) (not (y-or-n-p (format "Really create a new frame for %s buffers? " (length marked-bufs))))) - (set-buffer-modified-p nil) + (set-buffer-modified-p nil) (delete-other-windows) (switch-to-buffer (pop marked-bufs)) (let ((height (/ (1- (if (eq type 'horizontally) (frame-width) - (frame-height))) + (frame-height))) (1+ (length marked-bufs))))) (mapcar (if (eq type 'other-frame) #'(lambda (buf) @@ -1073,7 +1077,7 @@ a new window in the current frame, splitting vertically." (ibuffer-columnize-and-insert-list names) (goto-char (point-min)) (setq buffer-read-only t)) - (let ((lastwin (car (last (ibuffer-window-list))))) + (let ((lastwin (car (last (window-list nil 'nomini))))) ;; Now attempt to display the buffer... (save-window-excursion (select-window lastwin) @@ -1090,11 +1094,11 @@ a new window in the current frame, splitting vertically." ;; Handle a failure (if (or (> (incf attempts) 4) (and (stringp (cadr err)) - ;; This definitely falls in the ghetto hack category... + ;; This definitely falls in the + ;; ghetto hack category... (not (string-match "too small" (cadr err))))) (apply #'signal err) (enlarge-window 3)))))) - ;; This part doesn't work correctly sometimes under XEmacs. (select-window (next-window)) (switch-to-buffer buf) (unwind-protect @@ -1111,7 +1115,7 @@ a new window in the current frame, splitting vertically." (defun ibuffer-buffer-names-with-mark (mark) (let ((ibuffer-buffer-names-with-mark-result nil)) (ibuffer-map-lines-nomodify - #'(lambda (buf mk) + #'(lambda (buf mk) (when (char-equal mark mk) (push (buffer-name buf) ibuffer-buffer-names-with-mark-result)))) @@ -1267,7 +1271,7 @@ If point is on a group name, this function operates on that group." (progn (require 'ibuf-ext) (ibuffer-mark-on-buffer #'identity mark it)) - (ibuffer-forward-line 0 t) + (ibuffer-forward-line 0 t) (let ((inhibit-read-only t)) (while (> arg 0) (ibuffer-set-mark mark) @@ -1338,29 +1342,29 @@ If point is on a group name, this function operates on that group." (defun ibuffer-current-format (&optional uncompiledp) (or ibuffer-current-format (setq ibuffer-current-format 0)) - (nth ibuffer-current-format (ibuffer-current-formats uncompiledp))) + (nth ibuffer-current-format (ibuffer-current-formats uncompiledp))) (defun ibuffer-expand-format-entry (form) (if (or (consp form) (symbolp form)) - (let ((sym (intern (concat "ibuffer-make-column-" - (symbol-name (if (consp form) - (car form) - form)))))) - (unless (or (fboundp sym) - (assq sym ibuffer-inline-columns)) - (error "Unknown column %s in ibuffer-formats" form)) - (let (min max align elide) - (if (consp form) - (setq min (or (nth 1 form) 0) - max (or (nth 2 form) -1) - align (or (nth 3 form) :left) - elide (or (nth 4 form) nil)) - (setq min 0 - max -1 - align :left - elide nil)) - (list sym min max align elide))) + (let ((sym (intern (concat "ibuffer-make-column-" + (symbol-name (if (consp form) + (car form) + form)))))) + (unless (or (fboundp sym) + (assq sym ibuffer-inline-columns)) + (error "Unknown column %s in ibuffer-formats" form)) + (let (min max align elide) + (if (consp form) + (setq min (or (nth 1 form) 0) + max (or (nth 2 form) -1) + align (or (nth 3 form) :left) + elide (or (nth 4 form) nil)) + (setq min 0 + max -1 + align :left + elide nil)) + (list sym min max align elide))) form)) (defun ibuffer-compile-make-eliding-form (strvar elide from-end-p) @@ -1462,19 +1466,19 @@ If point is on a group name, this function operates on that group." ;; into our generated code. Otherwise, we just ;; generate a call to the column function. (ibuffer-aif (assq sym ibuffer-inline-columns) - (nth 1 it) - `(,sym buffer mark))) + (nth 1 it) + `(,sym buffer mark))) ;; You're not expected to understand this. Hell, I ;; don't even understand it, and I wrote it five ;; minutes ago. (insertgenfn (ibuffer-aif (get sym 'ibuffer-column-summarizer) - ;; I really, really wish Emacs Lisp had closures. - (lambda (arg sym) - `(insert - (let ((ret ,arg)) - (put ',sym 'ibuffer-column-summary - (cons ret (get ',sym 'ibuffer-column-summary))) - ret))) + ;; I really, really wish Emacs Lisp had closures. + (lambda (arg sym) + `(insert + (let ((ret ,arg)) + (put ',sym 'ibuffer-column-summary + (cons ret (get ',sym 'ibuffer-column-summary))) + ret))) (lambda (arg sym) `(insert ,arg)))) (mincompform `(< strlen ,(if (integerp min) @@ -1483,40 +1487,40 @@ If point is on a group name, this function operates on that group." (maxcompform `(> strlen ,(if (integerp max) max 'max)))) - (if (or min-used max-used) - ;; The complex case, where we have to limit the - ;; form to a maximum or minimum size. - (progn - (when (and min-used (not (integerp min))) - (push `(min ,min) letbindings)) - (when (and max-used (not (integerp max))) - (push `(max ,max) letbindings)) - (push - (if (and min-used max-used) - `(if ,mincompform - ,minform - (if ,maxcompform - ,maxform)) - (if min-used - `(when ,mincompform - ,minform) - `(when ,maxcompform - ,maxform))) - outforms) - (push (append - `(setq str ,callform) - (when strlen-used - `(strlen (length str)))) - outforms) - (setq outforms - (append outforms (list (funcall insertgenfn 'str sym))))) - ;; The simple case; just insert the string. - (push (funcall insertgenfn callform sym) outforms)) - ;; Finally, return a `let' form which binds the - ;; variables in `letbindings', and contains all the - ;; code in `outforms'. - `(let ,letbindings - ,@outforms))))) + (if (or min-used max-used) + ;; The complex case, where we have to limit the + ;; form to a maximum or minimum size. + (progn + (when (and min-used (not (integerp min))) + (push `(min ,min) letbindings)) + (when (and max-used (not (integerp max))) + (push `(max ,max) letbindings)) + (push + (if (and min-used max-used) + `(if ,mincompform + ,minform + (if ,maxcompform + ,maxform)) + (if min-used + `(when ,mincompform + ,minform) + `(when ,maxcompform + ,maxform))) + outforms) + (push (append + `(setq str ,callform) + (when strlen-used + `(strlen (length str)))) + outforms) + (setq outforms + (append outforms (list (funcall insertgenfn 'str sym))))) + ;; The simple case; just insert the string. + (push (funcall insertgenfn callform sym) outforms)) + ;; Finally, return a `let' form which binds the + ;; variables in `letbindings', and contains all the + ;; code in `outforms'. + `(let ,letbindings + ,@outforms))))) result)) (setq result ;; We don't want to unconditionally load the byte-compiler. @@ -1547,7 +1551,7 @@ If point is on a group name, this function operates on that group." "Recompile `ibuffer-formats'." (interactive) (setq ibuffer-compiled-formats - (mapcar #'ibuffer-compile-format ibuffer-formats)) + (mapcar #'ibuffer-compile-format ibuffer-formats)) (when (boundp 'ibuffer-filter-format-alist) (setq ibuffer-compiled-filter-formats (mapcar #'(lambda (entry) @@ -1607,8 +1611,8 @@ If point is on a group name, this function operates on that group." (define-ibuffer-column name (:inline t :props ('mouse-face 'highlight 'keymap ibuffer-name-map - 'ibuffer-name-column t - 'help-echo "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer")) + 'ibuffer-name-column t + 'help-echo "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer")) (propertize (buffer-name) 'font-lock-face (ibuffer-buffer-name-face buffer mark))) (define-ibuffer-column size (:inline t) @@ -1617,7 +1621,7 @@ If point is on a group name, this function operates on that group." (define-ibuffer-column mode (:inline t :props ('mouse-face 'highlight - 'keymap ibuffer-mode-name-map + 'keymap ibuffer-mode-name-map 'help-echo "mouse-2: filter by this mode")) (format "%s" mode-name)) @@ -1709,8 +1713,8 @@ Don't set the ibuffer modification flag iff NOMODIFY is non-nil. If optional argument GROUP is non-nil, then only call FUNCTION on buffers in filtering group GROUP. - FUNCTION is called with four arguments: the buffer object itself, the -current mark symbol, and the beginning and ending line positions." +FUNCTION is called with two arguments: +the buffer object itself and the current mark symbol." (assert (eq major-mode 'ibuffer-mode)) (ibuffer-forward-line 0) (let* ((orig-target-line (1+ (count-lines (save-excursion @@ -1725,7 +1729,7 @@ current mark symbol, and the beginning and ending line positions." (progn (setq buffer-read-only nil) (goto-char (point-min)) - (ibuffer-forward-line 0 t) + (ibuffer-forward-line 0 t) (while (and (not (eobp)) (not (get-text-property (point) 'ibuffer-summary)) (progn @@ -1755,7 +1759,7 @@ current mark symbol, and the beginning and ending line positions." (1+ (line-end-position))) (incf ibuffer-map-lines-count) (when (< ibuffer-map-lines-total - orig-target-line) + orig-target-line) (decf target-line-offset))) (t (incf ibuffer-map-lines-count) @@ -1824,11 +1828,11 @@ the value of point at the beginning of the line for that buffer." (when ;; This takes precedence over anything else (or (and ibuffer-always-show-last-buffer - (eq last buf)) - (funcall (if ext-loaded - #'ibuffer-ext-visible-p - #'ibuffer-visible-p) - buf all ibuffer-buf)) + (eq last buf)) + (funcall (if ext-loaded + #'ibuffer-ext-visible-p + #'ibuffer-visible-p) + buf all ibuffer-buf)) e))) bmarklist)))) @@ -1837,7 +1841,7 @@ the value of point at the beginning of the line for that buffer." (not (ibuffer-buf-matches-predicates buf ibuffer-maybe-show-predicates))) (or ibuffer-view-ibuffer - (and ibuffer-buf + (and ibuffer-buf (not (eq ibuffer-buf buf)))))) ;; This function is a special case; it's not defined by @@ -1889,7 +1893,7 @@ the value of point at the beginning of the line for that buffer." (min (cadr element)) ;; (max (caddr element)) (align (cadddr element))) - ;; Ignore a negative min when we're inserting the title + ;; Ignore a negative min when we're inserting the title (when (minusp min) (setq min (- min))) (let* ((name (or (get sym 'ibuffer-column-name) @@ -2000,7 +2004,7 @@ If optional arg SILENT is non-nil, do not display progress messages." (defun ibuffer-update (arg &optional silent) "Regenerate the list of all buffers. Display buffers whose name matches one of `ibuffer-maybe-show-predicates' -iff arg ARG is non-nil. +iff arg ARG is non-nil. If optional arg SILENT is non-nil, do not display progress messages." (interactive "P") @@ -2407,7 +2411,6 @@ will be inserted before the group at point." (set (make-local-variable 'ibuffer-cached-eliding-string) nil) (set (make-local-variable 'ibuffer-cached-elide-long-columns) nil) (set (make-local-variable 'ibuffer-current-format) nil) - (set (make-local-variable 'ibuffer-did-modifiction) nil) (set (make-local-variable 'ibuffer-delete-window-on-quit) nil) (set (make-local-variable 'ibuffer-did-modification) nil) (set (make-local-variable 'ibuffer-tmp-hide-regexps) nil) @@ -2424,6 +2427,8 @@ will be inserted before the group at point." (provide 'ibuffer) +(run-hooks 'ibuffer-load-hook) + ;; Local Variables: ;; coding: iso-8859-1 ;; End: |