diff options
author | Eli Zaretskii <eliz@gnu.org> | 2013-12-18 18:01:43 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2013-12-18 18:01:43 +0200 |
commit | 64e4c76edfed1464ee91848bba29ee0d385208e1 (patch) | |
tree | ea9b1da48088ccf443b0cc8cff529ca3376ee348 /lisp/ls-lisp.el | |
parent | 18874304db15434bbc2a9bcf28b71c86f6dc4bd8 (diff) | |
download | emacs-64e4c76edfed1464ee91848bba29ee0d385208e1.tar.gz |
Fix bug #16179 with ls-lisp emulation of the ls -s switch.
src/ls-lisp.el (ls-lisp-insert-directory): Don't modify %d and %f
formats for displaying file sizes when the -s switch is given.
Instead, compute a separate format for displaying the size in
blocks, which is displayed in addition to the "regular" size.
When -h is given in addition to -s, produce size in blocks in
human-readable form as well.
Diffstat (limited to 'lisp/ls-lisp.el')
-rw-r--r-- | lisp/ls-lisp.el | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/lisp/ls-lisp.el b/lisp/ls-lisp.el index 67bcdc8c82b..ae6fcb0599d 100644 --- a/lisp/ls-lisp.el +++ b/lisp/ls-lisp.el @@ -208,6 +208,8 @@ to fail to line up, e.g. if month names are not all of the same length." "Format to display integer file sizes.") (defvar ls-lisp-filesize-f-fmt "%.0f" "Format to display float file sizes.") +(defvar ls-lisp-filesize-b-fmt "%.0f" + "Format to display file sizes in blocks (for the -s switch).") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -356,17 +358,15 @@ not contain `d', so that a full listing is expected." (setq ls-lisp-gid-d-fmt (format " %%-%dd" max-gid-len)) (setq ls-lisp-gid-s-fmt (format " %%-%ds" max-gid-len)) (setq ls-lisp-filesize-d-fmt - (format " %%%dd" - (if (memq ?s switches) - (length (format "%.0f" - (fceiling (/ max-file-size 1024.0)))) - (length (format "%.0f" max-file-size))))) + (format " %%%dd" (length (format "%.0f" max-file-size)))) (setq ls-lisp-filesize-f-fmt - (format " %%%d.0f" - (if (memq ?s switches) + (format " %%%d.0f" (length (format "%.0f" max-file-size)))) + (if (memq ?s switches) + (setq ls-lisp-filesize-b-fmt + (format "%%%d.0f " (length (format "%.0f" - (fceiling (/ max-file-size 1024.0)))) - (length (format "%.0f" max-file-size))))) + (fceiling + (/ max-file-size 1024.0))))))) (setq files file-alist) (while files ; long (-l) format (setq elt (car files) @@ -653,9 +653,20 @@ SWITCHES and TIME-INDEX give the full switch list and time data." (cdr inode)))) (format " %18d " inode)))) ;; nil is treated like "" in concat - (if (memq ?s switches) ; size in K - (format ls-lisp-filesize-f-fmt - (fceiling (/ file-size 1024.0)))) + (if (memq ?s switches) ; size in K, rounded up + ;; In GNU ls, -h affects the size in blocks, displayed + ;; by -s, as well. + (if (memq ?h switches) + (format "%6s " + (file-size-human-readable + ;; We use 1K as "block size", although + ;; most Windows volumes use 4KB to 8KB + ;; clusters, and exFAT will usually have + ;; clusters of 32KB or even 128KB. See + ;; KB article 140365 for the details. + (* 1024.0 (fceiling (/ file-size 1024.0))))) + (format ls-lisp-filesize-b-fmt + (fceiling (/ file-size 1024.0))))) drwxrwxrwx ; attribute string (if (memq 'links ls-lisp-verbosity) (format "%3d" (nth 1 file-attr))) ; link count @@ -737,7 +748,7 @@ All ls time options, namely c, t and u, are handled." ls-lisp-filesize-f-fmt ls-lisp-filesize-d-fmt) file-size) - (format " %7s" (file-size-human-readable file-size)))) + (format " %6s" (file-size-human-readable file-size)))) (provide 'ls-lisp) |