如何自定义dired的显示

10

我该如何让Dired使用任意函数或一组列来显示其文件?基本上,我想要从以下方式进行更改:

 -rw-r--r--  1 konrad konrad  3847863 Out 18 14:17 ClojureinAction.pdf
 -rw-rw-r--  1 tamara tamara 27338341 Out 20 07:16 Halliday, Resnick, Walker - Fundamentals of Physics.pdf
 -rw-r--r--  1 konrad konrad  3921024 Set 22 11:11 Pragmatic.Programming.Clojure.May.2009.pdf

翻译成类似于这样的东西

644 1-5MB    ClojureinAction.pdf       PDF  (5 days ago, 400pgs)
664 10-100MB Halliday, Resnic...pdf    PDF  (3 days ago, 1000pgs, Tamara's)
644 1-5MB    Pragmatic.Progra...pdf    PDF  (1 min ago, 100 pages)

谢谢!


编辑:感谢答案,Gareth,但你能更详细一些吗?显然,这个钩子只允许我在缓冲区加载时运行任意代码。Dired甚至不会停止加载缓冲区:(

(defun foo (&rest args) (unlocking-buffer (message "foo") (insert "foo\n")))

瞥了一眼dired的源代码,看起来它从我试图替换的这些格式中获取信息,所以我想知道是否可以通过这种方式进行更改,或者是否最终不得不重写所有内容。

4个回答

3
Dired模式对ls输出格式有很多假设,因此更改格式会破坏许多内容。我认为一个更可行的方法是保留格式,使用文本属性或覆盖来改变呈现方式。

这个策略在 https://emacs.stackexchange.com/questions/35676/customize-direds-display/35685#35685 中得以实现。 - Tobias

3

这并不像你所寻求的那么激进,但是在dired-mode中自定义Emacs如何调用ls是可能的。

M-x customize-variable RET dired-listing-switches RET

我使用-o选项来省略文件的组ID,从而节省了一些水平屏幕空间。


2
编写一个函数,将ls的输出转换为您想要的格式,然后将该函数添加到dired-after-readin-hook中。
编辑以补充: dired-mode通过解析ls的输出来确定文件名,因此当您更改格式时,dired的某些功能将会出现问题。您可以通过更改directory-listing-before-filename-regexpdired-permission-flags-regexp来使它们(部分)重新工作。由于您对格式的更改相当激进,因此您可能更喜欢重写dired-move-to-filenamedired-move-to-end-of-filename函数。(这听起来很难,但并不是不可能。我按照我描述的方式自定义了dired缓冲区的格式,尽管没有您提出的那么激进。)
如果您坚持截断文件名,那么您将有很多工作要做,因为dired-mode假定它可以通过调用当前行上的文件名来获取文件名。
(buffer-substring (dired-move-to-filename) (dired-move-to-end-of-filename))

0
我会使用这里的答案:https://dev59.com/LXI-5IYBdhLWcg3wj5FG#1796009,以及“编译命令”,它将在您的默认目录中运行。因此,它将为您提供一个新的缓冲区,但这是您要查找的信息。
(defun my/ls-mode-numbers ()
  (interactive)
  (compile " ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf(\"%0o \",k);print}'"))

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