G.4 Emulation of ls
on MS-Windows
Dired normally uses the external program ls
to produce the directory listing displayed in Dired
buffers (see Dired, the Directory Editor). However, MS-Windows and MS-DOS systems don’t
come with such a program, although several ports of GNU ls
are available. Therefore, Emacs on those systems emulates ls
in Lisp, by using the ls-lisp.el
package. While
ls-lisp.el
provides a reasonably full emulation of ls
,
there are some options and features peculiar to that emulation;
they are described in this section.
The ls
emulation supports many of the ls
switches, but
it doesn’t support all of them. Here’s the list of the switches it
does support: -A
, -a
, -B
, -C
,
-c
, -G
, -g
, -h
, -i
, -n
,
-R
, -r
, -S
, -s
, -t
, -U
,
-u
, -v
, and -X
. The -F
switch is
partially supported (it appends the character that classifies the
file, but does not prevent symlink following).
On MS-Windows and MS-DOS, ls-lisp.el
is preloaded when Emacs
is built, so the Lisp emulation of ls
is always used on those
platforms. If you have a ported ls
, setting
ls-lisp-use-insert-directory-program
to a non- nil
value
will revert to using an external program named by the variable
insert-directory-program
.
The order in which ls-lisp.el
sorts files depends on several
customizable options described below.
The default sorting order follows locale-specific rules derived from
your system locale. You can make the order locale-independent by
customizing ls-lisp-use-string-collate
to a nil
value.
On GNU and Unix systems, when the locale’s encoding is UTF-8, the
collation order follows the Unicode Collation Algorithm
(UCA). To have a similar effect on MS-Windows, the variable
ls-lisp-UCA-like-collation
should have a non- nil
value
(this is the default). The resulting sorting order ignores
punctuation, symbol characters, and whitespace characters, so
.foobar
, foobar
and foo bar
will appear
together rather than far apart.
By default, ls-lisp.el
uses a case-sensitive sort order for
the directory listing it produces; this is so the listing looks the
same as on other platforms. If you wish that the files be sorted in
case-insensitive order, set the variable ls-lisp-ignore-case
to
a non- nil
value.
By default, files and subdirectories are sorted together, to emulate
the behavior of ls
. However, native MS-Windows/MS-DOS file
managers list the directories before the files; if you want that
behavior, customize the option ls-lisp-dirs-first
to a
non- nil
value.
The variable ls-lisp-verbosity
controls the file attributes
that ls-lisp.el
displays. The value should be either
nil
or a list that contains one or more of the symbols
links
, uid
, and gid
. links
means display
the count of different file names that are associated with (a.k.a.
links to) the file’s data; this is only useful on NTFS volumes.
uid
means display the numerical identifier of the user who owns
the file. gid
means display the numerical identifier of the
file owner’s group. The default value is (links uid gid)
i.e.,
all the 3 optional attributes are displayed. The value nil
means not to display any of these attributes.
The variable ls-lisp-emulation
controls the flavor of the
ls
emulation by setting the defaults for the 3 options
described above: ls-lisp-ignore-case
,
ls-lisp-dirs-first
, and ls-lisp-verbosity
. The value of
this option can be one of the following symbols:
GNU``nil
Emulate GNU systems; this is the default. This sets
ls-lisp-ignore-case
and ls-lisp-dirs-first
to
nil
, and ls-lisp-verbosity
to (links uid gid)
.
UNIX
Emulate Unix systems. Like GNU
, but sets
ls-lisp-verbosity
to (links uid)
.
MacOS
Emulate macOS. Sets ls-lisp-ignore-case
to t
, and
ls-lisp-dirs-first
and ls-lisp-verbosity
to nil
.
MS-Windows
Emulate MS-Windows. Sets ls-lisp-ignore-case
and
ls-lisp-dirs-first
to t
, and ls-lisp-verbosity
to
nil
on Windows 9X and to t
on modern versions of
Windows. Note that the default emulation is not MS-Windows
, even on Windows, since many users of Emacs on those
platforms prefer the GNU defaults.
Any other value of ls-lisp-emulation
means the same as GNU
.
Customizing this option calls the function ls-lisp-set-options
to
update the 3 dependent options as needed. If you change the value of
this variable without using customize after ls-lisp.el
is loaded
(note that it is preloaded on MS-Windows and MS-DOS), you can call that
function manually for the same result.
The variable ls-lisp-support-shell-wildcards
controls how
file-name patterns are supported: if it is non- nil
(the
default), they are treated as shell-style wildcards; otherwise they
are treated as Emacs regular expressions.
The variable ls-lisp-format-time-list
defines how to format
the date and time of files. The value of this variable is
ignored, unless Emacs cannot determine the current locale. (However,
if the value of ls-lisp-use-localized-time-format
is
non- nil
, Emacs obeys ls-lisp-format-time-list
even if
the current locale is available; see below.)
The value of ls-lisp-format-time-list
is a list of 2 strings.
The first string is used if the file was modified within the current
year, while the second string is used for older files. In each of
these two strings you can use ‘ %
’-sequences to substitute parts
of the time. For example:
("%b %e %H:%M" "%b %e %Y")
Note that the strings substituted for these ‘ %
’-sequences depend
on the current locale. See Time Parsing in The Emacs Lisp
Reference Manual, for more about format time specs.
Normally, Emacs formats the file time stamps in either traditional
or ISO-style time format. However, if the value of the variable
ls-lisp-use-localized-time-format
is non- nil
, Emacs
formats file time stamps according to what
ls-lisp-format-time-list
specifies. The ‘ %
’-sequences in
ls-lisp-format-time-list
produce locale-dependent month and day
names, which might cause misalignment of columns in Dired display.
The default value of ls-lisp-use-localized-time-format
is
nil
.