]> git.eshelyaron.com Git - emacs.git/commitdiff
dired fix for `ls -b' quoting of spaces (bug#10469)
authorGlenn Morris <rgm@gnu.org>
Fri, 13 Jan 2012 23:09:28 +0000 (18:09 -0500)
committerGlenn Morris <rgm@gnu.org>
Fri, 13 Jan 2012 23:09:28 +0000 (18:09 -0500)
* lisp/dired.el (dired-switches-escape-p): New function.
(dired-insert-directory): Use dired-switches-escape-p.
(dired-get-filename): Undo "\ " quoting if needed.

lisp/ChangeLog
lisp/dired.el

index be7c45339fa8a2adbf811dfc52e420ab0a2923cc..6497182cae6dc942a660c6c0d8731373d3c381df 100644 (file)
@@ -1,5 +1,9 @@
 2012-01-13  Glenn Morris  <rgm@gnu.org>
 
+       * dired.el (dired-switches-escape-p): New function.
+       (dired-insert-directory): Use dired-switches-escape-p.
+       (dired-get-filename): Undo "\ " quoting if needed.  (Bug#10469)
+
        * find-dired.el (find-ls-option): Doc fix.  (Bug#10262)
 
 2012-01-12  Glenn Morris  <rgm@gnu.org>
index 6f2ddbbc73df5c6ce273f9ba7e73ce80c5df7d92..42d2c7d7a5a2d06f80a3223cb23c2151a2acdb8e 100644 (file)
@@ -1111,6 +1111,11 @@ BEG..END is the line where the file info is located."
 
 (defvar ls-lisp-use-insert-directory-program)
 
+(defun dired-switches-escape-p (switches)
+  "Return non-nil if the string SWITCHES contains -b or --escape."
+  ;; Do not match things like "--block-size" that happen to contain "b".
+  (string-match "\\(\\`\\| \\)-[[:alnum:]]*b\\|--escape\\>" switches))
+
 (defun dired-insert-directory (dir switches &optional file-list wildcard hdr)
   "Insert a directory listing of DIR, Dired style.
 Use SWITCHES to make the listings.
@@ -1152,7 +1157,7 @@ see `dired-use-ls-dired' for more details.")
            (dired-align-file beg (point))))
       (insert-directory dir switches wildcard (not wildcard)))
     ;; Quote certain characters, unless ls quoted them for us.
-    (if (not (string-match "b" dired-actual-switches))
+    (if (not (dired-switches-escape-p dired-actual-switches))
        (save-excursion
          (setq end (point-marker))
          (goto-char opoint)
@@ -2099,7 +2104,13 @@ Otherwise, an error occurs in these cases."
           ;; 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))
+                (while (string-match "\\(\\\\\\) " file start)
+                  (setq file (replace-match "" nil t file 1)
+                        start (1- (match-end 0))))))
          (when (eq system-type 'windows-nt)
            (save-match-data
              (let ((start 0))
@@ -2107,6 +2118,7 @@ Otherwise, an error occurs in these cases."
                  (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 "\"")))
          ;; The above `read' will return a unibyte string if FILE
          ;; contains eight-bit-control/graphic characters.