From a2f24e4633786cedbb396729c74db785b0fb7138 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sun, 19 Dec 2021 17:19:42 +0100 Subject: [PATCH] Merge feature/file-size-flavor into master MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit commit 31684ffc39217b55f775bc35b7409baf2d394bcc Author: Lucien Cartier-Tilet Date: Sun Dec 19 17:15:39 2021 +0100 Fix usage of wrong types Use numbers and not human-readable file sizes commit 4627e491bff2257cf37136f00fcd2b0d2bae7279 Author: Lucien Cartier-Tilet Date: Sun Dec 19 17:11:10 2021 +0100 Remove unused function commit aea999276baad7112feb3e7868be4881af362240 Author: Lucien Cartier-Tilet Date: Sun Dec 19 17:11:00 2021 +0100 Fix undefined function commit 8afaabd33f1e7a7f0d991b72a1e4f8cb492c153b Author: Lucien Cartier-Tilet Date: Sun Dec 19 16:53:16 2021 +0100 Introduce `eshell-info-banner-file-size-flavor' custom option This custom variable can hold three different values: - nil - si - iec This value is passed to `file-size-human-readable', see its documentation for more information on the effect of this variable. Since the value `iec' introduces an additional character in the size displayed, some code is reorganized in order to keep the banner’s size by reducing the length of the progress bar. Some duplicate code is also merged in the new `eshell-info-banner--progress-bar-without-prefix' function. Update the README to reflect these changes. The `Customizing' heading is now separated in two: - one subheading for custom variables - one subheading for faces --- README.org | 17 +++- eshell-info-banner.el | 175 +++++++++++++++++++++++------------------- 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/README.org b/README.org index a06506a..7ae7acc 100644 --- a/README.org +++ b/README.org @@ -9,7 +9,7 @@ akin to ~fish_greeting~ but for Eshell. But an image is worth a thousand words, let’s see how it looks like: -#+caption: Screenshot of the default Eshell information banner +#+caption: Screenshot of the default Eshell information banner (using the nord theme from ~doom-themes~) [[file:img/screenshot.png]] This will be displayed every time you open a new Eshell instance, or @@ -25,6 +25,8 @@ macOS. PR are welcome if you want to fix that! - [[#070][~0.7.0~]] - [[#installation][Installation]] - [[#customizing][Customizing]] + - [[#custom-variables][Custom Variables]] + - [[#faces][Faces]] - [[#my-computer-doesnt-have-a-battery-will-this-still-work][My computer doesn’t have a battery, will this still work?]] - [[#advice-for-windows-users][Advice for Windows users]] - [[#contributing][Contributing]] @@ -89,6 +91,7 @@ There is probably a similar way to install it with pure ~straight.el~ or a PR to add some more installation instructions! * Customizing +** Custom Variables A couple of variables can be edited by the user in order to configure ~eshell-info-banner.el~: - ~eshell-info-banner-partition-prefixes~ :: Filter for which @@ -143,7 +146,19 @@ A couple of variables can be edited by the user in order to configure this custom variable. Default value: ~duf~ +- ~eshell-info-banner-file-size-flavor~ :: This variable reflects the + possible values passed to the function ~file-size-human-readable~. It + can hold one of these three values: + - ~nil~ + - ~si~ + - ~iec~ + Since the value ~iec~ generates longer file size prefixes, progress + bars become slightly shorter. For more details on this option, see + the documentation of ~file-size-human-readable~. + Default value: ~nil~ + +** Faces Don’t like the colors used by the package? They should follow by default your theme, but you can customize the following faces: - ~eshell-info-banner-background-face~ :: Used for filling the empty diff --git a/eshell-info-banner.el b/eshell-info-banner.el index 1a47334..b18e69e 100644 --- a/eshell-info-banner.el +++ b/eshell-info-banner.el @@ -2,7 +2,7 @@ ;; Author: Lucien Cartier-Tilet ;; Maintainer: Lucien Cartier-Tilet -;; Version: 0.7.7 +;; Version: 0.8.0 ;; Package-Requires: ((emacs "25.1") (f "0.20") (s "1")) ;; Homepage: https://github.com/Phundrak/eshell-info-banner.el @@ -87,33 +87,6 @@ ("11.6" . "macOS Big Sur")) "Versions of OSX and macOS and their name.")) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - ; Macros ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defmacro eshell-info-banner--with-face (str &rest properties) - "Helper macro for applying face `PROPERTIES' to `STR'." - `(propertize ,str 'face (list ,@properties))) - -(defun eshell-info-banner--executable-find (program &optional remote) - "Find PROGRAM executable, possibly on a REMOTE machine. -This is a wrapper around `executable-find' in order to avoid -issues with older versions of the functions only accepting one -argument." - (if (version< emacs-version "27.1") - (let ((default-directory (if (and eshell-info-banner-tramp-aware - remote) - default-directory - "~"))) - (executable-find program)) - (executable-find program remote))) - -(defun eshell-info-banner--shell-command-to-string (command) - "Execute shell command COMMAND and return its output as a string. -Ensures the command is ran with LANG=C." - (shell-command-to-string (format "LANG=C %s" command))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Custom variables ; @@ -167,6 +140,19 @@ Ensures the command is ran with LANG=C." :type 'list :version "0.3.0") +(defun eshell-info-banner--executable-find (program &optional remote) + "Find PROGRAM executable, possibly on a REMOTE machine. +This is a wrapper around `executable-find' in order to avoid +issues with older versions of the functions only accepting one +argument." + (if (version< emacs-version "27.1") + (let ((default-directory (if (and eshell-info-banner-tramp-aware + remote) + default-directory + "~"))) + (executable-find program)) + (executable-find program remote))) + (defcustom eshell-info-banner-duf-executable "duf" "Path to the `duf' executable." :group 'eshell-info-banner @@ -184,6 +170,14 @@ Ensures the command is ran with LANG=C." :safe #'booleanp :version "0.5.0") +(defcustom eshell-info-banner-file-size-flavor nil + "Display sizes with IEC prefixes." + :group 'eshell-info-banner + :type '(radio (const :tag "Default" nil) + (const :tag "SI" si) + (const :tag "IEC" iec)) + :version "0.8.0") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Faces ; @@ -209,6 +203,39 @@ Ensures the command is ran with LANG=C." "Face for `eshell-info-banner' progress bars displaying critical levels." :group 'eshell-info-banner) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; Macros and Utilities ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defmacro eshell-info-banner--with-face (str &rest properties) + "Helper macro for applying face `PROPERTIES' to `STR'." + `(propertize ,str 'face (list ,@properties))) + +(defun eshell-info-banner--shell-command-to-string (command) + "Execute shell command COMMAND and return its output as a string. +Ensures the command is ran with LANG=C." + (shell-command-to-string (format "LANG=C %s" command))) + +(defun eshell-info-banner--progress-bar-without-prefix (bar-length used total &optional newline) + "Display a progress bar without its prefix. +Display a progress bar of BAR-LENGTH length, followed by an +indication of how full the memory is with a human readable USED +and TOTAL size." + (let ((percentage (if (= used 0) + 0 + (/ (* 100 used) total)))) + (concat (eshell-info-banner--progress-bar bar-length percentage) + (format (if (equal eshell-info-banner-file-size-flavor 'iec) + " %8s / %-8s (%3s%%)%s" + " %6s / %-6s (%3s%%)%s") + (file-size-human-readable used eshell-info-banner-file-size-flavor) + (file-size-human-readable total eshell-info-banner-file-size-flavor) + (eshell-info-banner--with-face + (number-to-string percentage) + :inherit (eshell-info-banner--get-color-percentage percentage)) + (if newline "\n" ""))))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Internal functions ; @@ -304,8 +331,8 @@ chosen. Relies on the `duf' command." :path (if (> (length mount-point) eshell-info-banner-shorten-path-from) (eshell-info-banner--abbr-path mount-point t) mount-point) - :size (file-size-human-readable total) - :used (file-size-human-readable used) + :size total + :used used :percent percent))) partitions))) @@ -317,15 +344,15 @@ Common function between otherwise differ solely on the position of the mount point in the partition list. Its position is given by the argument MOUNT-POSITION." - (let ((partitions (cdr (split-string (eshell-info-banner--shell-command-to-string "df -lH") + (let ((partitions (cdr (split-string (eshell-info-banner--shell-command-to-string "df -l") (regexp-quote "\n") t)))) (cl-remove-if #'null (mapcar (lambda (partition) (let* ((partition (split-string partition " " t)) (filesystem (nth 0 partition)) - (size (nth 1 partition)) - (used (nth 2 partition)) + (size (string-to-number (nth 1 partition))) + (used (string-to-number (nth 2 partition))) (percent (nth 4 partition)) (mount (nth mount-position partition))) (when (seq-some (lambda (prefix) @@ -390,20 +417,16 @@ Return detected partitions as a list of structs." For TEXT-PADDING and BAR-LENGTH, see the documentation of `eshell-info-banner--display-memory'." - (let ((percentage (eshell-info-banner--mounted-partitions-percent partition))) - (concat (s-pad-right text-padding - "." - (eshell-info-banner--with-face - (eshell-info-banner--mounted-partitions-path partition) - :weight 'bold)) - ": " - (eshell-info-banner--progress-bar bar-length percentage) - (format " %6s / %-6s (%3s%%)" - (eshell-info-banner--mounted-partitions-used partition) - (eshell-info-banner--mounted-partitions-size partition) - (eshell-info-banner--with-face - (number-to-string percentage) - :inherit (eshell-info-banner--get-color-percentage percentage)))))) + (concat (s-pad-right text-padding + "." + (eshell-info-banner--with-face + (eshell-info-banner--mounted-partitions-path partition) + :weight 'bold)) + ": " + (eshell-info-banner--progress-bar-without-prefix + bar-length + (eshell-info-banner--mounted-partitions-used partition) + (eshell-info-banner--mounted-partitions-size partition)))) (defun eshell-info-banner--display-partitions (text-padding bar-length) "Display the detected mounted partitions of the system. @@ -479,18 +502,9 @@ be displayed on the far right. `BAR-LENGTH' determines the length of the progress bar to be displayed." - (let ((percentage (if (= used 0) - 0 - (/ (* 100 used) total)))) - (concat (s-pad-right text-padding "." type) - ": " - (eshell-info-banner--progress-bar bar-length percentage) - (format " %6s / %-6s (%3s%%)\n" - (file-size-human-readable used) - (file-size-human-readable total) - (eshell-info-banner--with-face - (number-to-string percentage) - :inherit (eshell-info-banner--get-color-percentage percentage)))))) + (concat (s-pad-right text-padding "." type) + ": " + (eshell-info-banner--progress-bar-without-prefix bar-length used total t))) (defun eshell-info-banner--display-memory (text-padding bar-length) "Display memories detected on your system. @@ -581,7 +595,7 @@ the warning face with a battery level of 25% or less." (eshell-info-banner--progress-bar bar-length percentage t) - (s-repeat 17 " ") + (s-repeat (if (equal eshell-info-banner-file-size-flavor 'iec) 21 17) " ") (format "(%3s%%)\n" (eshell-info-banner--with-face (number-to-string percentage) @@ -723,26 +737,29 @@ build number)." (defun eshell-info-banner () "Banner for Eshell displaying system information." (let* ((default-directory (if eshell-info-banner-tramp-aware default-directory "~")) - (system-info (eshell-info-banner--get-os-information)) - (os (car system-info)) - (kernel (cdr system-info)) - (hostname (if eshell-info-banner-tramp-aware - (or (file-remote-p default-directory 'host) (system-name)) - (system-name))) - (uptime (eshell-info-banner--get-uptime)) - (partitions (eshell-info-banner--get-mounted-partitions)) - (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)) + (system-info (eshell-info-banner--get-os-information)) + (os (car system-info)) + (kernel (cdr system-info)) + (hostname (if eshell-info-banner-tramp-aware + (or (file-remote-p default-directory 'host) (system-name)) + (system-name))) + (uptime (eshell-info-banner--get-uptime)) + (partitions (eshell-info-banner--get-mounted-partitions)) + (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)) - (bar-length (- tot-width left-padding 4 23))) + (bar-length (- tot-width left-padding 4 23)) + (bar-length (if (equal eshell-info-banner-file-size-flavor 'iec) + (- bar-length 4) + bar-length))) (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