diff --git a/README.org b/README.org index 210fc79..aa21a33 100644 --- a/README.org +++ b/README.org @@ -87,7 +87,7 @@ A couple of variables can be edited by the user in order to configure - ~eshell-info-banner-critical-percentage~ :: Percentage from which the level should be displayed as critical. - Default value ~90~ + Default value: ~90~ - ~eshell-info-banner-tramp-aware~ :: When using Eshell through TRAMP, you can decide whether ~eshell-info-banner~ will display information about the remote system you are connected to or only display @@ -95,7 +95,22 @@ A couple of variables can be edited by the user in order to configure ~eshell-info-banner-tramp-aware~ to ~t~ to display information on the remote system or to ~nil~ to keep local information only. - Default value ~t~ + Default value: ~t~ +- ~eshell-info-banner-use-duf~ :: Whether or not to use [[https://github.com/muesli/duf][duf]]. ~duf~ is a + better replacement for ~df~ and should be more platform-agnostic than + the latter. I also suspect this implementation will be faster than + the one with ~df~, since there is very few string manipulation with + ~duf~ compared to the implementations with ~df~. However, due to + ~shell-command-to-string~, Windows users might want to turn it off by + default. + + Default value: ~t~ if ~duf~ is found on the system, ~nil~ otherwise +- ~eshell-info-banner-duf-executable~ :: Path to your ~duf~ executable. If + ~duf~ is not found by default by Emacs, you can override + ~eshell-info-banner-use-duf~ with ~t~ and specify the path to ~duf~ with + this custom variable. + + Default value: ~duf~ Don’t like the colors used by the package? They should follow by default your theme, but you can customize the following faces: diff --git a/eshell-info-banner.el b/eshell-info-banner.el index 5ec1a6b..82393d9 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.4.4 +;; Version: 0.5.0 ;; Package-Requires: ((emacs "25") (dash "2") (f "0.20") (s "1")) ;; Homepage: https://labs.phundrak.com/phundrak/eshell-info-banner.el @@ -130,6 +130,22 @@ :type 'list :version "0.3.0") +(defcustom eshell-info-banner-duf-executable "duf" + "Path to the `duf' executable." + :group 'eshell-info-banner + :type 'string + :safe #'stringp + :version "0.5.0") + +(defcustom eshell-info-banner-use-duf (if (executable-find eshell-info-banner-duf-executable) + t + nil) + "If non-nil, use `duf' instead of `df'." + :group 'eshell-info-banner + :type 'boolean + :safe #'booleanp + :version "0.5.0") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Faces ; @@ -235,6 +251,36 @@ neither of these, an error will be thrown by the function." (eshell-info-banner--abbr-path (cdr path)))) (t (error "Invalid argument %s, neither stringp or listp" path)))) +(defun eshell-info-banner--get-mounted-partitions/duf () + "Detect mounted partitions on systems supporting `duf'. + +Return detected partitions as a list of structs. See +`eshell-info-banner-partition-prefixes' to see how partitions are +chosen. Relies on the `duf' command. + +FIXME: filter first partitions, then get other information." + (let* ((partitions (json-read-from-string (shell-command-to-string (concat eshell-info-banner-duf-executable + " -json")))) + (partitions (cl-remove-if-not (lambda (partition) + (let ((device (format "%s" (cdr (assoc 'device partition))))) + (seq-some (lambda (prefix) + (string-prefix-p prefix device t)) + eshell-info-banner-partition-prefixes))) + (seq-into-sequence partitions)))) + (mapcar (lambda (partition) + (let* ((mount-point (format "%s" (cdr (assoc 'mount_point partition)))) + (total (cdr (assoc 'total partition))) + (used (cdr (assoc 'used partition))) + (percent (/ (* 100 used) total))) + (make-eshell-info-banner--mounted-partitions + :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) + :percent percent))) + partitions))) + (defun eshell-info-banner--get-mounted-partitions/gnu () "Detect mounted partitions on a Linux system. @@ -303,17 +349,19 @@ chosen. Relies on the `df' command." "Detect mounted partitions on the system. Return detected partitions as a list of structs." - (pcase system-type - ((or 'gnu 'gnu/linux 'gnu/kfreebsd) - (eshell-info-banner--get-mounted-partitions/gnu)) - ((or 'ms-dos 'windows-nt 'cygwin) - (eshell-info-banner--get-mounted-partitions/windows)) - ('darwin - (eshell-info-banner--get-mounted-partitions/darwin)) - (other - (progn - (message "Partition detection for %s not yet supported." other) - nil)))) + (if eshell-info-banner-use-duf + (eshell-info-banner--get-mounted-partitions/duf) + (pcase system-type + ((or 'gnu 'gnu/linux 'gnu/kfreebsd) + (eshell-info-banner--get-mounted-partitions/gnu)) + ((or 'ms-dos 'windows-nt 'cygwin) + (eshell-info-banner--get-mounted-partitions/windows)) + ('darwin + (eshell-info-banner--get-mounted-partitions/darwin)) + (other + (progn + (message "Partition detection for %s not yet supported." other) + nil))))) (defun eshell-info-banner--partition-to-string (partition text-padding bar-length) "Display a progress bar showing how full a `PARTITION' is. @@ -328,7 +376,7 @@ For TEXT-PADDING and BAR-LENGTH, see the documentation of :weight 'bold)) ": " (eshell-info-banner--progress-bar bar-length percentage) - (format " %6s / %-5s (%3s%%)" + (format " %6s / %-6s (%3s%%)" (eshell-info-banner--mounted-partitions-used partition) (eshell-info-banner--mounted-partitions-size partition) (eshell-info-banner--with-face @@ -436,7 +484,7 @@ displayed." (concat (s-pad-right text-padding "." type) ": " (eshell-info-banner--progress-bar bar-length percentage) - (format " %6s / %-5s (%3s%%)" + (format " %6s / %-6s (%3s%%)" (file-size-human-readable used) (file-size-human-readable total) (eshell-info-banner--with-face @@ -532,7 +580,7 @@ the warning face with a battery level of 25% or less." (eshell-info-banner--progress-bar bar-length percentage t) - (s-repeat 16 " ") + (s-repeat 17 " ") (format "(%3s%%)\n" (eshell-info-banner--with-face (number-to-string percentage) @@ -593,23 +641,23 @@ If RELEASE-FILE is nil, use '/etc/os-release'." "See `eshell-info-banner--get-os-information'." (let ((prefix (if eshell-info-banner-tramp-aware (file-remote-p default-directory) ""))) `(,(cond - ((executable-find "hostnamectl" eshell-info-banner-tramp-aware) - (eshell-info-banner--get-os-information-from-hostnamectl)) - ((executable-find "lsb_release" eshell-info-banner-tramp-aware) - (eshell-info-banner--get-os-information-from-lsb-release)) - ((file-exists-p (concat prefix "/etc/os-release")) - (eshell-info-banner--get-os-information-from-release-file)) - ((executable-find "shepherd") - (let ((distro (car (s-lines (shell-command-to-string "guix -V"))))) - (save-match-data - (string-match "\\([0-9\\.]+\\)" distro) - (concat "Guix System " - (substring-no-properties distro - (match-beginning 1) - (match-end 1)))))) - (t "Unknown")) - . - ,(s-trim (shell-command-to-string "uname -rs"))))) + ((executable-find "hostnamectl" eshell-info-banner-tramp-aware) + (eshell-info-banner--get-os-information-from-hostnamectl)) + ((executable-find "lsb_release" eshell-info-banner-tramp-aware) + (eshell-info-banner--get-os-information-from-lsb-release)) + ((file-exists-p (concat prefix "/etc/os-release")) + (eshell-info-banner--get-os-information-from-release-file)) + ((executable-find "shepherd") + (let ((distro (car (s-lines (shell-command-to-string "guix -V"))))) + (save-match-data + (string-match "\\([0-9\\.]+\\)" distro) + (concat "Guix System " + (substring-no-properties distro + (match-beginning 1) + (match-end 1)))))) + (t "Unknown")) + . + ,(s-trim (shell-command-to-string "uname -rs"))))) (defmacro eshell-info-banner--get-macos-name (version) "Get the name of the current macOS or OSX system based on its VERSION." @@ -667,7 +715,7 @@ build number)." eshell-info-banner-width)) (middle-padding (- tot-width right-text left-padding 4)) - (bar-length (- tot-width left-padding 4 22))) + (bar-length (- tot-width left-padding 4 23))) (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