在Emacs中,如何启用dired细节的自动隐藏?

在Emacs中,如何启用dired细节的自动隐藏?,emacs,dired,Emacs,Dired,我使用一个名为dired details和dired details+的库来简化dired的显示,如下所示: -rw-r--r--@ 1 peter staff 22571 Apr 15 16:05 foo.txt 显示如下: foo.txt 但是,我有另一个函数,它将所有目录放在列表的顶部: (defun mydired-sort () "Sort dired listings with directories first." (save-excursion (let (buffe

我使用一个名为dired details和dired details+的库来简化dired的显示,如下所示:

-rw-r--r--@  1 peter  staff  22571 Apr 15 16:05 foo.txt
显示如下:

foo.txt
但是,我有另一个函数,它将所有目录放在列表的顶部:

(defun mydired-sort ()
"Sort dired listings with directories first."
(save-excursion
 (let (buffer-read-only)
  (forward-line 2) ;; beyond dir. header
  (sort-regexp-fields t "^.*$" "[ ]*." (point) (point-max)))
(set-buffer-modified-p nil)))

(defadvice dired-readin
(after dired-after-updating-hook first () activate)
 "Sort dired listings with directories first before adding marks."
 (mydired-sort))
第二个函数会干扰dired细节,因此,当I C-x d打开dired缓冲区时,初始显示会显示所有无关的细节。只有按g键以刷新显示,才能隐藏目录详细信息


默认情况下,如何在所有dired显示中启用隐藏dired详细信息?

首先,如果使用Emacs 24.4或更高版本(或超过24.3的开发版本),则不再需要或。从Emacs24.4开始,默认情况下隐藏目录列表详细信息<代码>直接隐藏详细信息模式是相关模式

如果使用()则可以更轻松地利用这一新行为——它提供了
dired details+.el
提供的所有功能。使用
随时切换此隐藏。您可以使用Dired+选项
diredp hide details initially flag
更改默认/初始状态。另请参阅选项
diredp hide details propagate flag

如果您使用的Emacs版本早于Emacs 24.4(因此您需要
dired details[+].el
),请尝试加载
dired details+.el
(这将加载
dired details.el
在您对上面的代码进行评估之后。如果没有帮助,请尝试在
(mydired排序)
(dired details hide)
之后将其添加到您的
defadvice
正文中。如果这不起作用,我们需要进一步查看

如果您可以升级您的Emacs版本,那么您很快就可以使用Emacs 24.4(现在处于预测试阶段),在这种情况下,您应该能够加载
dired+.el
,并将选项
diredp hide details initially flag
设置为non-
nil

<强> WRT排序目录:你在MS Windows上吗?如果是的话,考虑使用库。它允许你这样做,甚至更多。


更新

问题在于,dired details缓存了用于隐藏细节的覆盖列表。在排序完成之前,它已经完成了它的工作(因为
dired after readin hook
),并且在不更新缓存信息的情况下更改了缓冲区。这将解决问题(可能有一种更优雅的方法,但可以做到):


谢谢你的广泛回复。我在OSX上使用GNU Emacs。当前版本的GNU Emacs for OSX似乎是24.3.1。所以我按照你上面的指示(我想),它仍然不起作用。这是我的.Emacs的dired部分目前的看法:在我看之前的初步评论:(1)您不需要自己的
defcustom
s——只需使用
customizeset variable
(或使用
M-x customize option
)设置所需的选项值即可。(2)您不需要引用
lambda
表单,所以不要这样做。(3)试着把你的代码缩小到对问题至关重要的范围。例如,如果与问题无关,试着去掉省略的部分。其他部分也一样:递归地将代码平分,直到你有最少的代码来产生问题。不要让你自己和其他人费力地处理与问题无关的东西。试试c上面的ode(将覆盖缓存绑定为nil)。
(defadvice dired-readin
    (after dired-after-updating-hook first () activate)
  "Sort dired listings with directories first before adding marks."
  (mydired-sort)
  (let ((dired-details-internal-overlay-list  ())) (dired-details-hide)))