diff options
Diffstat (limited to 'lisp/eshell/em-ls.el')
-rw-r--r-- | lisp/eshell/em-ls.el | 182 |
1 files changed, 90 insertions, 92 deletions
diff --git a/lisp/eshell/em-ls.el b/lisp/eshell/em-ls.el index bb087d2feba..bebb0d81b5b 100644 --- a/lisp/eshell/em-ls.el +++ b/lisp/eshell/em-ls.el @@ -1,6 +1,6 @@ ;;; em-ls.el --- implementation of ls in Lisp -*- lexical-binding:t -*- -;; Copyright (C) 1999-2017 Free Software Foundation, Inc. +;; Copyright (C) 1999-2022 Free Software Foundation, Inc. ;; Author: John Wiegley <johnw@gnu.org> @@ -29,15 +29,16 @@ (require 'cl-lib) (require 'esh-util) (require 'esh-opt) -(eval-when-compile (require 'eshell)) +(require 'esh-proc) +(require 'esh-cmd) ;;;###autoload (progn (defgroup eshell-ls nil - "This module implements the \"ls\" utility fully in Lisp. If it is -passed any unrecognized command switches, it will revert to the -operating system's version. This version of \"ls\" uses text -properties to colorize its output based on the setting of + "This module implements the \"ls\" utility fully in Lisp. +If it is passed any unrecognized command switches, it will revert +to the operating system's version. This version of \"ls\" uses +text properties to colorize its output based on the setting of `eshell-ls-use-colors'." :tag "Implementation of `ls' in Lisp" :group 'eshell-module)) @@ -99,15 +100,14 @@ faster and conserves more memory." :type 'boolean) (defface eshell-ls-directory - '((((class color) (background light)) (:foreground "Blue" :weight bold)) - (((class color) (background dark)) (:foreground "SkyBlue" :weight bold)) - (t (:weight bold))) - "The face used for highlighting directories.") + '((t (:inherit font-lock-function-name-face))) + "The face used for highlighting directories." + :version "29.1") (defface eshell-ls-symlink - '((((class color) (background light)) (:foreground "Dark Cyan" :weight bold)) - (((class color) (background dark)) (:foreground "Cyan" :weight bold))) - "The face used for highlighting symbolic links.") + '((t (:inherit font-lock-keyword-face))) + "The face used for highlighting symbolic links." + :version "29.1") (defface eshell-ls-executable '((((class color) (background light)) (:foreground "ForestGreen" :weight bold)) @@ -183,9 +183,9 @@ really need to stick around for very long." "The face used for highlighting junk file names.") (defsubst eshell-ls-filetype-p (attrs type) - "Test whether ATTRS specifies a directory." - (if (nth 8 attrs) - (eq (aref (nth 8 attrs) 0) type))) + "Test whether ATTRS specifies a file of type TYPE." + (if (file-attribute-modes attrs) + (eq (aref (file-attribute-modes attrs) 0) type))) (defmacro eshell-ls-applicable (attrs index func file) "Test whether, for ATTRS, the user can do what corresponds to INDEX. @@ -193,8 +193,8 @@ ATTRS is a string of file modes. See `file-attributes'. If we cannot determine the answer using ATTRS (e.g., if we need to know what group the user is in), compute the return value by calling FUNC with FILE as an argument." - `(let ((owner (nth 2 ,attrs)) - (modes (nth 8 ,attrs))) + `(let ((owner (file-attribute-user-id ,attrs)) + (modes (file-attribute-modes ,attrs))) (cond ((cond ((numberp owner) (= owner (user-uid))) ((stringp owner) @@ -238,7 +238,6 @@ scope during the evaluation of TEST-SEXP." (defvar show-recursive) (defvar show-size) (defvar sort-method) -(defvar ange-cache) (defvar dired-flag) ;;; Functions: @@ -270,14 +269,13 @@ instead." eshell-current-subjob-p font-lock-mode) ;; use the fancy highlighting in `eshell-ls' rather than font-lock - (when (and eshell-ls-use-colors - (featurep 'font-lock)) + (when eshell-ls-use-colors (font-lock-mode -1) (setq font-lock-defaults nil) (if (boundp 'font-lock-buffers) - (set 'font-lock-buffers - (delq (current-buffer) - (symbol-value 'font-lock-buffers))))) + (setq font-lock-buffers + (delq (current-buffer) + (symbol-value 'font-lock-buffers))))) (require 'em-glob) (let* ((insert-func 'insert) (error-func 'insert) @@ -334,6 +332,7 @@ instead." (apply 'eshell-do-ls args))) (put 'eshell/ls 'eshell-no-numeric-conversions t) +(put 'eshell/ls 'eshell-filename-arguments t) (declare-function eshell-glob-regexp "em-glob" (pattern)) @@ -345,7 +344,7 @@ instead." "ls" (if eshell-ls-initial-args (list eshell-ls-initial-args args) args) - `((?a "all" nil show-all + '((?a "all" nil show-all "do not ignore entries starting with .") (?A "almost-all" nil show-almost-all "do not list implied . and ..") @@ -404,7 +403,7 @@ Sort entries alphabetically across.") (setq listing-style 'by-columns)) (unless args (setq args (list "."))) - (let ((eshell-ls-exclude-regexp eshell-ls-exclude-regexp) ange-cache) + (let ((eshell-ls-exclude-regexp eshell-ls-exclude-regexp)) (when ignore-pattern (unless (eshell-using-module 'eshell-glob) (error (concat "-I option requires that `eshell-glob'" @@ -436,7 +435,7 @@ Sort entries alphabetically across.") (defsubst eshell-ls-size-string (attrs size-width) "Return the size string for ATTRS length, using SIZE-WIDTH." - (let* ((str (eshell-ls-printable-size (nth 7 attrs) t)) + (let* ((str (eshell-ls-printable-size (file-attribute-size attrs) t)) (len (length str))) (if (< len size-width) (concat (make-string (- size-width len) ? ) str) @@ -476,9 +475,9 @@ name should be displayed as, etc. Think of it as cooking a FILEINFO." fileinfo) (defun eshell-ls-file (fileinfo &optional size-width copy-fileinfo) - "Output FILE in long format. -FILE may be a string, or a cons cell whose car is the filename and -whose cdr is the list of file attributes." + "Output FILEINFO in long format. +FILEINFO may be a string, or a cons cell whose car is the +filename and whose cdr is the list of file attributes." (if (not (cdr fileinfo)) (funcall error-func (format "%s: No such file or directory\n" (car fileinfo))) @@ -502,19 +501,19 @@ whose cdr is the list of file attributes." (if numeric-uid-gid "%s%4d %-8s %-8s " "%s%4d %-14s %-8s ") - (or (nth 8 attrs) "??????????") - (or (nth 1 attrs) 0) - (or (let ((user (nth 2 attrs))) + (or (file-attribute-modes attrs) "??????????") + (or (file-attribute-link-number attrs) 0) + (or (let ((user (file-attribute-user-id attrs))) (and (stringp user) (eshell-substring user 14))) - (nth 2 attrs) + (file-attribute-user-id attrs) "") - (or (let ((group (nth 3 attrs))) + (or (let ((group (file-attribute-group-id attrs))) (and (stringp group) (eshell-substring group 8))) - (nth 3 attrs) + (file-attribute-group-id attrs) "")) - (let* ((str (eshell-ls-printable-size (nth 7 attrs))) + (let* ((str (eshell-ls-printable-size (file-attribute-size attrs))) (len (length str))) ;; Let file sizes shorter than 9 align neatly. (if (< len (or size-width 8)) @@ -523,12 +522,14 @@ whose cdr is the list of file attributes." " " (format-time-string (concat eshell-ls-date-format " " - (if (= (nth 5 (decode-time)) - (nth 5 (decode-time - (nth (cond - ((eq sort-method 'by-atime) 4) - ((eq sort-method 'by-ctime) 6) - (t 5)) attrs)))) + (if (= (decoded-time-year (decode-time)) + (decoded-time-year + (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) @@ -584,12 +585,12 @@ relative to that directory." (let ((total 0.0)) (setq size-width 0) (dolist (e entries) - (if (nth 7 (cdr e)) - (setq total (+ total (nth 7 (cdr e))) + (if (file-attribute-size (cdr e)) + (setq total (+ total (file-attribute-size (cdr e))) size-width (max size-width (length (eshell-ls-printable-size - (nth 7 (cdr e)) + (file-attribute-size (cdr e)) (not ;; If we are under -l, count length ;; of sizes in bytes, not in blocks. @@ -628,38 +629,37 @@ In Eshell's implementation of ls, ENTRIES is always reversed." (if (eq sort-method 'unsorted) (nreverse entries) (sort entries - (function - (lambda (l r) - (let ((result - (cond - ((eq sort-method 'by-atime) - (eshell-ls-compare-entries l r 4 'time-less-p)) - ((eq sort-method 'by-mtime) - (eshell-ls-compare-entries l r 5 'time-less-p)) - ((eq sort-method 'by-ctime) - (eshell-ls-compare-entries l r 6 '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)))) - (rx (file-name-extension - (directory-file-name (car r))))) - (cond - ((or (and (not lx) (not rx)) - (equal lx rx)) - (string-lessp (directory-file-name (car l)) - (directory-file-name (car r)))) - ((not lx) t) - ((not rx) nil) - (t - (string-lessp lx rx))))) - (t - (string-lessp (directory-file-name (car l)) - (directory-file-name (car r))))))) - (if reverse-list - (not result) - result))))))) + (lambda (l r) + (let ((result + (cond + ((eq sort-method 'by-atime) + (eshell-ls-compare-entries l r 4 'time-less-p)) + ((eq sort-method 'by-mtime) + (eshell-ls-compare-entries l r 5 'time-less-p)) + ((eq sort-method 'by-ctime) + (eshell-ls-compare-entries l r 6 '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)))) + (rx (file-name-extension + (directory-file-name (car r))))) + (cond + ((or (and (not lx) (not rx)) + (equal lx rx)) + (string-lessp (directory-file-name (car l)) + (directory-file-name (car r)))) + ((not lx) t) + ((not rx) nil) + (t + (string-lessp lx rx))))) + (t + (string-lessp (directory-file-name (car l)) + (directory-file-name (car r))))))) + (if reverse-list + (not result) + result)))))) (defun eshell-ls-files (files &optional size-width copy-fileinfo) "Output a list of FILES. @@ -679,12 +679,12 @@ Each member of FILES is either a string or a cons cell of the form (let ((f files) last-f display-files - ignore) + ) ;; ignore (while f (if (cdar f) (setq last-f f f (cdr f)) - (unless ignore + (unless nil ;; ignore (funcall error-func (format "%s: No such file or directory\n" (caar f)))) (if (eq f files) @@ -697,9 +697,9 @@ Each member of FILES is either a string or a cons cell of the form (setcar f (cadr f)) (setcdr f (cddr f)))))) (if (not show-size) - (setq display-files (mapcar 'eshell-ls-annotate files)) + (setq display-files (mapcar #'eshell-ls-annotate files)) (dolist (file files) - (let* ((str (eshell-ls-printable-size (nth 7 (cdr file)) t)) + (let* ((str (eshell-ls-printable-size (file-attribute-size (cdr file)) t)) (len (length str))) (if (< len size-width) (setq str (concat (make-string (- size-width len) ? ) str))) @@ -765,14 +765,14 @@ need to be printed." (if show-size (max size-width (length (eshell-ls-printable-size - (nth 7 (cdr entry)) t)))))) + (file-attribute-size (cdr entry)) t)))))) (setq dirs (cons entry dirs))) (setq files (cons entry files) size-width (if show-size (max size-width (length (eshell-ls-printable-size - (nth 7 (cdr entry)) t))))))) + (file-attribute-size (cdr entry)) t))))))) (when files (eshell-ls-files (eshell-ls-sort-entries files) size-width show-recursive) @@ -796,12 +796,11 @@ to use, and each member of which is the width of that column (width 0) (widths (mapcar - (function - (lambda (file) - (+ 2 (length (car file))))) + (lambda (file) + (+ 2 (length (car file)))) files)) ;; must account for the added space... - (max-width (+ (window-width) 2)) + (max-width (+ (window-body-width nil 'remap) 2)) (best-width 0) col-widths) @@ -843,11 +842,10 @@ to use, and each member of which is the width of that column (width 0) (widths (mapcar - (function - (lambda (file) - (+ 2 (length (car file))))) + (lambda (file) + (+ 2 (length (car file)))) files)) - (max-width (+ (window-width) 2)) + (max-width (+ (window-body-width nil 'remap) 2)) col-widths colw) |