(function-key-map): Use char-names more consistently.
[bpt/emacs.git] / lisp / buff-menu.el
index 6512e09..8e1a3e6 100644 (file)
@@ -1,7 +1,7 @@
-;;; buff-menu.el --- buffer menu main function and support functions
+;;; buff-menu.el --- buffer menu main function and support functions -*- coding:utf-8 -*-
 
-;; Copyright (C) 1985, 86, 87, 93, 94, 95, 2000, 2001, 2002, 03, 2004
-;;   Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 2000, 2001, 2002, 2003,
+;;   2004  Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: convenience
@@ -190,17 +190,23 @@ Letters do not insert themselves; instead, they are commands.
   (setq buffer-read-only t)
   (run-hooks 'buffer-menu-mode-hook))
 
+;; This function exists so we can make the doc string of Buffer-menu-mode
+;; look nice.
 (defun Buffer-menu-revert ()
   "Update the list of buffers."
   (interactive)
   (revert-buffer))
 
 (defun Buffer-menu-revert-function (ignore1 ignore2)
+  (or (eq buffer-undo-list t)
+      (setq buffer-undo-list nil))
   ;; We can not use save-excursion here.  The buffer gets erased.
   (let ((ocol (current-column))
        (oline (progn (move-to-column 4)
                      (get-text-property (point) 'buffer)))
-       (prop (point-min)))
+       (prop (point-min))
+       ;; do not make undo records for the reversion.
+       (buffer-undo-list t))
     (list-buffers-noselect Buffer-menu-files-only)
     (while (setq prop (next-single-property-change prop 'buffer))
       (when (eq (get-text-property prop 'buffer) oline)
@@ -482,14 +488,19 @@ in the selected frame."
   "Make the other window select this line's buffer.
 The current window remains selected."
   (interactive)
-  (display-buffer (Buffer-menu-buffer t)))
+  (let ((pop-up-windows t)
+       same-window-buffer-names
+       same-window-regexps)
+    (display-buffer (Buffer-menu-buffer t))))
 
 (defun Buffer-menu-2-window ()
   "Select this line's buffer, with previous buffer in second window."
   (interactive)
   (let ((buff (Buffer-menu-buffer t))
        (menu (current-buffer))
-       (pop-up-windows t))
+       (pop-up-windows t)
+       same-window-buffer-names
+       same-window-regexps)
     (delete-other-windows)
     (switch-to-buffer (other-buffer))
     (pop-to-buffer buff)
@@ -645,14 +656,14 @@ For more information, see the function `buffer-menu'."
   (let* ((old-buffer (current-buffer))
         (standard-output standard-output)
         (mode-end (make-string (- Buffer-menu-mode-width 2) ? ))
-        (header (concat " " (propertize "CRM " 'face 'fixed-pitch)
+        (header (concat "CRM "
                         (Buffer-menu-buffer+size
                          (Buffer-menu-make-sort-button "Buffer" 2)
                          (Buffer-menu-make-sort-button "Size" 3))
                         "  "
                         (Buffer-menu-make-sort-button "Mode" 4) mode-end
                         (Buffer-menu-make-sort-button "File" 5) "\n"))
-        list desired-point name mode file)
+        list desired-point)
     (when Buffer-menu-use-header-line
       (let ((pos 0))
        ;; Turn spaces in the header into stretch specs so they work
@@ -660,56 +671,67 @@ For more information, see the function `buffer-menu'."
        (while (string-match "[ \t]+" header pos)
          (setq pos (match-end 0))
          (put-text-property (match-beginning 0) pos 'display
-                            ;; Assume fixed-size chars
-                            (list 'space :align-to (1- pos))
-                            header))))
+                            ;; Assume fixed-size chars in the buffer.
+                            (list 'space :align-to pos)
+                            header)))
+      ;; Try to better align the one-char headers.
+      (put-text-property 0 3 'face 'fixed-pitch header)
+      ;; Add a "dummy" leading space to align the beginning of the header
+      ;; line with the beginning of the text (rather than with the left
+      ;; scrollbar or the left fringe).  –-Stef
+      (setq header (concat (propertize " " 'display '(space :align-to 0))
+                          header)))
     (with-current-buffer (get-buffer-create "*Buffer List*")
       (setq buffer-read-only nil)
       (erase-buffer)
       (setq standard-output (current-buffer))
       (unless Buffer-menu-use-header-line
-       (insert header (propertize "---" 'face 'fixed-pitch) " ")
-       (insert (Buffer-menu-buffer+size "------" "----"))
-       (insert "  ----" mode-end "----\n")
-       (put-text-property 1 (point) 'intangible t))
-      (setq list
-           (or buffer-list
-               (delq t
-                     (mapcar
-                      (lambda (buffer)
-                        (with-current-buffer buffer
-                          (setq name (buffer-name)
-                                mode (concat (format-mode-line mode-name nil nil buffer)
-                                             (if mode-line-process
-                                                 (format-mode-line mode-line-process nil nil buffer)))
-                                file (buffer-file-name))
-                          (cond
-                           ;; Don't mention internal buffers.
-                           ((and (string= (substring name 0 1) " ") (null file)))
-                           ;; Maybe don't mention buffers without files.
-                           ((and files-only (not file)))
-                           ((string= name "*Buffer List*"))
-                           ;; Otherwise output info.
-                           (t
-                            (unless file
-                              ;; No visited file.  Check local value of
-                              ;; list-buffers-directory.
-                              (when (and (boundp 'list-buffers-directory)
-                                         list-buffers-directory)
-                                (setq file list-buffers-directory)))
-                            (list buffer
-                                  (format "%c%c%c "
-                                          (if (eq buffer old-buffer) ?. ? )
-                                          ;; Handle readonly status.  The output buffer is special
-                                          ;; cased to appear readonly; it is actually made so at a
-                                          ;; later date.
-                                          (if (or (eq buffer standard-output)
-                                                  buffer-read-only)
-                                              ?% ? )
-                                          ;; Identify modified buffers.
-                                          (if (buffer-modified-p) ?* ? ))
-                                  name (buffer-size) mode file)))))
-                      (buffer-list)))))
+       (let ((underline (if (char-displayable-p ?—) ?— ?-)))
+         (insert header
+                 (apply 'string
+                        (mapcar (lambda (c)
+                                  (if (memq c '(?\n ?\ )) c underline))
+                                header)))))
+      ;; Collect info for every buffer we're interested in.
+      (dolist (buffer (or buffer-list (buffer-list)))
+       (with-current-buffer buffer
+         (let ((name (buffer-name))
+               (file buffer-file-name))
+           (unless (and (not buffer-list)
+                        (or
+                         ;; Don't mention internal buffers.
+                         (and (string= (substring name 0 1) " ") (null file))
+                         ;; Maybe don't mention buffers without files.
+                         (and files-only (not file))
+                         (string= name "*Buffer List*")))
+             ;; Otherwise output info.
+             (let ((mode (concat (format-mode-line mode-name nil nil buffer)
+                                 (if mode-line-process
+                                     (format-mode-line mode-line-process
+                                                       nil nil buffer))))
+                   (bits (string
+                          (if (eq buffer old-buffer) ?. ?\ )
+                          ;; Handle readonly status.  The output buffer
+                          ;; is special cased to appear readonly; it is
+                          ;; actually made so at a later date.
+                          (if (or (eq buffer standard-output)
+                                  buffer-read-only)
+                              ?% ?\ )
+                          ;; Identify modified buffers.
+                          (if (buffer-modified-p) ?* ?\ )
+                          ;; Space separator.
+                          ?\ )))
+               (unless file
+                 ;; No visited file.  Check local value of
+                 ;; list-buffers-directory.
+                 (when (and (boundp 'list-buffers-directory)
+                            list-buffers-directory)
+                   (setq file list-buffers-directory)))
+               (push (list buffer bits name (buffer-size) mode file)
+                     list))))))
+      ;; Preserve the original buffer-list ordering, just in case.
+      (setq list (nreverse list))
+      ;; Place the buffers's info in the output buffer, sorted if necessary.
       (dolist (buffer
               (if Buffer-menu-sort-column
                   (sort list
@@ -754,5 +776,5 @@ For more information, see the function `buffer-menu'."
       (set-buffer-modified-p nil)
       (current-buffer))))
 
-;;; arch-tag: e7dfcfc9-6cb2-46e4-bf55-8ef1936d83c6
+;; arch-tag: e7dfcfc9-6cb2-46e4-bf55-8ef1936d83c6
 ;;; buff-menu.el ends here