diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/dired.el | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/lisp/dired.el b/lisp/dired.el index 43563d969f1..59346a19014 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -3072,7 +3072,11 @@ If EOL, it should be an position to use instead of (defun dired-copy-filename-as-kill (&optional arg) "Copy names of marked (or next ARG) files into the kill ring. -The names are separated by a space. +If there are several names, they will be separated by a space, +and file names that have spaces or quote characters in them will +be quoted (with double quotes). (When there's a single file, no +quoting is done.) + With a zero prefix arg, use the absolute file name of each marked file. With \\[universal-argument], use the file name relative to the Dired buffer's `default-directory'. (This still may contain slashes if in a subdirectory.) @@ -3082,19 +3086,26 @@ prefix arg and marked files are ignored in this case. You can then feed the file name(s) to other commands with \\[yank]." (interactive "P") - (let ((string - (or (dired-get-subdir) - (mapconcat #'identity - (if arg - (cond ((zerop (prefix-numeric-value arg)) - (dired-get-marked-files)) - ((consp arg) - (dired-get-marked-files t)) - (t - (dired-get-marked-files - 'no-dir (prefix-numeric-value arg)))) - (dired-get-marked-files 'no-dir)) - " ")))) + (let* ((files + (or (ensure-list (dired-get-subdir)) + (if arg + (cond ((zerop (prefix-numeric-value arg)) + (dired-get-marked-files)) + ((consp arg) + (dired-get-marked-files t)) + (t + (dired-get-marked-files + 'no-dir (prefix-numeric-value arg)))) + (dired-get-marked-files 'no-dir)))) + (string + (if (length= files 1) + (car files) + (mapconcat (lambda (file) + (if (string-match-p "[ \"']" file) + (format "%S" file) + file)) + files + " ")))) (unless (string= string "") (if (eq last-command 'kill-region) (kill-append string nil) |