Замените "ls" с emacs dired на другое приложение - PullRequest
2 голосов
/ 29 июня 2011

Я написал некоторый скрипт в elisp, он объединяет ls -l и du (показывая реальный размер папки вместо того, что написано в ls). Я назвал это lsd. Вот скриншот:

http://i.imgur.com/PfSq6.png

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

lsd.el

#!/usr/bin/emacs --script
(progn
  (setq argz command-line-args-left)
  (setq folder "./")
  (while argz
    ;; (message (car argz))
    (if (/= ?- (aref (car argz) 0))
      (setq folder (car argz)))
    (setq argz (cdr argz)))
  (if (/= ?/ (aref folder (1- (length folder)))) (setq folder (concat folder "/")))
  (switch-to-buffer " *lsd*")
  (erase-buffer)
  (shell-command (concat "ls -l -h --color=always " " " (apply 'concat (mapcar '(lambda(arg) (concat arg " ")) command-line-args-left))) (current-buffer))
  (switch-to-buffer " *du*")
  (erase-buffer)
  (shell-command (concat "du -h -d 1 " folder) (current-buffer))
  (goto-char 1)
  (while (search-forward "Permission denied" (point-max) t nil)
    (goto-char (point-at-bol))
    (let ((beg (point)))
      (forward-line)
      (delete-region beg (point)))) ; Remove all permission denied lines, thus show only permitted size.
  (goto-char 1)
  (while (and (search-forward folder (point-max) t nil) (/= (point-max) (1+ (point-at-eol)))) ; we do not need last line(the folder itself), so this line is something complex.
    (setq DIR (buffer-substring (point) (point-at-eol)))
    (goto-char (point-at-bol))
    (setq SIZE (buffer-substring (point) (1- (search-forward "  " (point-at-eol) nil nil))))
    (goto-char (point-at-eol))
    (switch-to-buffer " *lsd*")
    (goto-char 1)
    (if (search-forward DIR (point-max) t nil)
      (progn
        (goto-char (point-at-bol))
        (search-forward-regexp "[0-9]+" (point-at-eol) nil nil)
        (search-forward-regexp "  *[0-9]+[^ \n]*[ \n]*" (point-at-eol) nil nil)
        ;; If ls have options, that makes some numbers before size column - we are doomed. (-s, for example)
        (setq SIZE (concat SIZE " "))
        (while (< (length SIZE) (length (match-string 0))) (setq SIZE (concat " " SIZE)))
        (replace-match SIZE)))
    (switch-to-buffer " *du*"))
  (switch-to-buffer " *lsd*")
  (message "%s" (buffer-substring (point-min) (point-max)))
  (defun error(&rest args) args)
  (defun message(&rest args) args)) ; Do not show any messages.

LSD (Я создал этот скрипт для запуска emacs без загрузки чего-либо, кроме скрипта. Если это можно сделать проще, укажите это)

#/bin/bash
emacs -Q --script /usr/local/bin/lsd.el $@

А вот и проблема: как использовать этот lsd в dired?

Могу ли я изменить что-то в dired, чтобы использовать lsd вместо ls?

Могу ли я переименовать ls в oldls и создать сценарий ls bash, который передает все аргументы ls, если нет флага --lsd, и передает все аргументы lsd, если --lsd здесь?

Это вообще хорошая идея?

Ответы [ 2 ]

2 голосов
/ 06 мая 2015

В Emacs24 также есть `insert-directory-program ' для установки исполняемого файла ls.Поместите

(setq insert-directory-program "/usr/local/bin/lsd")

(измените путь соответственно) в ваш .emacs или init.el и dired примет ваш скрипт lsd.

1 голос
/ 29 июня 2011

Я не знаю, самый ли это эффективный способ сделать что-то, я все еще начинающий Emacs.Но вот как бы я это сделал.

  1. Поскольку вы работаете в Linux, вам следует начать с того, чтобы сказать emacs использовать встроенную эмуляцию ls.Простого (require 'ls-lisp) в вашем файле инициализации должно быть достаточно.
  2. Установите для переменной ls-lisp-use-insert-directory-program значение true.Это заставляет emacs использовать внешнюю программу для ls.
  3. Фактическую программу, которую она использует, можно настроить, установив переменную insert-directory-program, указывающую на ваш скрипт lsd.Вот пример того, как это сделать:
    ;; Put this in your init file
    (require 'ls-lisp)
    (setq ls-lisp-use-insert-directory-program T)
    (setq insert-directory-program "~/path/to/lsd")
    

    Дайте мне знать, если это работает для вас.Я использую emacs в Windows, поэтому я не уверен, насколько хорошо это переносится на linux (это часть эмуляции ls).

...