Сортировать Emacs Dired буфер в соответствии с пользовательским компаратором

Кажется, что dired не предоставляет интерфейс для сортировки файлов / папок в соответствии с произвольной функцией сравнения. (По умолчанию разрешена сортировка только по имени и дате).

Я копался в исходном коде, чтобы определить механизм этой сортировки, и я вижу, что это вызов (revert-buffer) в dired-sort-toggledired.el) который делает перерисовку. Это приводит меня к пониманию, что dired просто запускает команду ls с определенными переключателями, а затем считывает вывод в буфер.

Есть ли лучший способ добиться этой пользовательской сортировки, чем указывать функцию ls в dired на пользовательскую? Я чувствую, что может быть переменная, которая содержит упорядоченный список файлов / каталогов в буфере с задержкой, который я мог бы перестроить.

Я нашел переменную dired-subdir-alist, но это только кажется, что содержит верхний каталог (хотя в соответствии с документацией, это выглядит как список, который я хочу)

dired-subdir-alist - это переменная, определенная в `dired.el'. Документация: Ассоциативный список подкаталогов и их буферные позиции. У каждого подкаталога есть элемент: (DIRNAME . STARTMARKER). Порядок элементов является обратным порядку в буфере. В простых случаях этот список содержит один элемент.

Как я мог найти такую ​​переменную?

3 ответа

Ваше понимание верно. И, как отмечает @Stefan, ls-lisp.el обеспечивает некоторую гибкость.

Смотрите также библиотеку Dired Sort Menu, которая, по крайней мере, предоставляет больше ls возможности и позволяет комбинировать заказы на сортировку. (Однако это не позволяет вам указывать произвольный порядок сортировки - см. ls-lisp.el.)

Вы можете использовать ls-lisp, который является реализацией Elisp insert-directory, которая используется Dired для (обычно) запуска ls. Обычно используется под Windows, где ls часто отсутствует:

(require 'ls-lisp)

Должно быть легко настроить код, чтобы можно было использовать собственную функцию сортировки.

Старая тема, но это лучший результат при поиске по этой проблеме.

Вместо того, чтобы копаться во внутреннем устройстве ls-lisp, было проще реализовать функцию сортировки (например, с помощью) и привязать его к. Для этого вам придется временно запретить режим только для чтения. Например, у меня есть каталог с файлами в формате «ПОЛЕ1==ПОЛЕ2--ПОЛЕ3», и я хочу отсортировать по ПОЛЮ2:

      (defun my-sort-field2 ()
  (interactive)
  (setq inhibit-read-only t)
  (sort-regexp-fields nil "^.*$" "==.*--" (point-min) (point-max))
  (setq inhibit-read-only nil))

Это позволит вам выполнять все виды произвольной сортировки и манипуляций сРезультаты. Например, вы можете ограничить приведенную выше сортировку конкретным каталогом, обернув его в условное выражение.

Другие вопросы по тегам