Mercurial > emacs
changeset 46853:cb339473da3b
I did not mean to check in these changes yet, they are still
unreviewed.
author | John Wiegley <johnw@newartisans.com> |
---|---|
date | Sat, 10 Aug 2002 00:20:09 +0000 |
parents | 6eb625bead4f |
children | 28b72b441940 |
files | lisp/eshell/em-ls.el |
diffstat | 1 files changed, 88 insertions(+), 263 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/eshell/em-ls.el Sat Aug 10 00:18:18 2002 +0000 +++ b/lisp/eshell/em-ls.el Sat Aug 10 00:20:09 2002 +0000 @@ -1,9 +1,8 @@ ;;; em-ls.el --- implementation of ls in Lisp -;; Copyright (C) 1999, 2000, 2001 Free Software Foundation +;; Copyright (C) 1999, 2000 Free Software Foundation ;; Author: John Wiegley <johnw@gnu.org> -;; Modified: Rafael Sepúlveda <drs@gnulinux.org.mx> ;; This file is part of GNU Emacs. @@ -289,16 +288,12 @@ (defvar error-func) (defvar flush-func) (defvar human-readable) - (defvar ignore) - (defvar ignore-backups) (defvar ignore-pattern) - (defvar indicator-style) (defvar insert-func) (defvar listing-style) (defvar numeric-uid-gid) (defvar reverse-list) (defvar show-all) - (defvar show-full-time) (defvar show-recursive) (defvar show-size) (defvar sort-method) @@ -312,167 +307,63 @@ "ls" (if eshell-ls-initial-args (list eshell-ls-initial-args args) args) - `((?a "all" all show-all - "do not hide entries starting with .") - (?A "almost-all" almost show-all - "do not list implied . and ..") - (?B "ignore-backups" nil ignore-backups - "do not list implied entries that match ending\n\t\t\t with `eshell-ls-backup-regexp'") + `((?a "all" nil show-all + "show all files in directory") (?c nil by-ctime sort-method "sort by modification time") - (?C nil by-columns listing-style - "list entries by columns") (?d "directory" nil dir-literal "list directory entries instead of contents") - (?F "classify" classify indicator-style - "append indicator (one of */=@|) to entries") - (nil "full-time" nil show-full-time - "list both full date and full time") - (?g nil nil ignore - "(ignored)") (?k "kilobytes" 1024 block-size - "like --block-size=1024") + "using 1024 as the block size") (?h "human-readable" 1024 human-readable "print sizes in human readable format") - (nil "si" 1000 human-readable - "likewise, but use powers of 1000 not 1024") - (?H nil -1 human-readable - "same as `--si' for now; soon to change\n\t\t\t to conform to POSIX") - (nil "indicator-style" t indicator-style - "append indicator with style WORD to entry names:\n\t\t\t none (default), classify (-F), file-type (-p)") + (?H "si" 1000 human-readable + "likewise, but use powers of 1000 not 1024") (?I "ignore" t ignore-pattern "do not list implied entries matching pattern") (?l nil long-listing listing-style "use a long listing format") - (?L "deference" nil dereference-links - "list entries pointed to by symbolic links") (?n "numeric-uid-gid" nil numeric-uid-gid "list numeric UIDs and GIDs instead of names") - (?p "file-type" file-type indicator-style - "append indicator (one of /=@|) to entries") (?r "reverse" nil reverse-list "reverse order while sorting") - (?R "recursive" nil show-recursive - "list subdirectories recursively") (?s "size" nil show-size "print size of each file, in blocks") - (?S nil by-size sort-method - "sort by file size") (?t nil by-mtime sort-method "sort by modification time") (?u nil by-atime sort-method "sort by last access time") - (?U nil unsorted sort-method - "do not sort; list entries in directory order") (?x nil by-lines listing-style "list entries by lines instead of by columns") + (?C nil by-columns listing-style + "list entries by columns") + (?L "deference" nil dereference-links + "list entries pointed to by symbolic links") + (?R "recursive" nil show-recursive + "list subdirectories recursively") + (?S nil by-size sort-method + "sort by file size") + (?U nil unsorted sort-method + "do not sort; list entries in directory order") (?X nil by-extension sort-method "sort alphabetically by entry extension") - (?v nil by-version sort-method - "sort by version") (?1 nil single-column listing-style "list one file per line") (nil "help" nil nil - "display this help and exit") + "show this usage display") :external "ls" :usage "[OPTION]... [FILE]... List information about the FILEs (the current directory by default). -Sort entries alphabetically if none of -cftuSUX nor --sort.") -;; FIXME: Pending GNU 'ls' implementations and/or revisions. -;; -;; -b, --escape print octal escapes for nongraphic characters -;; --block-size=SIZE use SIZE-byte blocks -;; -c with -lt: sort by, and show, ctime (time of last -;; modification of file status information) -;; with -l: show ctime and sort by name -;; otherwise: sort by ctime -;; --color[=WHEN] control whether color is used to distinguish file -;; types. WHEN may be `never', `always', or `auto' -;; -D, --dired generate output designed for Emacs' dired mode -;; -f do not sort, enable -aU, disable -lst -;; --format=WORD across -x, commas -m, horizontal -x, long -l, -;; single-column -1, verbose -l, vertical -C -;; -G, --no-group inhibit display of group information -;; --indicator-style=WORD append indicator with style WORD to entry names: -;; none (default), classify (-F), file-type (-p) -;; -i, --inode print index number of each file -;; -I, --ignore=PATTERN do not list implied entries matching shell PATTERN -;; -L, --dereference show file information for referents of symlinks -;; -m fill width with a comma separated list of entries -;; -n, --numeric-uid-gid list numeric UIDs and GIDs instead of names -;; -N, --literal print raw entry names (don't treat e.g. control -;; characters specially) -;; -o use long listing format without group info -;; -q, --hide-control-chars print ? instead of non graphic characters -;; --show-control-chars show non graphic characters as-is (default -;; unless program is `ls' and output is a terminal) -;; -Q, --quote-name enclose entry names in double quotes -;; --quoting-style=WORD use quoting style WORD for entry names: -;; literal, locale, shell, shell-always, c, escape -;; -s, --size print size of each file, in blocks -;; --sort=WORD extension -X, none -U, size -S, time -t, -;; version -v -;; status -c, time -t, atime -u, access -u, use -u -;; --time=WORD show time as WORD instead of modification time: -;; atime, access, use, ctime or status; use -;; specified time as sort key if --sort=time -;; -T, --tabsize=COLS assume tab stops at each COLS instead of 8 -;; -u with -lt: sort by, and show, access time -;; with -l: show access time and sort by name -;; otherwise: sort by access time -;; -w, --width=COLS assume screen width instead of current value -;; --version output version information and exit - -;; By default, color is not used to distinguish types of files. That is -;; equivalent to using --color=none. Using the --color option without the -;; optional WHEN argument is equivalent to using --color=always. With -;; --color=auto, color codes are output only if standard output is connected -;; to a terminal (tty). - -;; Report bugs to <bug-fileutils@gnu.org>. - +Sort entries alphabetically across.") ;; setup some defaults, based on what the user selected (unless block-size (setq block-size eshell-ls-default-blocksize)) (unless listing-style (setq listing-style 'by-columns)) - (when (eq -1 human-readable) - (message "%s" (concat "ls: Warning: the meaning of -H will change " - "in the future to conform to POSIX.\n" - "Use --si for the old meaning.")) - (setq human-readable 1000)) - (when indicator-style -; (set-text-properties 0 (length indicator-style) nil indicator-style)) - (cond - ((string= "classify" indicator-style) - (setq indicator-style 'classify)) - ((string= "file-type" indicator-style) - (setq indicator-style 'file-type)) - ((string= "none" indicator-style) - (setq indicator-style nil)) - (t - (error (concat - (format "ls: invalid argument `%s' for `--indicator-style'\n" indicator-style) - "Valid arguments are:\n" - " - `none'\n" - " - `classify'\n" - " - `file-type'\n" - "Try `ls --help' for more information.\n" ))))) - (unless args (setq args (list "."))) - (when show-full-time - (setq listing-style 'long-listing)) - (let ((eshell-ls-exclude-regexp eshell-ls-exclude-regexp) ange-cache) - (when ignore-backups ; `-B' parameter - (setq eshell-ls-exclude-regexp - (if eshell-ls-exclude-regexp - (concat "\\(" eshell-ls-exclude-regexp "\\|" - eshell-ls-backup-regexp "\\)") - eshell-ls-backup-regexp))) - - (when ignore-pattern ; `-I' parameter + (when ignore-pattern (unless (eshell-using-module 'eshell-glob) (error (concat "-I option requires that `eshell-glob'" " be a member of `eshell-modules-list'"))) @@ -566,7 +457,7 @@ (if show-size (concat (eshell-ls-size-string attrs size-width) " ")) (format - "%s%5d %-8s %-8s " + "%s%4d %-8s %-8s " (or (nth 8 attrs) "??????????") (or (nth 1 attrs) 0) (or (let ((user (nth 2 attrs))) @@ -593,21 +484,19 @@ (concat (make-string (- 8 len) ? ) str) str)) " " (format-time-string - (if show-full-time - "%a %b %d %T %Y" - (concat - "%b %e " - (if (= (nth 5 (decode-time (current-time))) - (nth 5 (decode-time - (nth (cond - ((eq sort-method 'by-atime) 4) - ((eq sort-method 'by-ctime) 6) - (t 5)) attrs)))) - "%H:%M" - " %Y"))) (nth (cond - ((eq sort-method 'by-atime) 4) - ((eq sort-method 'by-ctime) 6) - (t 5)) attrs)) " "))) + (concat + "%b %e " + (if (= (nth 5 (decode-time (current-time))) + (nth 5 (decode-time + (nth (cond + ((eq sort-method 'by-atime) 4) + ((eq sort-method 'by-ctime) 6) + (t 5)) attrs)))) + "%H:%M" + " %Y")) (nth (cond + ((eq sort-method 'by-atime) 4) + ((eq sort-method 'by-ctime) 6) + (t 5)) attrs)) " "))) (funcall insert-func line file "\n")))))) (defun eshell-ls-dir (dirinfo &optional insert-name root-dir size-width) @@ -629,14 +518,9 @@ (expand-file-name dir))) (cdr dirinfo))) ":\n")) (let ((entries (eshell-directory-files-and-attributes - dir nil - (or - (and (eq show-all 'almost) - "^\\(....*\\|.[^.]\\)$") - (and (not (eq show-all 'all)) - eshell-ls-exclude-hidden - "\\`[^.]")) - t))) + dir nil (and (not show-all) + eshell-ls-exclude-hidden + "\\`[^.]") t))) (when (and (not show-all) eshell-ls-exclude-regexp) (while (and entries (string-match eshell-ls-exclude-regexp (caar entries))) @@ -700,6 +584,8 @@ (eshell-ls-compare-entries l r 5 'eshell-time-less-p)) ((eq sort-method 'by-ctime) (eshell-ls-compare-entries l r 6 'eshell-time-less-p)) + ((eq sort-method 'by-size) + (eshell-ls-compare-entries l r 7 '<)) ((eq sort-method 'by-extension) (let ((lx (file-name-extension (directory-file-name (car l)))) @@ -714,23 +600,9 @@ ((not rx) nil) (t (string-lessp lx rx))))) - ((eq sort-method 'by-size) - (eshell-ls-compare-entries l r 7 '<)) - ((eq sort-method 'by-version) + (t (string-lessp (directory-file-name (car l)) - (directory-file-name (car r)))) - - (t - (let* ((dir-l (directory-file-name (car l))) - (lx (if (= (aref dir-l 0) ?.) - (substring dir-l 1) - dir-l)) - (dir-r (directory-file-name (car r))) - (rx (if (= (aref dir-r 0) ?.) - (substring dir-r 1) - dir-r))) - (string-lessp lx rx)))))) - + (directory-file-name (car r))))))) (if reverse-list (not result) result))))))) @@ -971,105 +843,58 @@ (defun eshell-ls-decorated-name (file) "Return FILE, possibly decorated. Use TRUENAME for predicate tests, if passed." - (let ((classify-indicator - (when (and - (cdr file) - (or - (eq indicator-style 'classify) - (eq indicator-style 'file-type))) - (cond - ((stringp (cadr file)) - (if (not (eq listing-style 'long-listing)) ;avoid showing `@' in long listing - "@")) ;symlinks - - ((eq (cadr file) t) - "/") ;directory + (if eshell-ls-use-colors + (let ((face + (cond + ((not (cdr file)) + 'eshell-ls-missing-face) + + ((stringp (cadr file)) + 'eshell-ls-symlink-face) + + ((eq (cadr file) t) + 'eshell-ls-directory-face) - ((and (stringp (car (nthcdr 9 file))) - (string-match "p" (substring (car (nthcdr 9 file)) 0 1))) - "|") ;FIFO - ((and (stringp (car (nthcdr 9 file))) - (string-match "s" (substring (car (nthcdr 9 file)) 0 1))) - "=") ;socket + ((not (eshell-ls-filetype-p (cdr file) ?-)) + 'eshell-ls-special-face) - ((and (/= (user-uid) 0) - (not (eq indicator-style 'file-type)) ;inhibith * in -p - (eshell-ls-applicable (cdr file) 3 - 'file-executable-p (car file))) - "*")))) ;executable + ((and (/= (user-uid) 0) ; root can execute anything + (eshell-ls-applicable (cdr file) 3 + 'file-executable-p (car file))) + 'eshell-ls-executable-face) + + ((not (eshell-ls-applicable (cdr file) 1 + 'file-readable-p (car file))) + 'eshell-ls-unreadable-face) - (face - (when eshell-ls-use-colors - (cond - ((not (cdr file)) - 'eshell-ls-missing-face) - - ((stringp (cadr file)) - (if (file-exists-p (cadr file)) - 'eshell-ls-symlink-face - 'eshell-ls-broken-symlink-face)) - - ((eq (cadr file) t) - 'eshell-ls-directory-face) - - ((not (eshell-ls-filetype-p (cdr file) ?-)) - (cond - ((and (stringp (car (nthcdr 9 file))) - (string-match "p" (substring (car (nthcdr 9 file)) 0 1))) - 'eshell-ls-fifo-face) - ((and (stringp (car (nthcdr 9 file))) - (string-match "s" (substring (car (nthcdr 9 file)) 0 1))) - 'eshell-ls-socket-face) - (t - 'eshell-ls-special-face))) - - ((and (/= (user-uid) 0) ; root can execute anything - (eshell-ls-applicable (cdr file) 3 - 'file-executable-p (car file))) - 'eshell-ls-executable-face) - - ((not (eshell-ls-applicable (cdr file) 1 - 'file-readable-p (car file))) - 'eshell-ls-unreadable-face) - - ((string-match eshell-ls-archive-regexp (car file)) - 'eshell-ls-archive-face) - - ((string-match eshell-ls-backup-regexp (car file)) - 'eshell-ls-backup-face) - - ((string-match eshell-ls-product-regexp (car file)) - 'eshell-ls-product-face) - - ((string-match eshell-ls-clutter-regexp (car file)) - 'eshell-ls-clutter-face) - - ((if eshell-ls-highlight-alist - (let ((tests eshell-ls-highlight-alist) - value) - (while tests - (if (funcall (caar tests) (car file) (cdr file)) - (setq value (cdar tests) tests nil) - (setq tests (cdr tests)))) - value))) - - ;; this should be the last evaluation, even after user defined alist. - ((not (eshell-ls-applicable (cdr file) 2 - 'file-writable-p (car file))) - 'eshell-ls-readonly-face))))) + ((string-match eshell-ls-archive-regexp (car file)) + 'eshell-ls-archive-face) + + ((string-match eshell-ls-backup-regexp (car file)) + 'eshell-ls-backup-face) + + ((string-match eshell-ls-product-regexp (car file)) + 'eshell-ls-product-face) + + ((string-match eshell-ls-clutter-regexp (car file)) + 'eshell-ls-clutter-face) - (when (and face (not (get-text-property 0 'classify-indicator (car file)))) - (add-text-properties 0 (length (car file)) - (list 'face face) - (car file))) - - (when (and classify-indicator (not (get-text-property 0 'classify-indicator (car file)))) - (setcar file (concat (car file) classify-indicator)) - (add-text-properties 0 (length (car file)) - (list 'classify-indicator t) - (car file)))) - - (car file)) + ((not (eshell-ls-applicable (cdr file) 2 + 'file-writable-p (car file))) + 'eshell-ls-readonly-face) + (eshell-ls-highlight-alist + (let ((tests eshell-ls-highlight-alist) + value) + (while tests + (if (funcall (caar tests) (car file) (cdr file)) + (setq value (cdar tests) tests nil) + (setq tests (cdr tests)))) + value))))) + (if face + (add-text-properties 0 (length (car file)) + (list 'face face) + (car file))))) + (car file)) ;;; Code: