diff --git a/lisp/dired.el b/lisp/dired.el index 6c7445c..057e533 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3215,20 +3215,29 @@ dired-file-marker (following-char)))))) (defun dired-mark-files-in-region (start end) + "Mark all files inside the region in the Dired buffer. +The mark MARK of a file already marked only changes if: +1) MARK equals to `dired-del-marker'. +2) `dired-marked-char' equals to `?\\s' or `dired-del-marker'." + (let ((inhibit-read-only t)) (if (> start end) - (error "start > end")) - (goto-char start) ; assumed at beginning of line + (error "start > end")) + (goto-char start) ; assumed at beginning of line (while (< (point) end) ;; Skip subdir line and following garbage like the `total' line: (while (and (< (point) end) (dired-between-files)) - (forward-line 1)) - (if (and (not (looking-at-p dired-re-dot)) - (dired-get-filename nil t)) - (progn - (delete-char 1) - (insert dired-marker-char))) - (forward-line 1)))) + (forward-line 1)) + (when (and (not (looking-at-p dired-re-dot)) + (or (looking-at-p "^ ") + (looking-at-p (concat "^" (regexp-quote (char-to-string dired-del-marker)))) + (eq dired-marker-char ?\s) + (eq dired-marker-char dired-del-marker)) + (dired-get-filename nil t)) + (delete-char 1) + (insert dired-marker-char)) + (forward-line 1)) + (deactivate-mark 'force))) (defun dired-mark (arg &optional interactive) "Mark the file at point in the Dired buffer. @@ -3237,6 +3246,10 @@ dired-mark If on a subdir headerline, mark all its files except `.' and `..'. +The mark MARK of a file already marked only changes if: +1) MARK equals to `dired-del-marker'. +2) `dired-marked-char' equals to `?\\s' or `dired-del-marker'. + Use \\[dired-unmark-all-files] to remove all marks and \\[dired-unmark] on a subdir to remove the marks in this subdir." @@ -3246,10 +3259,10 @@ dired-mark ((and interactive (use-region-p)) (save-excursion (let ((beg (region-beginning)) - (end (region-end))) - (dired-mark-files-in-region - (progn (goto-char beg) (line-beginning-position)) - (progn (goto-char end) (line-beginning-position)))))) + (end (region-end))) + (dired-mark-files-in-region + (progn (goto-char beg) (line-beginning-position)) + (progn (goto-char end) (line-beginning-position)))))) ;; Mark subdir files from the subdir headerline. ((dired-get-subdir) (save-excursion (dired-mark-subdir-files))) @@ -3258,7 +3271,11 @@ dired-mark (let ((inhibit-read-only t)) (dired-repeat-over-lines (prefix-numeric-value arg) - (function (lambda () (delete-char 1) (insert dired-marker-char)))))))) + (function (lambda () (when (or (looking-at-p "^ ") + (looking-at-p (concat "^" (regexp-quote (char-to-string dired-del-marker)))) + (eq dired-marker-char ?\s) + (eq dired-marker-char dired-del-marker)) + (delete-char 1) (insert dired-marker-char))))))))) (defun dired-unmark (arg &optional interactive) "Unmark the file at point in the Dired buffer.