changeset 80421:2c7b83cbf547

(find-dired-filter): Fix last patch to handle multi-line process input. Pad link numbers too.
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 01 Apr 2008 17:28:26 +0000
parents 3b1f5a54fc5d
children 9b3620a67bcb
files lisp/find-dired.el
diffstat 1 files changed, 47 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/find-dired.el	Tue Apr 01 17:28:09 2008 +0000
+++ b/lisp/find-dired.el	Tue Apr 01 17:28:26 2008 +0000
@@ -239,47 +239,56 @@
 (defun find-dired-filter (proc string)
   ;; Filter for \\[find-dired] processes.
   (let ((buf (process-buffer proc))
-	(inhibit-read-only t)
-	(l-opt (and (consp find-ls-option)
-		    (string-match "l" (cdr find-ls-option))))
-	(size-regexp
-	 "^ +[^ \t\r\n]+ +[^ \t\r\n]+ +[^ \t\r\n]+ +[^ \t\r\n]+ +\\([0-9]+\\)"))
-    (if (buffer-name buf)		; not killed?
-	(save-excursion
-	  (set-buffer buf)
+	(inhibit-read-only t))
+    (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))))
+		  (links-regexp "^ +[^ \t\r\n]+\\( +[^ \t\r\n]+\\)")
+		  (size-regexp
+		   "^ +[^ \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)))
-		;; Make output line up by padding the file size
-		(when l-opt
-		  (goto-char (- end 3))
-		  (when (re-search-forward size-regexp nil t)
-		    (replace-match (format "%10s" (match-string 1))
-				   nil nil nil 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)))))))))
+	      (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 links-regexp nil t)
+		  (replace-match (format "%4s" (match-string 1))
+				 nil nil nil 1)
+		  (forward-line 1))
+		(goto-char beg)
+		(goto-char (line-beginning-position))
+		(while (re-search-forward size-regexp nil t)
+		  (replace-match (format "%9s" (match-string 1))
+				 nil nil nil 1)
+		  (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))))