error in dired sorting on OS X

Here are the steps for Emacs running on Snow Leopard 10.6.8 using coreutils installed through macports:

NOTE:   My macports installation is different than the generic (/opt/...) -- i.e., I use /macports as the root. Altering the root setup is not required, it is just a personal preference of mine. For vanilla macport installations or alternative setups, adjust the path accordingly.

sudo /macports/bin/port install coreutils

This goes inside the .emacs or init.el:

;; sort directories first

(setq insert-directory-program "/macports/bin/gls")

(setq dired-listing-switches "-aBhl --group-directories-first")

NOTE:   Using a symlink for gls/ls is not recommended because it breaks functionality with macports install and most likely other stuff too.


Alternative installation for users who want more control:

Download: coreutils-8.21.tar.xz from:  http://ftp.gnu.org/gnu/coreutils/

If you do not have a utility to unzip an *.xz file, you can use a utility such as TheUnarchiver3.9.1.

Here is a quick reference to make the coreutils -- I set the installation location to my own personal preference instead of the default:

./configure \
--prefix=/Users/HOME/.0.data/.0.emacs/elpa

make

sudo make install

Insert these into your .emacs or init.el file -- adjust the path accordingly:

;; sort directories first

(setq insert-directory-program "/Users/HOME/.0.data/.0.emacs/elpa/bin/ls")

(setq dired-listing-switches "-aBhl --group-directories-first")

Still happening in 2020! If, like me, you're using brew as your open source package manager, this is the right solution to copy paste in your .emacs file, or wherever you keep your startup customizations:

(when (equal system-type 'darwin)
  (setq insert-directory-program "/usr/local/opt/coreutils/libexec/gnubin/ls"))

(I check for the OS because I deploy my Emacs configuration on multiple systems).

Oddly enough, this happened suddenly on a Mojave system on which I routinely use Emacs since forever, and on which I am sure dired was working in the past. I guess that an update broke something that made dired use the correct binary, without having to manually set it.


For now, I've also found another solution using ls-lisp

(when (eq system-type 'darwin)
  (require 'ls-lisp)
  (setq ls-lisp-use-insert-directory-program nil))

The ls that's installed on OS X doesn't support -X or any long arguments like --sort. Setting dired-use-ls-dired won't have any effect; dired will always use ls, but if that variable is non-nil, it will pass --dired to ls.

If you want that type of sorting, you can probably use something like fink to install coreutils, which will provide an ls more like what you're used to in Ubuntu.

Tags:

Macos

Emacs

Dired