If your ls program supports the ‘--dired’ option, Dired automatically passes it that option; this causes ls to emit special escape sequences for certain unusual file names, without which Dired will not be able to parse those names. The first time you run Dired in an Emacs session, it checks whether ls supports the ‘--dired’ option by calling it once with that option. If the exit code is 0, Dired will subsequently use the ‘--dired’ option; otherwise it will not. You can inhibit this check by customizing the variable dired-use-ls-dired. The value unspecified (the default) means to perform the check; any other non-nil value means to use the ‘--dired’ option; and nil means not to use the ‘--dired’ option.
On MS-Windows and MS-DOS systems, and also on some remote systems, Emacs emulates ls. See Emulation of ls on MS-Windows, for options and peculiarities of this emulation.
Geez I didn't realize dired relies on shelling out to ls. Why the fuck would you go through all the trouble of
- shelling out to an unreliable program and doing all the parsing work;
- adding a special mode for yourself to another piece of software, which may or may not be present;
- adding a user customization point;
- adding an emulation of said software when it's not present;
when you are in a real programming language, and all you need to get the clean data directly is readdir(3) and stat(3) (or their Windows equivalents)? This is unbelievable.
It's not unbelievable if you know and use Emacs and dired.
dired will use `ls' if it is available. You can also control the arguments passed to `ls' if you want to customize sort order and suchlike. You cannot trivially do this if it's hardcoded as syscalls.
Emacs's buffer concept specifically works around the idea of annotating the output of common coreutils commands and annotating them so they are interactive in Emacs. That means you can combine `find' + `ls' and show a collated list of files matching the things you want. That is very powerful.
Oh, and you can swap out `find' or `ls' with anything that emits a similar format (or customize Emacs to interpret it differently).
Now your readdir, stat, etc. equivalents require significant development effort.
`ls` is faster and more portable in Unix-land, fallback to emulation on non-Unix platforms is easier than asking users to install a port of half of Unix just to have `ls`, and user customization points are what Emacs is made of and for in the first place.
Shelling out to `ls` (exec + opendir + readdir + stat + pipe IO) is not faster than opendir + readdir + stat. `ls --dired` is definitely not portable. readdir and stat (the libc functions) are portable, work across POSIX and other Unix-likes. And the customization point here doesn’t provide any benefit for the user, it serves to let the user shoulder the responsibility for its own design defect (has to guess whether the `ls` supports --dired or not).
Emacs dired works fine on other platforms, which don’t have GNU ls on them, so I’m guessing by default it doesn’t run ls on its own.