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 ;;;;;;;;;;;;;;;;;;;;
|
; 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."
|
"Maximum length of a partition’s ruler."
|
||||||
:group 'eshell-info-banner
|
:group 'eshell-info-banner
|
||||||
:type 'integer)
|
:type 'integer)
|
||||||
|
|
||||||
(defcustom eshell-info-banner--percentage-critical 90
|
(defcustom eshell-info-banner-percentage-critical 120
|
||||||
"When a percentage becomes critical."
|
"When a percentage becomes critical."
|
||||||
:group 'eshell-info-banner
|
:group 'eshell-info-banner
|
||||||
:type 'float)
|
:type 'float)
|
||||||
|
|
||||||
(defcustom eshell-info-banner--percentage-warning 75
|
(defcustom eshell-info-banner-percentage-warning 75
|
||||||
"When to warn about a percentage."
|
"When to warn about a percentage."
|
||||||
:group 'eshell-info-banner
|
:group 'eshell-info-banner
|
||||||
:type 'float)
|
:type 'float)
|
||||||
|
|
||||||
(defcustom eshell-info-banner--progress-bar-char "="
|
(defcustom eshell-info-banner-progress-bar-char "="
|
||||||
"Character to fill the progress bars with."
|
"Character to fill the progress bars with."
|
||||||
:group 'eshell-info-banner
|
:group 'eshell-info-banner
|
||||||
:type 'char)
|
: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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
; Faces ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
||||||
(defface eshell-info-banner-background-face
|
(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."
|
Return detected partitions as a list of structs."
|
||||||
(let ((partitions (split-string (shell-command-to-string "df -lH") (regexp-quote "\n") t)))
|
(let ((partitions (split-string (shell-command-to-string "df -lH") (regexp-quote "\n") t)))
|
||||||
(mapc (lambda (partition)
|
(-keep (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)
|
|
||||||
(let* ((partition (split-string partition " " t))
|
(let* ((partition (split-string partition " " t))
|
||||||
(filesystem (nth 0 partition))
|
(filesystem (nth 0 partition))
|
||||||
(size (nth 1 partition))
|
(size (nth 1 partition))
|
||||||
@ -155,26 +155,29 @@ Return detected partitions as a list of structs."
|
|||||||
(mount (nth 5 partition)))
|
(mount (nth 5 partition)))
|
||||||
(when (string-prefix-p "/dev" filesystem t)
|
(when (string-prefix-p "/dev" filesystem t)
|
||||||
(make-eshell-info-banner--mounted-partitions
|
(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
|
:size size
|
||||||
:used used
|
:used used
|
||||||
:percent (string-to-number
|
:percent (string-to-number
|
||||||
(string-trim-left percent (regexp-quote "%")))))))
|
(string-trim-left percent (regexp-quote "%")))))))
|
||||||
partitions))))
|
partitions)))
|
||||||
|
|
||||||
(defun eshell-info-banner--get-left-pad (initial-pad partitions)
|
(defun eshell-info-banner--get-longest-path (partitions &optional len)
|
||||||
"Get left padding for the various rulers.
|
"Find the length of the longest partition path in `PARTITIONS'.
|
||||||
|
|
||||||
If `PARTITIONS' have a name short enough, then return
|
The variable `LEN' should only be used internally and represents
|
||||||
`INITIAL-PAD', otherwise return enough length to display the
|
the longest path so far, or the minimum length of text present on
|
||||||
shortened name of the partitions with a long name."
|
the left side of the banner."
|
||||||
(if partitions
|
(let ((len (if (null len)
|
||||||
(let ((part-length (length (eshell-info-banner--mounted-partitions-path (car partitions)))))
|
eshell-info-banner--min-length-left
|
||||||
(eshell-info-banner--get-left-pad (if (> part-length initial-pad)
|
len)))
|
||||||
part-length
|
(if (null partitions)
|
||||||
initial-pad)
|
len
|
||||||
(cdr partitions)))
|
(let* ((path (eshell-info-banner--mounted-partitions-path (car partitions)))
|
||||||
initial-pad))
|
(len (max (length path) len)))
|
||||||
|
(eshell-info-banner--get-longest-path (cdr partitions) len)))))
|
||||||
|
|
||||||
(defun eshell-info-banner--get-color-percentage (percentage)
|
(defun eshell-info-banner--get-color-percentage (percentage)
|
||||||
"Display a `PERCENTAGE' with its according face."
|
"Display a `PERCENTAGE' with its according face."
|
||||||
@ -182,16 +185,16 @@ shortened name of the partitions with a long name."
|
|||||||
(string-to-number percentage)
|
(string-to-number percentage)
|
||||||
percentage)))
|
percentage)))
|
||||||
(cond
|
(cond
|
||||||
((>= percentage eshell-info-banner--percentage-critical)
|
((>= percentage eshell-info-banner-percentage-critical)
|
||||||
'eshell-info-banner-critical-face)
|
'eshell-info-banner-critical-face)
|
||||||
((>= percentage eshell-info-banner--percentage-warning)
|
((>= percentage eshell-info-banner-percentage-warning)
|
||||||
'eshell-info-banner-warning-face)
|
'eshell-info-banner-warning-face)
|
||||||
(t 'eshell-info-banner-normal-face))))
|
(t 'eshell-info-banner-normal-face))))
|
||||||
|
|
||||||
(defun eshell-info-banner--progress-bar (length percentage)
|
(defun eshell-info-banner--progress-bar (length percentage)
|
||||||
"Display a progress bar `LENGTH' long and `PERCENTAGE' full.
|
"Display a progress bar `LENGTH' long and `PERCENTAGE' full.
|
||||||
The full path will be displayed filled with the character
|
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."
|
`PERCENTAGE' percents. The rest will be empty."
|
||||||
(let* ((length-filled (if (= 0 percentage)
|
(let* ((length-filled (if (= 0 percentage)
|
||||||
0
|
0
|
||||||
@ -199,10 +202,10 @@ specified by `eshell-info-banner--progress-bar-char' up to
|
|||||||
(length-empty (- length length-filled)))
|
(length-empty (- length length-filled)))
|
||||||
(concat
|
(concat
|
||||||
(eshell-info-banner--with-face "[" :weight 'bold)
|
(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
|
:weight 'bold
|
||||||
:inherit (eshell-info-banner--get-color-percentage percentage))
|
: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)
|
:weight 'bold :inherit 'eshell-info-banner-background-face)
|
||||||
(eshell-info-banner--with-face "]" :weight 'bold))))
|
(eshell-info-banner--with-face "]" :weight 'bold))))
|
||||||
|
|
||||||
@ -229,7 +232,7 @@ displayed."
|
|||||||
(concat (s-pad-right text-padding "." type)
|
(concat (s-pad-right text-padding "." type)
|
||||||
": "
|
": "
|
||||||
(eshell-info-banner--progress-bar bar-length percentage)
|
(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 used)
|
||||||
(file-size-human-readable total)
|
(file-size-human-readable total)
|
||||||
(eshell-info-banner--with-face (number-to-string percentage)
|
(eshell-info-banner--with-face (number-to-string percentage)
|
||||||
@ -256,6 +259,58 @@ See also `eshell-info-banner--display-memory'."
|
|||||||
(number-to-string percentage)
|
(number-to-string percentage)
|
||||||
:inherit (eshell-info-banner--get-color-percentage 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)
|
(provide 'eshell-info-banner)
|
||||||
|
Loading…
Reference in New Issue
Block a user