Function: eshell-ls-find-column-lengths
eshell-ls-find-column-lengths is a byte-compiled function defined in
em-ls.el.gz.
Signature
(eshell-ls-find-column-lengths FILES)
Documentation
Find the best fitting column lengths for FILES.
It will be returned as a vector, whose length is the number of columns
to use, and each member of which is the width of that column
(including spacing).
Source Code
;; Defined in /usr/src/emacs/lisp/eshell/em-ls.el.gz
(defun eshell-ls-find-column-lengths (files)
"Find the best fitting column lengths for FILES.
It will be returned as a vector, whose length is the number of columns
to use, and each member of which is the width of that column
\(including spacing)."
(let* ((numcols 1)
(width 0)
(widths
(mapcar
(lambda (file)
(+ 2 (length (car file))))
files))
(max-width (+ (window-body-width nil 'remap) 2))
col-widths
colw)
;; refine it based on the following rows
(while numcols
(let* ((rows (ceiling (/ (length widths)
(float numcols))))
(w widths)
(len (* rows numcols))
(index 0)
(i 0))
(setq width 0)
(unless (or (= rows 0)
(<= (/ (length widths) (float rows))
(float (1- numcols))))
(setq colw (make-vector numcols 0))
(while (> len 0)
(if (= i numcols)
(setq i 0 index (1+ index)))
(aset colw i
(max (aref colw i)
(or (nth (+ (* i rows) index) w) 0)))
(setq len (1- len) i (1+ i)))
(setq i 0)
(while (< i numcols)
(setq width (+ width (aref colw i))
i (1+ i))))
(if (>= width max-width)
(setq numcols nil)
(if colw
(setq col-widths colw))
(if (>= numcols (length widths))
(setq numcols nil)
(setq numcols (1+ numcols))))))
(if (not col-widths)
(cons (vector max-width) files)
(setq numcols (length col-widths))
(let* ((rows (ceiling (/ (length widths)
(float numcols))))
(len (* rows numcols))
(newfiles (make-list len nil))
(index 0)
(i 0)
(j 0))
(while (< j len)
(if (= i numcols)
(setq i 0 index (1+ index)))
(setcar (nthcdr j newfiles)
(nth (+ (* i rows) index) files))
(setq j (1+ j) i (1+ i)))
(cons col-widths newfiles)))))