changeset 93521:7587f0dc0aa9

(find-dired-filter): Align columns by padding file sizes and link numbers.
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 01 Apr 2008 17:34:20 +0000
parents 8a4678b62c46
children 38ab23c0b8ad
files lisp/find-dired.el
diffstat 1 files changed, 41 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/find-dired.el	Tue Apr 01 17:34:02 2008 +0000
+++ b/lisp/find-dired.el	Tue Apr 01 17:34:20 2008 +0000
@@ -240,37 +240,50 @@
   ;; Filter for \\[find-dired] processes.
   (let ((buf (process-buffer proc))
 	(inhibit-read-only t))
-    (if (buffer-name buf)		; not killed?
-	(save-excursion
-	  (set-buffer buf)
+    (if (buffer-name buf)
+	(with-current-buffer buf
 	  (save-restriction
 	    (widen)
-	    (save-excursion
-	      (let ((buffer-read-only nil)
-		    (end (point-max)))
-		(goto-char end)
-		(insert string)
-		(goto-char end)
-		(or (looking-at "^")
-		    (forward-line 1))
-		(while (looking-at "^")
-		  (insert "  ")
+	    (let ((buffer-read-only nil)
+		  (beg (point-max))
+		  (l-opt (and (consp find-ls-option)
+			      (string-match "l" (cdr find-ls-option))))
+		  (ls-regexp (concat "^ +[^ \t\r\n]+\\( +[^ \t\r\n]+\\) +"
+				     "[^ \t\r\n]+ +[^ \t\r\n]+\\( +[0-9]+\\)")))
+	      (goto-char beg)
+	      (insert string)
+	      (goto-char beg)
+	      (or (looking-at "^")
 		  (forward-line 1))
-		;; Convert ` ./FILE' to ` FILE'
-		;; This would lose if the current chunk of output
-		;; starts or ends within the ` ./', so back up a bit:
-		(goto-char (- end 3))	; no error if < 0
-		(while (search-forward " ./" nil t)
-		  (delete-region (point) (- (point) 2)))
-		;; Find all the complete lines in the unprocessed
-		;; output and process it to add text properties.
-		(goto-char (point-max))
-		(if (search-backward "\n" (process-mark proc) t)
-		    (progn
-		      (dired-insert-set-properties (process-mark proc)
-						   (1+ (point)))
-		      (move-marker (process-mark proc) (1+ (point)))))
-		))))
+	      (while (looking-at "^")
+		(insert "  ")
+		(forward-line 1))
+	      ;; Convert ` ./FILE' to ` FILE'
+	      ;; This would lose if the current chunk of output
+	      ;; starts or ends within the ` ./', so back up a bit:
+	      (goto-char (- beg 3))	; no error if < 0
+	      (while (search-forward " ./" nil t)
+		(delete-region (point) (- (point) 2)))
+	      ;; Pad the number of links and file size.  This is a
+	      ;; quick and dirty way of getting the columns to line up
+	      ;; most of the time, but it's not foolproof.
+	      (when l-opt
+		(goto-char beg)
+		(goto-char (line-beginning-position))
+		(while (re-search-forward ls-regexp nil t)
+		  (replace-match (format "%4s" (match-string 1))
+				 nil nil nil 1)
+		  (replace-match (format "%9s" (match-string 2))
+				 nil nil nil 2)
+		  (forward-line 1)))
+	      ;; Find all the complete lines in the unprocessed
+	      ;; output and process it to add text properties.
+	      (goto-char (point-max))
+	      (if (search-backward "\n" (process-mark proc) t)
+		  (progn
+		    (dired-insert-set-properties (process-mark proc)
+						 (1+ (point)))
+		    (move-marker (process-mark proc) (1+ (point))))))))
       ;; The buffer has been killed.
       (delete-process proc))))