Mercurial > emacs
changeset 102825:14923c394d62
* dired.el (dired-get-filename): Always pass filename through
`read' to ensure unquoting is performed (Bug#2862).
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Thu, 02 Apr 2009 22:16:17 +0000 |
parents | 607b4f5da59c |
children | 76e34fe20234 |
files | lisp/ChangeLog lisp/dired.el |
diffstat | 2 files changed, 13 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/ChangeLog Thu Apr 02 21:12:54 2009 +0000 +++ b/lisp/ChangeLog Thu Apr 02 22:16:17 2009 +0000 @@ -1,3 +1,8 @@ +2009-04-02 Chong Yidong <cyd@stupidchicken.com> + + * dired.el (dired-get-filename): Always pass filename through + `read' to ensure unquoting is performed (Bug#2862). + 2009-04-02 Stefan Monnier <monnier@iro.umontreal.ca> * doc-view.el (doc-view-mode): Don't give up if the file doesn't exist.
--- a/lisp/dired.el Thu Apr 02 21:12:54 2009 +0000 +++ b/lisp/dired.el Thu Apr 02 22:16:17 2009 +0000 @@ -1950,11 +1950,14 @@ ;; Get rid of the mouse-face property that file names have. (set-text-properties 0 (length file) nil file) ;; Unquote names quoted by ls or by dired-insert-directory. - (while (string-match - "\\(?:[^\\]\\|\\`\\)\\(\\\\[0-7][0-7][0-7]\\)" file) - (setq file (replace-match - (read (concat "\"" (match-string 1 file) "\"")) - nil t file 1))) + ;; 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))) + (setq file (read (concat "\"" file "\""))) ;; The above `read' will return a unibyte string if FILE ;; contains eight-bit-control/graphic characters. (if (and enable-multibyte-characters