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:
parent
f6caf18f19
commit
4b592a1f9e
@ -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 partition’s 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)
|
||||
|
Loading…
Reference in New Issue
Block a user