]> code.delx.au - gnu-emacs/blobdiff - lisp/ibuffer.el
Remove code for defunct system-types emx, macos, mswindows,
[gnu-emacs] / lisp / ibuffer.el
index 7708c4dc49eb10254f84115bfd1e8a0f2044814f..4339a29b44b7acdd45e8189f93d013194545792f 100644 (file)
@@ -1,7 +1,7 @@
 ;;; ibuffer.el --- operate on buffers like dired
 
-;; Copyright (C) 2000, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+;;   200 Free Software Foundation, Inc.
 
 ;; Author: Colin Walters <walters@verbum.org>
 ;; Maintainer: John Paul Wallington <jpw@gnu.org>
 (defvar ibuffer-tmp-hide-regexps)
 (defvar ibuffer-tmp-show-regexps)
 
-(declare-function ibuffer-mark-on-buffer "ibuf-ext" 
+(declare-function ibuffer-mark-on-buffer "ibuf-ext"
                  (func &optional ibuffer-mark-on-buffer-mark group))
 (declare-function ibuffer-format-qualifier "ibuf-ext" (qualifier))
-(declare-function ibuffer-generate-filter-groups "ibuf-ext" 
+(declare-function ibuffer-generate-filter-groups "ibuf-ext"
                  (bmarklist &optional noempty nodefault))
 (declare-function ibuffer-format-filter-group-data "ibuf-ext" (filter))
 
@@ -410,6 +410,8 @@ directory, like `default-directory'."
     (define-key map (kbd "=") 'ibuffer-diff-with-file)
     (define-key map (kbd "j") 'ibuffer-jump-to-buffer)
     (define-key map (kbd "M-g") 'ibuffer-jump-to-buffer)
+    (define-key map (kbd "M-s a C-s") 'ibuffer-do-isearch)
+    (define-key map (kbd "M-s a M-C-s") 'ibuffer-do-isearch-regexp)
     (define-key map (kbd "DEL") 'ibuffer-unmark-backward)
     (define-key map (kbd "M-DEL") 'ibuffer-unmark-all)
     (define-key map (kbd "* *") 'ibuffer-unmark-all)
@@ -1091,7 +1093,8 @@ one window."
        (line (+ 1 (count-lines 1 (point)))))
     (bury-buffer buf)
     (ibuffer-update nil t)
-    (goto-line line)))
+    (goto-char (point-min))
+    (forward-line (1- line))))
 
 (defun ibuffer-visit-tags-table ()
   "Visit the tags table in the buffer on this line.  See `visit-tags-table'."
@@ -1151,6 +1154,9 @@ a new window in the current frame, splitting vertically."
     (ibuffer-redisplay t)))
 
 (defun ibuffer-shrink-to-fit (&optional owin)
+  ;; Make sure that redisplay is performed, otherwise there can be a
+  ;; bad interaction with code in the window-scroll-functions hook
+  (redisplay t)
   (fit-window-to-buffer nil (when owin (/ (frame-height)
                                          (length (window-list (selected-frame)))))))
 
@@ -1233,6 +1239,18 @@ a new window in the current frame, splitting vertically."
 (defsubst ibuffer-map-deletion-lines (func)
   (ibuffer-map-on-mark ibuffer-deletion-char func))
 
+(defsubst ibuffer-assert-ibuffer-mode ()
+  (assert (derived-mode-p 'ibuffer-mode)))
+
+(defun ibuffer-buffer-file-name ()
+  (or buffer-file-name
+      (let ((dirname (or (and (boundp 'dired-directory)
+                             (if (stringp dired-directory)
+                                 dired-directory
+                               (car dired-directory)))
+                        (bound-and-true-p list-buffers-directory))))
+       (and dirname (expand-file-name dirname)))))
+
 (define-ibuffer-op ibuffer-do-save ()
   "Save marked buffers as with `save-buffer'."
   (:complex t
@@ -1354,7 +1372,7 @@ If point is on a group name, this function operates on that group."
   (ibuffer-mark-interactive arg ?\s -1))
 
 (defun ibuffer-mark-interactive (arg mark movement)
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (or arg (setq arg 1))
   (ibuffer-forward-line 0)
   (ibuffer-aif (get-text-property (point) 'ibuffer-filter-group-name)
@@ -1369,7 +1387,7 @@ If point is on a group name, this function operates on that group."
        (setq arg (1- arg))))))
 
 (defun ibuffer-set-mark (mark)
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (let ((inhibit-read-only t))
     (ibuffer-set-mark-1 mark)
     (setq ibuffer-did-modification t)
@@ -1753,14 +1771,7 @@ If point is on a group name, this function operates on that group."
             (t (format "%d files" total))))))
   (let ((directory-abbrev-alist ibuffer-directory-abbrev-alist))
     (abbreviate-file-name
-     (or buffer-file-name
-        (and (boundp 'dired-directory)
-             (if (stringp dired-directory)
-                 dired-directory
-               (car dired-directory)))
-        (and (eq major-mode 'vc-dir-mode)
-             (bound-and-true-p default-directory))
-        ""))))
+     (or (ibuffer-buffer-file-name) ""))))
 
 (define-ibuffer-column filename-and-process
   (:name "Filename/Process"
@@ -1818,7 +1829,7 @@ If point is on a group name, this function operates on that group."
 
 (defun ibuffer-insert-buffer-line (buffer mark format)
   "Insert a line describing BUFFER and MARK using FORMAT."
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (let ((beg (point)))
     (funcall format buffer mark)
     (put-text-property beg (point) 'ibuffer-properties (list buffer mark)))
@@ -1827,7 +1838,7 @@ If point is on a group name, this function operates on that group."
 ;; This function knows a bit too much of the internals.  It would be
 ;; nice if it was all abstracted away.
 (defun ibuffer-redisplay-current ()
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (when (eobp)
     (forward-line -1))
   (beginning-of-line)
@@ -1861,7 +1872,7 @@ buffers in filtering group GROUP.
 
 FUNCTION is called with two arguments:
 the buffer object itself and the current mark symbol."
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (ibuffer-forward-line 0)
   (let* ((orig-target-line (1+ (count-lines (save-excursion
                                              (goto-char (point-min))
@@ -2010,7 +2021,7 @@ the value of point at the beginning of the line for that buffer."
 (defun ibuffer-switch-format ()
   "Switch the current display format."
   (interactive)
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (unless (consp ibuffer-formats)
     (error "Ibuffer error: No formats!"))
   (setq ibuffer-current-format
@@ -2021,7 +2032,7 @@ the value of point at the beginning of the line for that buffer."
   (ibuffer-redisplay t))
 
 (defun ibuffer-update-title-and-summary (format)
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   ;; Don't do funky font-lock stuff here
   (let ((after-change-functions nil))
     (if (get-text-property (point-min) 'ibuffer-title)
@@ -2056,7 +2067,7 @@ the value of point at the beginning of the line for that buffer."
                                  name)))
                  (when hmap
                    (setq
-                    strname 
+                    strname
                     (propertize strname 'mouse-face 'highlight 'keymap hmap)))
                  strname)))))
         (add-text-properties opos (point) `(ibuffer-title-header t))
@@ -2181,6 +2192,9 @@ If optional arg SILENT is non-nil, do not display progress messages."
              ibuffer-header-line-format)))
 
 (defun ibuffer-sort-bufferlist (bmarklist)
+  (unless ibuffer-sorting-functions-alist
+    ;; make sure the sorting functions are loaded
+    (require 'ibuf-ext))
   (let* ((sortdat (assq ibuffer-sorting-mode
                        ibuffer-sorting-functions-alist))
         (func (caddr sortdat)))
@@ -2225,7 +2239,7 @@ If optional arg SILENT is non-nil, do not display progress messages."
      name)))
 
 (defun ibuffer-redisplay-engine (bmarklist &optional ignore)
-  (assert (eq major-mode 'ibuffer-mode))
+  (ibuffer-assert-ibuffer-mode)
   (let* ((--ibuffer-insert-buffers-and-marks-format
          (ibuffer-current-format))
         (--ibuffer-expanded-format (mapcar #'ibuffer-expand-format-entry
@@ -2267,7 +2281,8 @@ If optional arg SILENT is non-nil, do not display progress messages."
       (setq buffer-read-only t)
       (set-buffer-modified-p ibuffer-did-modification)
       (setq ibuffer-did-modification nil)
-      (goto-line (1+ orig)))))
+      (goto-char (point-min))
+      (forward-line orig))))
 
 (defun ibuffer-quit ()
   "Quit this `ibuffer' session.
@@ -2370,6 +2385,8 @@ Operations on marked buffers:
   '\\[ibuffer-do-revert]' - Revert the marked buffers.
   '\\[ibuffer-do-toggle-read-only]' - Toggle read-only state of marked buffers.
   '\\[ibuffer-do-delete]' - Kill the marked buffers.
+  '\\[ibuffer-do-isearch]' - Do incremental search in the marked buffers.
+  '\\[ibuffer-do-isearch-regexp]' - Isearch for regexp in the marked buffers.
   '\\[ibuffer-do-replace-regexp]' - Replace by regexp in each of the marked
           buffers.
   '\\[ibuffer-do-query-replace]' - Query replace in each of the marked buffers.