emacs-devel
[Top][All Lists]
Advanced

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

Why does dired go through extra efforts to avoid unibyte names


From: Stefan Monnier
Subject: Why does dired go through extra efforts to avoid unibyte names
Date: Fri, 29 Dec 2017 09:34:53 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux)

I bumped into the following code in dired-get-filename:

          ;; The above `read' will return a unibyte string if FILE
          ;; contains eight-bit-control/graphic characters.
          (if (and enable-multibyte-characters
                   (not (multibyte-string-p file)))
              (setq file (string-to-multibyte file)))

and I'm wondering why we don't want a unibyte string here.
`vc-region-history` told me this comes from the commit appended below,
which seems to indicate that we're worried about a subsequent encoding,
but AFAIK unibyte file names are not (re)encoded, and passing them
through string-to-multibyte would actually make things worse in this
respect (since it might cause the kind of (re)encoding this is
supposedly trying to avoid).

What am I missing?


        Stefan


commit 038b550196d92b9844a4efecf1c2ded0f920e957
Author: Kenichi Handa <address@hidden>
Date:   Wed Mar 19 11:58:25 2003 +0000

    * dired.el (dired-get-filename): Pay attention to the case that
    `read' returns a unibyte string.  Don't encode the file name by
    buffer-file-coding-system.

diff --git a/lisp/dired.el b/lisp/dired.el
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -1455,11 +1455,16 @@
          ;; Using read to unquote is much faster than substituting
          ;; \007 (4 chars) -> ^G  (1 char) etc. in a lisp loop.
          (setq file
                (read
                 (concat "\""
                         ;; Some ls -b don't escape quotes, argh!
                         ;; This is not needed for GNU ls, though.
                         (or (dired-string-replace-match
                              "\\([^\\]\\|\\`\\)\"" file "\\1\\\\\"" nil t)
                             file)
-                        "\"")))))
+                        "\"")))
+         ;; The above `read' will return a unibyte string if FILE
+         ;; contains eight-bit-control/graphic characters.
+         (if (and enable-multibyte-characters
+                  (not (multibyte-string-p file)))
+             (setq file (string-to-multibyte file)))))




reply via email to

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