emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 1855e3d: * lisp/wdired.el (wdired-normalize-filename): Sync with


From: Andreas Schwab
Subject: master 1855e3d: * lisp/wdired.el (wdired-normalize-filename): Sync with
Date: Sat, 29 May 2021 09:38:15 -0400 (EDT)

branch: master
commit 1855e3d0c4f156775ca0a462d3c8154e65481fbd
Author: Andreas Schwab <schwab@linux-m68k.org>
Commit: Andreas Schwab <schwab@linux-m68k.org>

    * lisp/wdired.el (wdired-normalize-filename): Sync with
    dired-get-filename.  (Bug#48659)
---
 lisp/wdired.el | 33 ++++++++++++++++++++++++++-------
 1 file changed, 26 insertions(+), 7 deletions(-)

diff --git a/lisp/wdired.el b/lisp/wdired.el
index 35211bc..22c1ceb 100644
--- a/lisp/wdired.el
+++ b/lisp/wdired.el
@@ -351,13 +351,32 @@ or \\[wdired-abort-changes] to abort changes")))
 ;; This code is a copy of some dired-get-filename lines.
 (defsubst wdired-normalize-filename (file unquotep)
   (when unquotep
-    (setq file
-          ;; FIXME: shouldn't we check for a `b' argument or somesuch before
-          ;; doing such unquoting?  --Stef
-          (read (concat
-                 "\"" (replace-regexp-in-string
-                       "\\([^\\]\\|\\`\\)\"" "\\1\\\\\"" file)
-                 "\""))))
+    ;; Unquote names quoted by ls or by dired-insert-directory.
+    ;; This code was written using `read' to unquote, because
+    ;; it's faster than substituting \007 (4 chars) -> ^G (1
+    ;; char) etc. in a lisp loop.  Unfortunately, this decision
+    ;; has necessitated hacks such as dealing with filenames
+    ;; with quotation marks in their names.
+    (while (string-match "\\(?:[^\\]\\|\\`\\)\\(\"\\)" file)
+      (setq file (replace-match "\\\"" nil t file 1)))
+    ;; Unescape any spaces escaped by ls -b (bug#10469).
+    ;; Other -b quotes, eg \t, \n, work transparently.
+    (if (dired-switches-escape-p dired-actual-switches)
+        (let ((start 0)
+              (rep "")
+              (shift -1))
+          (while (string-match "\\(\\\\\\) " file start)
+            (setq file (replace-match rep nil t file 1)
+                  start (+ shift (match-end 0))))))
+    (when (eq system-type 'windows-nt)
+      (save-match-data
+       (let ((start 0))
+         (while (string-match "\\\\" file start)
+           (aset file (match-beginning 0) ?/)
+           (setq start (match-end 0))))))
+
+    ;; Hence we don't need to worry about converting `\\' back to `\'.
+    (setq file (read (concat "\"" file "\""))))
   (and file buffer-file-coding-system
        (not file-name-coding-system)
        (not default-file-name-coding-system)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]