Add new partitions detection method through duf
eshell-info-banner will now default to duf if it is installed and avaliable on the system, otherwise it will default to platform-specific implementation.
This commit is contained in:
parent
6a043f6c19
commit
1635241762
19
README.org
19
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
|
- ~eshell-info-banner-critical-percentage~ :: Percentage from which the
|
||||||
level should be displayed as critical.
|
level should be displayed as critical.
|
||||||
|
|
||||||
Default value ~90~
|
Default value: ~90~
|
||||||
- ~eshell-info-banner-tramp-aware~ :: When using Eshell through TRAMP,
|
- ~eshell-info-banner-tramp-aware~ :: When using Eshell through TRAMP,
|
||||||
you can decide whether ~eshell-info-banner~ will display information
|
you can decide whether ~eshell-info-banner~ will display information
|
||||||
about the remote system you are connected to or only display
|
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
|
~eshell-info-banner-tramp-aware~ to ~t~ to display information on the
|
||||||
remote system or to ~nil~ to keep local information only.
|
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
|
Don’t like the colors used by the package? They should follow by
|
||||||
default your theme, but you can customize the following faces:
|
default your theme, but you can customize the following faces:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
|
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
|
||||||
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
|
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
|
||||||
;; Version: 0.4.4
|
;; Version: 0.5.0
|
||||||
;; Package-Requires: ((emacs "25") (dash "2") (f "0.20") (s "1"))
|
;; Package-Requires: ((emacs "25") (dash "2") (f "0.20") (s "1"))
|
||||||
;; Homepage: https://labs.phundrak.com/phundrak/eshell-info-banner.el
|
;; Homepage: https://labs.phundrak.com/phundrak/eshell-info-banner.el
|
||||||
|
|
||||||
@ -130,6 +130,22 @@
|
|||||||
:type 'list
|
:type 'list
|
||||||
:version "0.3.0")
|
: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 ;
|
; Faces ;
|
||||||
@ -235,6 +251,36 @@ neither of these, an error will be thrown by the function."
|
|||||||
(eshell-info-banner--abbr-path (cdr path))))
|
(eshell-info-banner--abbr-path (cdr path))))
|
||||||
(t (error "Invalid argument %s, neither stringp or listp" 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 ()
|
(defun eshell-info-banner--get-mounted-partitions/gnu ()
|
||||||
"Detect mounted partitions on a Linux system.
|
"Detect mounted partitions on a Linux system.
|
||||||
|
|
||||||
@ -303,17 +349,19 @@ chosen. Relies on the `df' command."
|
|||||||
"Detect mounted partitions on the system.
|
"Detect mounted partitions on the system.
|
||||||
|
|
||||||
Return detected partitions as a list of structs."
|
Return detected partitions as a list of structs."
|
||||||
(pcase system-type
|
(if eshell-info-banner-use-duf
|
||||||
((or 'gnu 'gnu/linux 'gnu/kfreebsd)
|
(eshell-info-banner--get-mounted-partitions/duf)
|
||||||
(eshell-info-banner--get-mounted-partitions/gnu))
|
(pcase system-type
|
||||||
((or 'ms-dos 'windows-nt 'cygwin)
|
((or 'gnu 'gnu/linux 'gnu/kfreebsd)
|
||||||
(eshell-info-banner--get-mounted-partitions/windows))
|
(eshell-info-banner--get-mounted-partitions/gnu))
|
||||||
('darwin
|
((or 'ms-dos 'windows-nt 'cygwin)
|
||||||
(eshell-info-banner--get-mounted-partitions/darwin))
|
(eshell-info-banner--get-mounted-partitions/windows))
|
||||||
(other
|
('darwin
|
||||||
(progn
|
(eshell-info-banner--get-mounted-partitions/darwin))
|
||||||
(message "Partition detection for %s not yet supported." other)
|
(other
|
||||||
nil))))
|
(progn
|
||||||
|
(message "Partition detection for %s not yet supported." other)
|
||||||
|
nil)))))
|
||||||
|
|
||||||
(defun eshell-info-banner--partition-to-string (partition text-padding bar-length)
|
(defun eshell-info-banner--partition-to-string (partition text-padding bar-length)
|
||||||
"Display a progress bar showing how full a `PARTITION' is.
|
"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))
|
:weight 'bold))
|
||||||
": "
|
": "
|
||||||
(eshell-info-banner--progress-bar bar-length percentage)
|
(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-used partition)
|
||||||
(eshell-info-banner--mounted-partitions-size partition)
|
(eshell-info-banner--mounted-partitions-size partition)
|
||||||
(eshell-info-banner--with-face
|
(eshell-info-banner--with-face
|
||||||
@ -436,7 +484,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 (%3s%%)"
|
(format " %6s / %-6s (%3s%%)"
|
||||||
(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
|
(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
|
(eshell-info-banner--progress-bar bar-length
|
||||||
percentage
|
percentage
|
||||||
t)
|
t)
|
||||||
(s-repeat 16 " ")
|
(s-repeat 17 " ")
|
||||||
(format "(%3s%%)\n"
|
(format "(%3s%%)\n"
|
||||||
(eshell-info-banner--with-face
|
(eshell-info-banner--with-face
|
||||||
(number-to-string percentage)
|
(number-to-string percentage)
|
||||||
@ -593,23 +641,23 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
|
|||||||
"See `eshell-info-banner--get-os-information'."
|
"See `eshell-info-banner--get-os-information'."
|
||||||
(let ((prefix (if eshell-info-banner-tramp-aware (file-remote-p default-directory) "")))
|
(let ((prefix (if eshell-info-banner-tramp-aware (file-remote-p default-directory) "")))
|
||||||
`(,(cond
|
`(,(cond
|
||||||
((executable-find "hostnamectl" eshell-info-banner-tramp-aware)
|
((executable-find "hostnamectl" eshell-info-banner-tramp-aware)
|
||||||
(eshell-info-banner--get-os-information-from-hostnamectl))
|
(eshell-info-banner--get-os-information-from-hostnamectl))
|
||||||
((executable-find "lsb_release" eshell-info-banner-tramp-aware)
|
((executable-find "lsb_release" eshell-info-banner-tramp-aware)
|
||||||
(eshell-info-banner--get-os-information-from-lsb-release))
|
(eshell-info-banner--get-os-information-from-lsb-release))
|
||||||
((file-exists-p (concat prefix "/etc/os-release"))
|
((file-exists-p (concat prefix "/etc/os-release"))
|
||||||
(eshell-info-banner--get-os-information-from-release-file))
|
(eshell-info-banner--get-os-information-from-release-file))
|
||||||
((executable-find "shepherd")
|
((executable-find "shepherd")
|
||||||
(let ((distro (car (s-lines (shell-command-to-string "guix -V")))))
|
(let ((distro (car (s-lines (shell-command-to-string "guix -V")))))
|
||||||
(save-match-data
|
(save-match-data
|
||||||
(string-match "\\([0-9\\.]+\\)" distro)
|
(string-match "\\([0-9\\.]+\\)" distro)
|
||||||
(concat "Guix System "
|
(concat "Guix System "
|
||||||
(substring-no-properties distro
|
(substring-no-properties distro
|
||||||
(match-beginning 1)
|
(match-beginning 1)
|
||||||
(match-end 1))))))
|
(match-end 1))))))
|
||||||
(t "Unknown"))
|
(t "Unknown"))
|
||||||
.
|
.
|
||||||
,(s-trim (shell-command-to-string "uname -rs")))))
|
,(s-trim (shell-command-to-string "uname -rs")))))
|
||||||
|
|
||||||
(defmacro eshell-info-banner--get-macos-name (version)
|
(defmacro eshell-info-banner--get-macos-name (version)
|
||||||
"Get the name of the current macOS or OSX system based on its 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))
|
eshell-info-banner-width))
|
||||||
(middle-padding (- tot-width right-text left-padding 4))
|
(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))
|
(concat (format "%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char))
|
||||||
(format "%s: %s Kernel.: %s\n"
|
(format "%s: %s Kernel.: %s\n"
|
||||||
(s-pad-right left-padding
|
(s-pad-right left-padding
|
||||||
|
Loading…
Reference in New Issue
Block a user