Merge feature/file-size-flavor into master

commit 31684ffc39217b55f775bc35b7409baf2d394bcc
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
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 <lucien@phundrak.com>
Date:   Sun Dec 19 17:11:10 2021 +0100

    Remove unused function

commit aea999276baad7112feb3e7868be4881af362240
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Sun Dec 19 17:11:00 2021 +0100

    Fix undefined function

commit 8afaabd33f1e7a7f0d991b72a1e4f8cb492c153b
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
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
This commit is contained in:
Lucien Cartier-Tilet 2021-12-19 17:19:42 +01:00
parent 89f78f023a
commit a2f24e4633
Signed by: phundrak
GPG Key ID: BD7789E705CB8DCA
2 changed files with 112 additions and 80 deletions

View File

@ -9,7 +9,7 @@
akin to ~fish_greeting~ but for Eshell. But an image is worth a thousand
words, lets 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 doesnt 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
Dont 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

View File

@ -2,7 +2,7 @@
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
;; 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