# HG changeset patch # User John Paul Wallington # Date 1057404115 0 # Node ID 09f746b0e2099c7c96c2a9965f06e877b14446ee # Parent b9b903974028d21d59bbfbdf00043cab904155b2 (ibuffer-backward-line, ibuffer-forward-line) (ibuffer-mark-interactive): Use `or' instead of `unless'. (define-ibuffer-column name): Add summarizer. (define-ibuffer-column size): Likewise. (define-ibuffer-column filename): Likewise. (define-ibuffer-column process): Likewise. Change BODY's output too. (define-ibuffer-column filename-and-process): Likewise, likewise. (ibuffer): Remove local vars `already-in' and `need-update'. diff -r b9b903974028 -r 09f746b0e209 lisp/ibuffer.el --- a/lisp/ibuffer.el Sat Jul 05 11:20:30 2003 +0000 +++ b/lisp/ibuffer.el Sat Jul 05 11:21:55 2003 +0000 @@ -757,11 +757,13 @@ (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))) + :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))) + :enable (and (featurep 'ibuf-ext) + ibuffer-filter-group-kill-ring))) (defvar ibuffer-name-map (let ((map (make-sparse-keymap))) @@ -904,15 +906,15 @@ (defun ibuffer-backward-line (&optional arg skip-group-names) "Move backwards ARG lines, wrapping around the list if necessary." (interactive "P") - (unless arg - (setq arg 1)) + (or arg (setq arg 1)) (beginning-of-line) (while (> arg 0) (forward-line -1) (when (and ibuffer-movement-cycle (or (get-text-property (point) 'ibuffer-title) (and skip-group-names - (get-text-property (point) 'ibuffer-filter-group-name)))) + (get-text-property (point) + 'ibuffer-filter-group-name)))) (goto-char (point-max)) (beginning-of-line)) (ibuffer-skip-properties (append '(ibuffer-summary) @@ -928,8 +930,7 @@ (defun ibuffer-forward-line (&optional arg skip-group-names) "Move forward ARG lines, wrapping around the list if necessary." (interactive "P") - (unless arg - (setq arg 1)) + (or arg (setq arg 1)) (beginning-of-line) (when (and ibuffer-movement-cycle (or (eobp) @@ -1266,8 +1267,7 @@ (defun ibuffer-mark-interactive (arg mark movement) (assert (eq major-mode 'ibuffer-mode)) - (unless arg - (setq arg 1)) + (or arg (setq arg 1)) (ibuffer-forward-line 0) (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name) (progn @@ -1391,7 +1391,7 @@ (defun ibuffer-compile-make-format-form (strvar widthform alignment) (let* ((left `(make-string tmp2 ? )) - (right `(make-string (- tmp1 tmp2) ? ))) + (right `(make-string (- tmp1 tmp2) ? ))) `(progn (setq tmp1 ,widthform tmp2 (/ tmp1 2)) @@ -1602,7 +1602,7 @@ (define-ibuffer-column read-only (:name "R" :inline t) (if buffer-read-only - "%" + (string ibuffer-read-only-char) " ")) (define-ibuffer-column modified (:name "M" :inline t) @@ -1610,16 +1610,33 @@ (string ibuffer-modified-char) " ")) -(define-ibuffer-column name (:inline t - :props - ('mouse-face 'highlight 'keymap ibuffer-name-map - 'ibuffer-name-column t - 'help-echo '(if tooltip-mode - "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer" - "mouse-1: mark buffer mouse-2: select buffer mouse-3: operate"))) +(define-ibuffer-column name + (:inline t + :props + ('mouse-face 'highlight 'keymap ibuffer-name-map + 'ibuffer-name-column t + 'help-echo '(if tooltip-mode + "mouse-1: mark this buffer\nmouse-2: select this buffer\nmouse-3: operate on this buffer" + "mouse-1: mark buffer mouse-2: select buffer mouse-3: operate")) + :summarizer + (lambda (strings) + (let ((bufs (length strings))) + (cond ((zerop bufs) "No buffers") + ((= 1 bufs) "1 buffer") + (t (format "%s buffers" bufs)))))) (propertize (buffer-name) 'font-lock-face (ibuffer-buffer-name-face buffer mark))) -(define-ibuffer-column size (:inline t) +(define-ibuffer-column size + (:inline t + :summarizer + (lambda (column-strings) + (let ((total 0)) + (dolist (string column-strings) + (setq total + ;; like, ewww ... + (+ (float (string-to-int string)) + total))) + (format "%.0f" total)))) (format "%s" (buffer-size))) (define-ibuffer-column mode (:inline t @@ -1629,12 +1646,24 @@ 'help-echo "mouse-2: filter by this mode")) (format "%s" mode-name)) -(define-ibuffer-column process () +(define-ibuffer-column process + (:summarizer + (lambda (strings) + (let ((total (length (delete "" strings)))) + (cond ((zerop total) "No processes") + ((= 1 total) "1 process") + (t (format "%d processes" total)))))) (ibuffer-aif (get-buffer-process buffer) (format "(%s %s)" it (process-status it)) - "none")) + "")) -(define-ibuffer-column filename () +(define-ibuffer-column filename + (:summarizer + (lambda (strings) + (let ((total (length (delete "" strings)))) + (cond ((zerop total) "No files") + ((= 1 total) "1 file") + (t (format "%d files" total)))))) (let ((directory-abbrev-alist ibuffer-directory-abbrev-alist)) (abbreviate-file-name (or buffer-file-name @@ -1642,13 +1671,34 @@ dired-directory) "")))) -(define-ibuffer-column filename-and-process (:name "Filename/Process") +(define-ibuffer-column filename-and-process + (:name "Filename/Process" + :summarizer + (lambda (strings) + (setq strings (delete "" strings)) + (let ((procs 0) + (files 0)) + (dolist (string strings) + (if (string-match "\\(\?:\\`(\[\[:ascii:\]\]\+)\\)" string) + (progn (setq procs (1+ procs)) + (if (< (match-end 0) (length string)) + (setq files (1+ files)))) + (setq files (1+ files)))) + (concat (cond ((zerop files) "No files") + ((= 1 files) "1 file") + (t (format "%d files" files))) + ", " + (cond ((zerop procs) "no processes") + ((= 1 procs) "1 process") + (t (format "%d processes" procs))))))) (let ((proc (get-buffer-process buffer)) (filename (ibuffer-make-column-filename buffer mark))) (if proc - (concat (propertize (format "(%s %s) " proc (process-status proc)) + (concat (propertize (format "(%s %s)" proc (process-status proc)) 'font-lock-face 'italic) - filename) + (if (> (length filename) 0) + (format " %s" filename) + "")) filename))) (defun ibuffer-format-column (str width alignment) @@ -2182,9 +2232,7 @@ (interactive "P") (when ibuffer-use-other-window (setq other-window-p t)) - (let* ((buf (get-buffer-create (or name "*Ibuffer*"))) - (already-in (eq (current-buffer) buf)) - (need-update nil)) + (let ((buf (get-buffer-create (or name "*Ibuffer*")))) (if other-window-p (funcall (if noselect #'(lambda (buf) (display-buffer buf t)) #'pop-to-buffer) buf) (funcall (if noselect #'display-buffer #'switch-to-buffer) buf)) @@ -2193,9 +2241,8 @@ ;; We switch to the buffer's window in order to be able ;; to modify the value of point (select-window (get-buffer-window buf)) - (unless (eq major-mode 'ibuffer-mode) - (ibuffer-mode) - (setq need-update t)) + (or (eq major-mode 'ibuffer-mode) + (ibuffer-mode)) (setq ibuffer-delete-window-on-quit other-window-p) (when shrink (setq ibuffer-shrink-to-minimum-size shrink))