From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Anders Lindgren Newsgroups: gmane.emacs.bugs Subject: bug#22169: 25.0.50; File name compiletion doesn't work with non-ASCII characters on OS X Date: Mon, 21 Dec 2015 23:03:38 +0100 Message-ID: References: <83y4cw3kie.fsf@gnu.org> <83twnk3fg1.fsf@gnu.org> <83oads2x99.fsf@gnu.org> <83io3z3drh.fsf@gnu.org> <831tan32q2.fsf@gnu.org> <83r3ikxmis.fsf@gnu.org> <83fuyxt35q.fsf@gnu.org> <8337uwucyt.fsf@gnu.org> <83wps8sc6h.fsf@gnu.org> <83fuyvss0h.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary=001a1144017650a55005276fa9de X-Trace: ger.gmane.org 1450735465 24595 80.91.229.3 (21 Dec 2015 22:04:25 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 21 Dec 2015 22:04:25 +0000 (UTC) Cc: random832@fastmail.com, 22169@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Dec 21 23:04:15 2015 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1aB8Yv-0007wc-Bm for geb-bug-gnu-emacs@m.gmane.org; Mon, 21 Dec 2015 23:04:13 +0100 Original-Received: from localhost ([::1]:47559 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aB8Yu-0005At-AX for geb-bug-gnu-emacs@m.gmane.org; Mon, 21 Dec 2015 17:04:12 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41824) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aB8Yp-0005Aj-Dk for bug-gnu-emacs@gnu.org; Mon, 21 Dec 2015 17:04:09 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aB8Yk-0003qm-N4 for bug-gnu-emacs@gnu.org; Mon, 21 Dec 2015 17:04:07 -0500 Original-Received: from debbugs.gnu.org ([208.118.235.43]:51575) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aB8Yk-0003qi-Jx for bug-gnu-emacs@gnu.org; Mon, 21 Dec 2015 17:04:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84) (envelope-from ) id 1aB8Yk-00026d-9M for bug-gnu-emacs@gnu.org; Mon, 21 Dec 2015 17:04:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Anders Lindgren Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 21 Dec 2015 22:04:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 22169 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 22169-submit@debbugs.gnu.org id=B22169.14507354278075 (code B ref 22169); Mon, 21 Dec 2015 22:04:02 +0000 Original-Received: (at 22169) by debbugs.gnu.org; 21 Dec 2015 22:03:47 +0000 Original-Received: from localhost ([127.0.0.1]:59177 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aB8YU-000269-94 for submit@debbugs.gnu.org; Mon, 21 Dec 2015 17:03:46 -0500 Original-Received: from mail-vk0-f44.google.com ([209.85.213.44]:34269) by debbugs.gnu.org with esmtp (Exim 4.84) (envelope-from ) id 1aB8YS-00025x-Gy for 22169@debbugs.gnu.org; Mon, 21 Dec 2015 17:03:45 -0500 Original-Received: by mail-vk0-f44.google.com with SMTP id j66so108234082vkg.1 for <22169@debbugs.gnu.org>; Mon, 21 Dec 2015 14:03:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=J3DWQ4MseYQ6qoowEPoIUh3p5LjhZPoQiT9uM7y4854=; b=BALCQkB7Mi+75fj5rT8Qa01gvgcp14QsvGCEF6sc6Y6RJymoj7t+pZTLy7OHib6gS7 khvJwxZ4ALHvAhUCCNBDckuZ7y8RDqm9YPzMhsM00g1sVlR4UNfuFKR5nY6KyCnlxtep 31aBhyQkAi/Dc9RLL3wWhV6c1hhOa250FGGbbyEbjTFv5rcMfHtQv1v//qmmEI68boDL 9q9D0QcwA6dRKXMr6u9+ciHtvjA28zAtmSX/Uch7X//a+Zs9i/KUVthTSooyk55/4fhg KKPJ5bZSz4bpGVL2KN8g9ny07SXX2I0g8dap2UCzDlhgmTYU4xxII49KSpTsij2UeEwB VTew== X-Received: by 10.31.10.199 with SMTP id 190mr14127617vkk.51.1450735419039; Mon, 21 Dec 2015 14:03:39 -0800 (PST) Original-Received: by 10.31.210.133 with HTTP; Mon, 21 Dec 2015 14:03:38 -0800 (PST) In-Reply-To: <83fuyvss0h.fsf@gnu.org> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:110261 Archived-At: --001a1144017650a55005276fa9de Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi! I just tested your latest patch. Unfortunately, it doesn't work properly. When pressing TAB, it expands the characters correctly. However, `file-name-all-completions' doesn't work: (file-name-all-completions "a" ".") ("=C3=A5=C3=A4=C3=B6first.txt" "aaosecond.txt") I haven't had time to see what actually happens in the code, though. However, the " if (STRING_MULTIBYTE (file))" looks suspicious as the decoded value needs to be checked even for strings like "a". (However, I don't really know what STRING_MULTIBYTE does.) -- Anders On Mon, Dec 21, 2015 at 5:09 PM, Eli Zaretskii wrote: > > Date: Mon, 21 Dec 2015 07:52:53 +0100 > > From: Anders Lindgren > > Cc: random832@fastmail.com, 22169@debbugs.gnu.org > > > > I did some simple measurements with and without this patch. I ran > > `(file-name-all-completions "x" "src")' on the Emacs src directory. The > timing > > values were almost identical (varying between 0.001012 and 0.001080). > > You should try it on a larger directory, preferably one that has many > files with non-ASCII file names. > > > The way I see it, the patch doesn't do any harm in any coding system, > and it is > > fast. Hence, I don't really see that it's worth the effort to make this > code > > conditional. > > I'm surprised to hear that. Did you look at the implementation of > Fcompare_strings? It's highly non-trivial. What's more, if the user > sets completion-ignore-case non-nil, Fcompare_strings will call > Fupcase on each character, which is another non-trivial function; if > you are particularly unlucky, Fupcase can even GC (if it needs to set > up the case-table), which will definitely take several hundreds of > milliseconds if not longer. > > And that's today; what if tomorrow someone comes and adds to > Fcompare_strings something that makes it even more complex and slow? > > I've learned long ago not to call any non-trivial API unless I really > need it. You can never know what complexity hides in there. Besides, > it simply looks bad in the code to do processing that is unnecessary. > > > However, please write a patch for this if you still thinks it's > necessary. I > > can test it here to make sure it works under OS X. > > Attached (relative to the current emacs-25 branch). > > Please note that the patch below attempts to solve a couple of > additional subtle aspects of this: > > . it doesn't force the extra comparison for unibyte strings (which > include ASCII strings and unibyte non-ASCII strings), since the > issue doesn't exist then, and ENCODE_FILE/DECODE_FILE are no-ops > > . it forces the FILE argument to have all of its characters > precomposed, since if the caller passes us a file name with > decomposed characters, we risk rejecting them in the code we are > adding > > Please see that these indeed o their job correctly, as I could only > test the code very superficially. > > Thanks. > > diff --git a/lisp/international/ucs-normalize.el > b/lisp/international/ucs-normalize.el > index 8839b00..6f2fb28 100644 > --- a/lisp/international/ucs-normalize.el > +++ b/lisp/international/ucs-normalize.el > @@ -627,6 +627,10 @@ 'utf-8-hfs > :pre-write-conversion 'ucs-normalize-hfs-nfd-pre-write-conversion > ) > > +;; This is tested in dired.c:file_name_completion in order to reject > +;; false positives due to comparison of encoded file names. > +(coding-system-put 'utf-8-hfs 'decomposed-characters 't) > + > (provide 'ucs-normalize) > > ;; Local Variables: > diff --git a/src/dired.c b/src/dired.c > index 84bf247..d5628d5 100644 > --- a/src/dired.c > +++ b/src/dired.c > @@ -467,6 +467,7 @@ file_name_completion (Lisp_Object file, Lisp_Object > dirname, bool all_flag, > well as "." and "..". Until shown otherwise, assume we can't exclu= de > anything. */ > bool includeall =3D 1; > + bool check_decoded =3D false; > ptrdiff_t count =3D SPECPDL_INDEX (); > > elt =3D Qnil; > @@ -485,6 +486,28 @@ file_name_completion (Lisp_Object file, Lisp_Object > dirname, bool all_flag, > on the encoded file name. */ > encoded_file =3D ENCODE_FILE (file); > encoded_dir =3D ENCODE_FILE (Fdirectory_file_name (dirname)); > + if (STRING_MULTIBYTE (file)) > + { > + Lisp_Object file_encoding =3D Vfile_name_coding_system; > + > + if (NILP (Vfile_name_coding_system)) > + file_encoding =3D Vdefault_file_name_coding_system; > + /* If the file-name encoding decomposes characters, as we do for > + HFS+ filesystems, we need to make an additional comparison of > + decoded names in order to filter false positives, such as "a" > + falsely matching "a-ring". */ > + if (!NILP (file_encoding) > + && !NILP (Fplist_get (Fcoding_system_plist (file_encoding), > + Qdecomposed_characters))) > + { > + check_decoded =3D true; > + /* Recompute FILE to make sure any decomposed characters in > + it are re-composed by the post-read-conversion. > + Otherwise, any decomposed characters will be rejected by > + the additional check below. */ > + file =3D DECODE_FILE (encoded_file); > + } > + } > int fd; > DIR *d =3D open_directory (encoded_dir, &fd); > record_unwind_protect_ptr (directory_files_internal_unwind, d); > @@ -637,6 +660,21 @@ file_name_completion (Lisp_Object file, Lisp_Object > dirname, bool all_flag, > if (!NILP (predicate) && NILP (call1 (predicate, name))) > continue; > > + /* Reject entries where the encoded strings match, but the > + decoded don't. For example, "a" should not match "a-ring" on > + file systems that store decomposed characters. */ > + Lisp_Object zero =3D make_number (0); > + Lisp_Object compare; > + Lisp_Object cmp; > + if (check_decoded && SCHARS (file) <=3D SCHARS (name)) > + { > + compare =3D make_number (SCHARS (file)); > + cmp =3D Fcompare_strings (name, zero, compare, file, zero, comp= are, > + completion_ignore_case ? Qt : Qnil); > + if (!EQ (cmp, Qt)) > + continue; > + } > + > /* Suitably record this match. */ > > matchcount +=3D matchcount <=3D 1; > @@ -650,15 +688,13 @@ file_name_completion (Lisp_Object file, Lisp_Object > dirname, bool all_flag, > } > else > { > - Lisp_Object zero =3D make_number (0); > /* FIXME: This is a copy of the code in Ftry_completion. */ > - ptrdiff_t compare =3D min (bestmatchsize, SCHARS (name)); > - Lisp_Object cmp > - =3D Fcompare_strings (bestmatch, zero, > - make_number (compare), > - name, zero, > - make_number (compare), > - completion_ignore_case ? Qt : Qnil); > + compare =3D min (bestmatchsize, SCHARS (name)); > + cmp =3D Fcompare_strings (bestmatch, zero, > + make_number (compare), > + name, zero, > + make_number (compare), > + completion_ignore_case ? Qt : Qnil); > ptrdiff_t matchsize =3D EQ (cmp, Qt) ? compare : eabs (XINT (cm= p)) > - 1; > > if (completion_ignore_case) > @@ -1007,6 +1043,7 @@ syms_of_dired (void) > DEFSYM (Qfile_attributes, "file-attributes"); > DEFSYM (Qfile_attributes_lessp, "file-attributes-lessp"); > DEFSYM (Qdefault_directory, "default-directory"); > + DEFSYM (Qdecomposed_characters, "decomposed-characters"); > > defsubr (&Sdirectory_files); > defsubr (&Sdirectory_files_and_attributes); > --001a1144017650a55005276fa9de Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi!

I just tested your latest patch. Unfortunately,= it doesn't work properly.

When pressing TAB, it expands the cha= racters correctly. However, `file-name-all-completions' doesn't wor= k:

(file-name-all-completions "a" ".")
("= ;=C3=A5=C3=A4=C3=B6first.txt" "aaosecond.txt")

I have= n't had time to see what actually happens in the code, though. However,= the " =C2=A0if (STRING_MULTIBYTE (file))" looks suspicious as th= e decoded value needs to be checked even for strings like "a". (H= owever, I don't really know what STRING_MULTIBYTE does.)

=C2=A0 =C2=A0 -- Anders



On Mon, Dec 21, 2015 at = 5:09 PM, Eli Zaretskii <eliz@gnu.org> wrote:
> Date: Mon, 21 Dec 2015 07:52:53 +0100
> From: Anders Lindgren <andlind@gmail.com>
> Cc: random832@fastmail.com, 22169@debbugs.gnu.org
>
> I did some simple measurements with and withou= t this patch. I ran
> `(file-name-all-completions "x" "src")' on the= Emacs src directory. The timing
> values were almost identical (varying between 0.001012 and 0.001080).<= br>
You should try it on a larger directory, preferably one that has man= y
files with non-ASCII file names.

> The way I see it, the patch doesn't do any harm in any coding syst= em, and it is
> fast. Hence, I don't really see that it's worth the effort to = make this code
> conditional.

I'm surprised to hear that.=C2=A0 Did you look at the implementa= tion of
Fcompare_strings?=C2=A0 It's highly non-trivial.=C2=A0 What's more,= if the user
sets completion-ignore-case non-nil, Fcompare_strings will call
Fupcase on each character, which is another non-trivial function; if
you are particularly unlucky, Fupcase can even GC (if it needs to set
up the case-table), which will definitely take several hundreds of
milliseconds if not longer.

And that's today; what if tomorrow someone comes and adds to
Fcompare_strings something that makes it even more complex and slow?

I've learned long ago not to call any non-trivial API unless I really need it.=C2=A0 You can never know what complexity hides in there.=C2=A0 Bes= ides,
it simply looks bad in the code to do processing that is unnecessary.

> However, please write a patch for this if you still thinks it's ne= cessary. I
> can test it here to make sure it works under OS X.

Attached (relative to the current emacs-25 branch).

Please note that the patch below attempts to solve a couple of
additional subtle aspects of this:

=C2=A0 . it doesn't force the extra comparison for unibyte strings (whi= ch
=C2=A0 =C2=A0 include ASCII strings and unibyte non-ASCII strings), since t= he
=C2=A0 =C2=A0 issue doesn't exist then, and ENCODE_FILE/DECODE_FILE are= no-ops

=C2=A0 . it forces the FILE argument to have all of its characters
=C2=A0 =C2=A0 precomposed, since if the caller passes us a file name with =C2=A0 =C2=A0 decomposed characters, we risk rejecting them in the code we = are
=C2=A0 =C2=A0 adding

Please see that these indeed o their job correctly, as I could only
test the code very superficially.

Thanks.

diff --git a/lisp/international/ucs-normalize.el b/lisp/international/ucs-n= ormalize.el
index 8839b00..6f2fb28 100644
--- a/lisp/international/ucs-normalize.el
+++ b/lisp/international/ucs-normalize.el
@@ -627,6 +627,10 @@ 'utf-8-hfs
=C2=A0 =C2=A0:pre-write-conversion 'ucs-normalize-hfs-nfd-pre-write-con= version
=C2=A0 =C2=A0)

+;; This is tested in dired.c:file_name_completion in order to reject
+;; false positives due to comparison of encoded file names.
+(coding-system-put 'utf-8-hfs 'decomposed-characters 't)
+
=C2=A0(provide 'ucs-normalize)

=C2=A0;; Local Variables:
diff --git a/src/dired.c b/src/dired.c
index 84bf247..d5628d5 100644
--- a/src/dired.c
+++ b/src/dired.c
@@ -467,6 +467,7 @@ file_name_completion (Lisp_Object file, Lisp_Object dir= name, bool all_flag,
=C2=A0 =C2=A0 =C2=A0 well as "." and "..".=C2=A0 Until = shown otherwise, assume we can't exclude
=C2=A0 =C2=A0 =C2=A0 anything.=C2=A0 */
=C2=A0 =C2=A0bool includeall =3D 1;
+=C2=A0 bool check_decoded =3D false;
=C2=A0 =C2=A0ptrdiff_t count =3D SPECPDL_INDEX ();

=C2=A0 =C2=A0elt =3D Qnil;
@@ -485,6 +486,28 @@ file_name_completion (Lisp_Object file, Lisp_Object di= rname, bool all_flag,
=C2=A0 =C2=A0 =C2=A0 on the encoded file name.=C2=A0 */
=C2=A0 =C2=A0encoded_file =3D ENCODE_FILE (file);
=C2=A0 =C2=A0encoded_dir =3D ENCODE_FILE (Fdirectory_file_name (dirname));<= br> +=C2=A0 if (STRING_MULTIBYTE (file))
+=C2=A0 =C2=A0 {
+=C2=A0 =C2=A0 =C2=A0 Lisp_Object file_encoding =3D Vfile_name_coding_syste= m;
+
+=C2=A0 =C2=A0 =C2=A0 if (NILP (Vfile_name_coding_system))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0file_encoding =3D Vdefault_file_name_coding_sys= tem;
+=C2=A0 =C2=A0 =C2=A0 /* If the file-name encoding decomposes characters, a= s we do for
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 HFS+ filesystems, we need to make an additiona= l comparison of
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 decoded names in order to filter false positiv= es, such as "a"
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 falsely matching "a-ring".=C2=A0 */<= br> +=C2=A0 =C2=A0 =C2=A0 if (!NILP (file_encoding)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&& !NILP (Fplist_get (Fcoding_sy= stem_plist (file_encoding),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Qdecomposed_characters)))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0check_decoded =3D true;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Recompute FILE to make sure any decom= posed characters in
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 it are re-composed by the post-r= ead-conversion.
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Otherwise, any decomposed charac= ters will be rejected by
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 the additional check below.=C2= =A0 */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0file =3D DECODE_FILE (encoded_file);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+=C2=A0 =C2=A0 }
=C2=A0 =C2=A0int fd;
=C2=A0 =C2=A0DIR *d =3D open_directory (encoded_dir, &fd);
=C2=A0 =C2=A0record_unwind_protect_ptr (directory_files_internal_unwind, d)= ;
@@ -637,6 +660,21 @@ file_name_completion (Lisp_Object file, Lisp_Object di= rname, bool all_flag,
=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!NILP (predicate) && NILP (call1 (pr= edicate, name)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 continue;

+=C2=A0 =C2=A0 =C2=A0 /* Reject entries where the encoded strings match, bu= t the
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0decoded don't.=C2=A0 For example, &q= uot;a" should not match "a-ring" on
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0file systems that store decomposed chara= cters. */
+=C2=A0 =C2=A0 =C2=A0 Lisp_Object zero =3D make_number (0)= ;
+=C2=A0 =C2=A0 =C2=A0 Lisp_Object compare;
+=C2=A0 =C2=A0 =C2=A0 Lisp_Object cmp;
+=C2=A0 =C2=A0 =C2=A0 if (check_decoded && SCHARS (file) <=3D SC= HARS (name))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0compare =3D make_number (SCHARS (file));=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cmp =3D Fcompare_strings (name, zero, co= mpare, file, zero, compare,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0completion_ig= nore_case ? Qt : Qnil);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!EQ (cmp, Qt))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
+
=C2=A0 =C2=A0 =C2=A0 =C2=A0/* Suitably record this match.=C2=A0 */

=C2=A0 =C2=A0 =C2=A0 =C2=A0matchcount +=3D matchcount <=3D 1;
@@ -650,15 +688,13 @@ file_name_completion (Lisp_Object file, Lisp_O= bject dirname, bool all_flag,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2=A0else
=C2=A0 =C2=A0 =C2=A0 =C2=A0 {
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Lisp_Object zero =3D make_number (0); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* FIXME: This is a copy of the code in = Ftry_completion.=C2=A0 */
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ptrdiff_t compare =3D min (bestma= tchsize, SCHARS (name));
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Lisp_Object cmp
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D Fcompare_strings (bestmatch, = zero,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0make_number (compare),
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0name, zero,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0make_number (compare),
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0completion_ignore_case ? Qt : Qnil);<= br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0compare =3D min (bestmatchsize, SCHARS (= name));
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0cmp =3D Fcompare_strings (bestmatch, zer= o,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0make_number (compare),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0name, zero,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0make_number (compare),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0completion_ig= nore_case ? Qt : Qnil);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ptrdiff_t matchsize =3D EQ (cmp, = Qt) ? compare : eabs (XINT (cmp)) - 1;

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (completion_ignore_case)
@@ -1007,6 +1043,7 @@ syms_of_dired (void)
=C2=A0 =C2=A0DEFSYM (Qfile_attributes, "file-attributes");
=C2=A0 =C2=A0DEFSYM (Qfile_attributes_lessp, "file-attributes-lessp&qu= ot;);
=C2=A0 =C2=A0DEFSYM (Qdefault_directory, "default-directory"); +=C2=A0 DEFSYM (Qdecomposed_characters, "decomposed-characters");=

=C2=A0 =C2=A0defsubr (&Sdirectory_files);
=C2=A0 =C2=A0defsubr (&Sdirectory_files_and_attributes);

--001a1144017650a55005276fa9de--