From: Glenn Morris Date: Fri, 13 Jan 2012 23:09:28 +0000 (-0500) Subject: dired fix for `ls -b' quoting of spaces (bug#10469) X-Git-Tag: emacs-pretest-24.0.93~97^2~17^2~13 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=1498536e41ad60bda317e7b02a32c8710ddd1627;p=emacs.git dired fix for `ls -b' quoting of spaces (bug#10469) * lisp/dired.el (dired-switches-escape-p): New function. (dired-insert-directory): Use dired-switches-escape-p. (dired-get-filename): Undo "\ " quoting if needed. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index be7c45339fa..6497182cae6 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,9 @@ 2012-01-13 Glenn Morris + * 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 diff --git a/lisp/dired.el b/lisp/dired.el index 6f2ddbbc73d..42d2c7d7a5a 100644 --- a/lisp/dired.el +++ b/lisp/dired.el @@ -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.