Tweak how dired-copy-filename-as-kill handles file names with spaces

* lisp/dired.el (dired-copy-filename-as-kill): Quote files
containing spaces (bug#48657).
This commit is contained in:
Lars Ingebrigtsen 2022-07-15 12:36:33 +02:00
parent 6befaa02ca
commit 23bba37a78
2 changed files with 30 additions and 14 deletions

View file

@ -166,6 +166,11 @@ of 'user-emacs-directory'.
* Incompatible changes in Emacs 29.1
---
** 'w' ('dired-copy-filename-as-kill') has changed behaviour.
If there are several files marked, file names containing space and
quote characters will be quoted "like this".
+++
** Warning about "eager macro-expansion failure" is changed into an error.

View file

@ -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)