(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))
+ (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))
- ;; 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)))))))))
+ (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))))