Как настроить отображение по умолчанию

Как заставить 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)

Спасибо!


EDIT: Спасибо за ответ, Гарет, но могли бы вы быть более подробными, пожалуйста? По-видимому, хук просто позволит мне запускать произвольный код при загрузке буфера. Dired даже не перестанет загружать буфер: (

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

Взглянув на устаревший исходный код, кажется, что он получает информацию из этих самых форматов, которые я пытаюсь заменить, поэтому я задаюсь вопросом, можно ли это изменить так, или мне придется переписать все.

Ответ 1

Dired mode делает довольно много предположений о формате вывода ls, поэтому изменение формата приведет к разрыву многих вещей. Я думаю, что более целесообразным подходом является оставить только один формат и использовать текстовые свойства или оверлеи для изменения презентации.

Ответ 2

Напишите функцию, преобразующую вывод ls в желаемый формат, а затем добавьте эту функцию в dired-after-readin-hook.

Отредактировано для добавления: dired-mode определяет имя файла, анализируя вывод ls, поэтому некоторые функции прошивки будут прерываться при изменении формата. Вы можете заставить (некоторые из них) работать снова, изменяя directory-listing-before-filename-regexp и dired-permission-flags-regexp. Поскольку ваше изменение формата довольно радикально, вы можете переписать функции dired-move-to-filename и dired-move-to-end-of-filename.

(Это звучит сложно, но это не невозможно. Я настраиваю формат буферов в стиле, описанном мной, хотя и не настолько радикально, как вы предлагаете).

У вас будет много работы, если вы настаиваете на усечении имени файла, потому что dired-mode предполагает, что он может получить имя файла в текущей строке, вызвав

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

Ответ 3

Это не так сильно, как то, что вы ищете, но можно настроить, как Emacs вызывает ls в dired-mode.

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

Я использовал его для того, чтобы опустить идентификатор группы файлов с опцией -o, сохраняя некоторую горизонтальную экранную недвижимость.

Ответ 4

Я бы использовал здесь ответ: fooobar.com/info/42814/... и команду компиляции, которая будет запущена в вашем каталоге по умолчанию. Таким образом, он предоставит вам новый буфер, но это информация, которую вы ищете.

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