根据自定义比较器对 emacs dired 缓冲区进行排序

问题描述 投票:0回答:3

dired 似乎没有提供根据任意比较器函数对文件/文件夹进行排序的接口。 (默认情况下,它只允许按名称和日期排序)。

我一直在深入研究源代码以确定这种排序的机制,我发现这是对

(revert-buffer)
中的
dired-sort-toggle
的调用(在
dired.el
中)进行了重新显示。这让我意识到 dired 只是使用某些开关运行 ls 命令,然后将输出读入缓冲区。

是否有比将 dired 的 ls 函数指向自定义排序更好的方法来实现这种自定义排序?我觉得可能有一个变量保存 dired 缓冲区中的文件/目录的有序列表,我可以重新排列它。

我找到了变量

dired-subdir-alist
,但这似乎只包含顶级目录(即使根据文档,这似乎正是我想要的列表)

dired-subdir-alist 是`dired.el'中定义的变量。 文档:子目录及其缓冲区的关联列表 职位。每个子目录都有一个元素:(DIRNAME . STARTMARKER)。 元素的顺序与缓冲区中的顺序相反。在 简单的情况下,这个列表包含一个元素。

我怎样才能找到这样的变量?

sorting emacs elisp dired
3个回答
2
投票

您的理解是正确的。而且,正如@Stefan 指出的那样,

ls-lisp.el
提供了一些灵活性。

另请参阅库Dired Sort Menu,它至少提供了更多

ls
可能性,并允许您组合排序顺序。 (但是,它不允许您提供任意排序顺序 - 为此,请参阅
ls-lisp.el
。)


1
投票

您可能喜欢使用 ls-lisp,它是

insert-directory
的 Elisp 实现,这是 Dired 用于(通常)运行 ls 的函数。这通常在 Windows 下使用,其中
ls
经常缺失:

(require 'ls-lisp)

应该很容易调整代码以便能够使用您自己的排序功能。


0
投票

旧线程,但在搜索此问题时这是最热门的。

与其在 ls-lisp 内部搞乱,更容易实现排序函数(例如,使用

sort-regexp-fields
)并将其绑定到
dired-mode-map
。您必须暂时禁止只读模式才能执行此操作。例如,我有一个目录,其中包含格式为“FIELD1==FIELD2--FIELD3”的文件,我想按 FIELD2 排序:

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

这将允许您对

insert-directory
结果进行各种任意排序和操作。例如,您可以通过将上面的排序包装在条件中来将其限制为特定的特定目录。

© www.soinside.com 2019 - 2024. All rights reserved.