Emacs 如何定制dired';s显示器

Emacs 如何定制dired';s显示器,emacs,dired,Emacs,Dired,如何使用任意函数或列集使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 Se

如何使用任意函数或列集使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甚至不会停止加载缓冲区:(


浏览一下dired的源代码,它似乎从我试图替换的这些格式中获得了信息,所以我想知道这样更改是否可行,或者最终是否必须重写所有内容。

编写一个函数,将
ls
的输出转换为所需的格式,然后将该函数添加到
dir读入钩子后重新加载

编辑以添加:
dired模式
通过解析
ls
的输出来确定文件名,因此当您更改格式时,dired的某些功能将中断。您可以通过更改文件名regexp之前的
目录列表
dired权限标志regexp
,它们可以再次工作。由于对格式的更改非常彻底,您可能更愿意重写函数
dired move to filename
dired move to filename

(这听起来很难,但也不是不可能。我以我描述的方式定制了dired缓冲区的格式,尽管不像您建议的那样彻底。)

如果您坚持截断文件名,您将有很多工作要做,因为
dired模式
假定它可以通过调用

(buffer-substring (dired-move-to-filename) (dired-move-to-end-of-filename))

Dired模式对输出格式做了很多假设,因此更改格式会破坏很多东西。我认为一个更可行的方法是不使用格式,而是使用文本属性或覆盖来更改演示文稿。

这并不像您想要的那么激烈,但可以自定义Emacs如何在
dired模式下调用
ls

M-x customize-variable RET dired-listing-switches RET
我用它省略了带有
-o
选项的文件组ID,保存了一些水平屏幕的不动产。

我在这里使用答案: 和“compile”命令,该命令将在默认目录中运行。因此,它将为您提供一个新的缓冲区,但这是您要查找的信息

(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}'"))
(取消我的/ls模式编号()
(互动)

编译“ls-l|awk”{k=0;for(i=0;它的策略在答案中实现。
(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}'"))