From 23bba37a78cfdbab0634846b962f474d987b6036 Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Fri, 15 Jul 2022 12:36:33 +0200 Subject: [PATCH] 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). --- etc/NEWS | 5 +++++ lisp/dired.el | 39 +++++++++++++++++++++++++-------------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 57845df9792..ba6692aace0 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -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. 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) -- 2.39.2