如何自定义dired的显示

时间:2010-11-05 07:41:31

标签: 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 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 个答案:

答案 0 :(得分:3)

Dired模式对ls输出格式做了很多假设,因此更改格式会破坏很多东西。我认为更可行的方法是单独保留格式,并使用文本属性或叠加来更改演示文稿。

答案 1 :(得分:3)

这并不像您要查找的那样激烈,但可以自定义Emacs在ls中调用dired-mode的方式。

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

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

答案 2 :(得分: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-mode假设它可以通过调用

来获取当前行的文件名
(buffer-substring (dired-move-to-filename) (dired-move-to-end-of-filename))

答案 3 :(得分:0)

我会在这里使用答案:https://stackoverflow.com/a/1796009/714357 和'将在您的默认目录中运行的编译命令。所以它会给你一个新的缓冲区,但它是你正在寻找的信息。

(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}'"))