在Emacs中,如何启用自动隐藏dired详细信息?

9
我将使用一个叫做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-details的正常显示,导致当我使用C-x d打开一个dired缓冲区时,初始显示会包含全部多余的细节信息。只有通过按下g键,即revert-buffer来刷新显示后,目录细节才会被隐藏。

如何在所有dired显示中默认启用隐藏dired细节呢?

1个回答

11

首先,如果你使用 Emacs 24.4 或更高版本(或者是 24.3 以后的开发版本),那么你就不再需要使用dired-details.eldired-details+.el了。从 Emacs 24.4 开始,默认情况下隐藏 Dired 列出的详细信息,相关模式是dired-hide-details-mode

如果你使用dired+.elDired+),那么你可以更容易地利用这种新行为——它提供了 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)。如果这不起作用,那么请尝试在你的 defadvice体中添加以下内容,在(mydired-sort)之后:(dired-details-hide)。如果还没有用,我们需要再进一步探讨。

如果你可以升级 Emacs 版本,那么很快就能使用 Emacs 24.4 (现在正在进行预发行版本测试),这样你就可以简单地加载dired+.el并将选项diredp-hide-details-initially-flag设置为非nil

关于先排序目录:你使用的是 MS Windows吗?如果是,考虑使用库dired-sort-menu.eldired-sort-menu+.el。它可以让你做更多事情,包括先排序目录。


更新

问题在于 dired-details 缓存了它用来隐藏细节的覆盖层列表。由于dired-after-readin-hook的缘故,它已经完成了它的工作,在你做排序之前,这会更改缓冲区而不更新缓存信息。以下代码将解决问题(可能有更优雅的方法,但这样也可以):

(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)))

感谢您的详细回复。我正在使用GNU Emacs的OSX版本,当前版本似乎是24.3.1。所以我按照您上面的指示进行了操作(我想),但仍然无法正常工作。这里是我的.emacs文件中dired部分的代码:http://pastebin.com/73ZdazyK - incandescentman
在我开始查看之前,先说明一下: (1)你不需要自己的 defcustom -- 只需使用 customize-set-variable 设置所需的选项值(或使用 M-x customize-option)。 (2)不需要引用 lambda 表达式,因此不要这样做。 (3)尝试将代码缩小到问题的本质部分。例如,如果省略的内容与问题无关,则尝试摆脱它。同样适用于其余部分:递归地对代码进行二分,直到获得生成问题所需的最小代码。不要让自己和其他人浸泡在与问题无关的东西中。 - Drew
尝试使用上面的代码(将覆盖缓存绑定为nil)。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接