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

4 回答 4

3

Dired 模式对输出格式做了很多假设ls,所以改变格式会破坏很多东西。我认为更可行的方法是不考虑格式,并使用文本属性或覆盖来更改演示文稿。

于 2010-11-06T11:52:11.377 回答
3

这并不像您正在寻找的那么激烈,但可以自定义 Emacs 如何调用ls.dired-mode

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

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

于 2012-01-31T22:25:16.527 回答
2

编写一个函数,将 的输出ls转换为您想要的格式,然后将该函数添加到dired-after-readin-hook.

编辑添加:dired-mode通过解析的输出确定文件的名称ls,因此当您更改格式时,dired的某些功能会中断。directory-listing-before-filename-regexp您可以通过更改和使(其中一些)再次工作dired-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))
于 2010-11-06T01:05:15.953 回答
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}'"))
于 2014-01-28T19:27:38.263 回答