Preliminary banner written, rest should be written easily

Ensures there will always be space for OS, kernel, uptime and hostname
information. Padding works well.

Now, I need to work on the progress bars with the memory and the
partitions.

I might add later a bar for the battery.
This commit is contained in:
Lucien Cartier-Tilet 2021-04-29 19:41:35 +02:00
parent f6caf18f19
commit 4b592a1f9e
Signed by: phundrak
GPG Key ID: BD7789E705CB8DCA

View File

@ -45,26 +45,36 @@
; Custom variables ;;;;;;;;;;;;;;;;;;;;
(defcustom eshell-info-banner--max-length-part 13
(defcustom eshell-info-banner-max-length-partition 13
"Maximum length of a partitions ruler."
:group 'eshell-info-banner
:type 'integer)
(defcustom eshell-info-banner--percentage-critical 90
(defcustom eshell-info-banner-percentage-critical 120
"When a percentage becomes critical."
:group 'eshell-info-banner
:type 'float)
(defcustom eshell-info-banner--percentage-warning 75
(defcustom eshell-info-banner-percentage-warning 75
"When to warn about a percentage."
:group 'eshell-info-banner
:type 'float)
(defcustom eshell-info-banner--progress-bar-char "="
(defcustom eshell-info-banner-progress-bar-char "="
"Character to fill the progress bars with."
:group 'eshell-info-banner
:type 'char)
(defcustom eshell-info-banner-width 80
"Width of the info banner to be shown in Eshell."
:group 'eshell-info-banner
:type 'integer)
(defcustom eshell-info-banner-shorten-path-from 7
"From which length should a path be shortened?"
:group 'eshell-info-banner
:type 'integer)
; Faces ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defface eshell-info-banner-background-face
@ -136,17 +146,7 @@ neither of these, an error will be thrown by the function."
Return detected partitions as a list of structs."
(let ((partitions (split-string (shell-command-to-string "df -lH") (regexp-quote "\n") t)))
(mapc (lambda (partition)
(let ((path (eshell-info-banner--mounted-partitions-path partition)))
(message "Length path: %s" (length path))
(message "Max length: %s" (max eshell-info-banner--min-length-left
eshell-info-banner--max-length-part))
(when (length> path
(max eshell-info-banner--min-length-left
eshell-info-banner--max-length-part))
(setf (eshell-info-banner--mounted-partitions-path partition)
(eshell-info-banner--abbr-path path t)))))
(-keep (lambda (partition)
(-keep (lambda (partition)
(let* ((partition (split-string partition " " t))
(filesystem (nth 0 partition))
(size (nth 1 partition))
@ -155,26 +155,29 @@ Return detected partitions as a list of structs."
(mount (nth 5 partition)))
(when (string-prefix-p "/dev" filesystem t)
(make-eshell-info-banner--mounted-partitions
:path mount
:path (if (length> mount eshell-info-banner-shorten-path-from)
(eshell-info-banner--abbr-path mount)
mount)
:size size
:used used
:percent (string-to-number
(string-trim-left percent (regexp-quote "%")))))))
partitions))))
partitions)))
(defun eshell-info-banner--get-left-pad (initial-pad partitions)
"Get left padding for the various rulers.
(defun eshell-info-banner--get-longest-path (partitions &optional len)
"Find the length of the longest partition path in `PARTITIONS'.
If `PARTITIONS' have a name short enough, then return
`INITIAL-PAD', otherwise return enough length to display the
shortened name of the partitions with a long name."
(if partitions
(let ((part-length (length (eshell-info-banner--mounted-partitions-path (car partitions)))))
(eshell-info-banner--get-left-pad (if (> part-length initial-pad)
part-length
initial-pad)
(cdr partitions)))
initial-pad))
The variable `LEN' should only be used internally and represents
the longest path so far, or the minimum length of text present on
the left side of the banner."
(let ((len (if (null len)
eshell-info-banner--min-length-left
len)))
(if (null partitions)
len
(let* ((path (eshell-info-banner--mounted-partitions-path (car partitions)))
(len (max (length path) len)))
(eshell-info-banner--get-longest-path (cdr partitions) len)))))
(defun eshell-info-banner--get-color-percentage (percentage)
"Display a `PERCENTAGE' with its according face."
@ -182,16 +185,16 @@ shortened name of the partitions with a long name."
(string-to-number percentage)
percentage)))
(cond
((>= percentage eshell-info-banner--percentage-critical)
((>= percentage eshell-info-banner-percentage-critical)
'eshell-info-banner-critical-face)
((>= percentage eshell-info-banner--percentage-warning)
((>= percentage eshell-info-banner-percentage-warning)
'eshell-info-banner-warning-face)
(t 'eshell-info-banner-normal-face))))
(defun eshell-info-banner--progress-bar (length percentage)
"Display a progress bar `LENGTH' long and `PERCENTAGE' full.
The full path will be displayed filled with the character
specified by `eshell-info-banner--progress-bar-char' up to
specified by `eshell-info-banner-progress-bar-char' up to
`PERCENTAGE' percents. The rest will be empty."
(let* ((length-filled (if (= 0 percentage)
0
@ -199,10 +202,10 @@ specified by `eshell-info-banner--progress-bar-char' up to
(length-empty (- length length-filled)))
(concat
(eshell-info-banner--with-face "[" :weight 'bold)
(eshell-info-banner--with-face (s-repeat length-filled eshell-info-banner--progress-bar-char)
(eshell-info-banner--with-face (s-repeat length-filled eshell-info-banner-progress-bar-char)
:weight 'bold
:inherit (eshell-info-banner--get-color-percentage percentage))
(eshell-info-banner--with-face (s-repeat length-empty eshell-info-banner--progress-bar-char)
(eshell-info-banner--with-face (s-repeat length-empty eshell-info-banner-progress-bar-char)
:weight 'bold :inherit 'eshell-info-banner-background-face)
(eshell-info-banner--with-face "]" :weight 'bold))))
@ -229,7 +232,7 @@ displayed."
(concat (s-pad-right text-padding "." type)
": "
(eshell-info-banner--progress-bar bar-length percentage)
(format " %6s / %-5s (%s%%)\n"
(format " %6s / %-5s (%3s%%)\n"
(file-size-human-readable used)
(file-size-human-readable total)
(eshell-info-banner--with-face (number-to-string percentage)
@ -256,6 +259,58 @@ See also `eshell-info-banner--display-memory'."
(number-to-string percentage)
:inherit (eshell-info-banner--get-color-percentage percentage))))))
(defun eshell-info-banner ()
"Banner for Eshell displaying system information."
(let* ((partitions (eshell-info-banner--get-mounted-partitions))
(os (replace-regexp-in-string
".*\"\\(.+\\)\""
"\\1"
(car (-filter (lambda (line)
(s-contains? "PRETTY_NAME" line))
(s-lines (with-temp-buffer
(insert-file-contents "/etc/os-release")
(buffer-string)))))))
(hostname (system-name))
(uptime (s-chop-prefix "up "
(s-trim (shell-command-to-string "uptime -p"))))
(kernel (concat (s-trim (shell-command-to-string "uname -s"))
" "
(s-trim (shell-command-to-string "uname -r"))))
(left-padding (eshell-info-banner--get-longest-path partitions))
(left-text (max (length os)
(length hostname)))
(left-length (+ left-padding 2 left-text)) ; + ": "
(right-text (+ (length "Kernel: ")
(max (length uptime)
(length kernel))))
(tot-width (max (+ left-length right-text 3)
eshell-info-banner-width))
(middle-padding (- tot-width right-text left-padding 4))
(memory (-map (lambda (line)
(s-split " " line t))
(s-split "\n"
(shell-command-to-string "free -b | tail -2")
t)))
(ram (nth 0 memory))
(swap (nth 1 memory)))
(message "%s" partitions)
(message "%s" memory)
(message "%s" ram)
(message "%s" swap)
(concat (format "%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char))
(format "%s: %s Kernel.: %s\n"
(s-pad-right left-padding
"."
"OS")
(s-pad-right middle-padding " " (eshell-info-banner--with-face os :weight 'bold))
kernel)
(format "%s: %s Uptime.: %s\n"
(s-pad-right left-padding "." "Hostname")
(s-pad-right middle-padding " " (eshell-info-banner--with-face hostname :weight 'bold))
uptime
)
)))
(provide 'eshell-info-banner)