9 Commits
0.8.2 ... 0.8.7

Author SHA1 Message Date
9c17e92f02 Fix macOS version detection
Now use regexes to detect the macOS version returned by
`sw_vers -productVersion`

Also add new macOS version

Fixes #18
2022-03-26 10:33:59 +01:00
247d8bf4dd Remove eval-when-compile on const variable
Fixes #20
2022-01-14 11:21:29 +01:00
d4033120c1 Evaluate eshell-info-banner-path-separator on compile 2022-01-07 12:09:44 +01:00
89d2b7226b Remove dependency on f.el 2022-01-07 12:06:39 +01:00
2c53218cc7 Better documentation formatting 2022-01-07 02:56:38 +01:00
f59a472204 Fix erroneous function call on NetBSD 2022-01-07 02:04:31 +01:00
f9113b7a35 Improve functions documentation 2022-01-07 02:03:44 +01:00
d145705a61 Update screenshot 2022-01-05 19:24:55 +01:00
9e6fecc94a Fix battery detection for non-Linux systems
Some non-Linux systems do not have a `/sys/` directory. Therefore,
check it only if we are in a Linux system.

Fixes #19
2022-01-05 19:02:05 +01:00
2 changed files with 88 additions and 77 deletions

View File

@@ -2,8 +2,8 @@
;; 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.8.2 ;; Version: 0.8.7
;; Package-Requires: ((emacs "25.1") (f "0.20") (s "1")) ;; Package-Requires: ((emacs "25.1") (s "1"))
;; Homepage: https://github.com/Phundrak/eshell-info-banner.el ;; Homepage: https://github.com/Phundrak/eshell-info-banner.el
;; This file is not part of GNU Emacs ;; This file is not part of GNU Emacs
@@ -60,38 +60,34 @@
; Constants ; ; Constants ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst eshell-info-banner-path-separator
(substring-no-properties (file-relative-name (expand-file-name "x" "y")) 1 2)
"File separator used by the current operating system.")
(defconst eshell-info-banner--min-length-left 8 (defconst eshell-info-banner--min-length-left 8
"Minimum length of text on the left hand side of the banner.") "Minimum length of text on the left hand side of the banner.")
(eval-when-compile (eval-when-compile
(defconst eshell-info-banner--macos-versions (defconst eshell-info-banner--macos-versions
'(("10.0" . "Mac OS X Cheetah") '(("^10\\.0\\." . "Mac OS X Cheetah")
("10.1" . "Mac OS X Puma") ("^10\\.1\\." . "Mac OS X Puma")
("10.2" . "Mac OS X Jaguar") ("^10\\.2\\." . "Mac OS X Jaguar")
("10.3" . "Mac OS X Panther") ("^10\\.3\\." . "Mac OS X Panther")
("10.4" . "Mac OS X Tiger") ("^10\\.4\\." . "Mac OS X Tiger")
("10.5" . "Mac OS X Leopard") ("^10\\.5\\." . "Mac OS X Leopard")
("10.6" . "Mac OS X Snow Leopard") ("^10\\.6\\." . "Mac OS X Snow Leopard")
("10.7" . "Mac OS X Lion") ("^10\\.7\\." . "Mac OS X Lion")
("10.8" . "OS X Mountain Lion") ("^10\\.8\\." . "OS X Mountain Lion")
("10.9" . "OS X Mavericks") ("^10\\.9\\." . "OS X Mavericks")
("10.10" . "OS X Yosemite") ("^10\\.10\\." . "OS X Yosemite")
("10.11" . "OS X El Capitan") ("^10\\.11\\." . "OS X El Capitan")
("10.12" . "macOS Sierra") ("^10\\.12\\." . "macOS Sierra")
("10.13" . "macOS High Sierra") ("^10\\.13\\." . "macOS High Sierra")
("10.14" . "macOS Mojave") ("^10\\.14\\." . "macOS Mojave")
("10.15" . "macOS Catalina") ("^10\\.15\\." . "macOS Catalina")
("10.16" . "macOS Big Sur") ("^10\\.16\\." . "macOS Big Sur")
("11.0" . "macOS Big Sur") ("^11\\." . "macOS Big Sur")
("11.1" . "macOS Big Sur") ("^12\\." . "macOS Monterey"))
("11.2" . "macOS Big Sur")
("11.3" . "macOS Big Sur")
("11.4" . "macOS Big Sur")
("11.5" . "macOS Big Sur")
("11.6" . "macOS Big Sur")
("12.0" . "macOS Monterey")
("12.1" . "macOS Monterey")
("12.2" . "macOS Monterey"))
"Versions of OSX and macOS and their name.")) "Versions of OSX and macOS and their name."))
(defconst eshell-info-banner--posix-shells '("bash" "zsh" "sh") (defconst eshell-info-banner--posix-shells '("bash" "zsh" "sh")
@@ -219,7 +215,7 @@ argument. `executable-find's remote argument has the value of
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro eshell-info-banner--with-face (str &rest properties) (defmacro eshell-info-banner--with-face (str &rest properties)
"Helper macro for applying face `PROPERTIES' to `STR'." "Helper macro for applying face PROPERTIES to STR."
`(propertize ,str 'face (list ,@properties))) `(propertize ,str 'face (list ,@properties)))
(defun eshell-info-banner--shell-command-to-string (command) (defun eshell-info-banner--shell-command-to-string (command)
@@ -237,7 +233,9 @@ Ensures the command is ran with LANG=C."
"Display a progress bar without its prefix. "Display a progress bar without its prefix.
Display a progress bar of BAR-LENGTH length, followed by an Display a progress bar of BAR-LENGTH length, followed by an
indication of how full the memory is with a human readable USED indication of how full the memory is with a human readable USED
and TOTAL size." and TOTAL size.
Optional argument NEWLINE: Whether to output a newline at the end
of the progress bar."
(let ((percentage (if (= used 0) (let ((percentage (if (= used 0)
0 0
(/ (* 100 used) total)))) (/ (* 100 used) total))))
@@ -283,7 +281,7 @@ If the executable `uptime' is not found, return nil."
path size used percent) path size used percent)
(defun eshell-info-banner--get-longest-path (partitions) (defun eshell-info-banner--get-longest-path (partitions)
"Return the length of the longest partition path in `PARTITIONS'. "Return the length of the longest partition path in PARTITIONS.
The returned value is in any case greater than The returned value is in any case greater than
`eshell-info-banner--min-length-left'." `eshell-info-banner--min-length-left'."
@@ -293,34 +291,43 @@ The returned value is in any case greater than
(length (eshell-info-banner--mounted-partitions-path partition))))))) (length (eshell-info-banner--mounted-partitions-path partition)))))))
(defun eshell-info-banner--abbr-path (path &optional abbr) (defun eshell-info-banner--abbr-path (path &optional abbr)
"Remove `$HOME' from `PATH', abbreviate parent dirs if `ABBR' non nil. "Remove `$HOME' from PATH, abbreviate parent dirs if ABBR non nil.
Abbreviate `PATH' by removing the value of `HOME' if it is Abbreviate PATH by removing the value of HOME if it is present in
present in the former, and if `ABBR' is t then all parent the former, and if ABBR is t then all parent directories of the
directories of the current `PATH' are abbreviated to only one current PATH are abbreviated to only one character. If an
character. If an abbreviated directory starts with a dot, then abbreviated directory starts with a dot, then include it before
include it before the abbreviated name of the directory, the abbreviated name of the directory, e.g. \".config\" ->
e.g. \".config\" -> \".c\". \".c\".
For public use, `PATH' should be a string representing a UNIX For public use, PATH should be a string representing a UNIX path.
path. For internal use, `PATH' can also be a list. If `PATH' is For internal use, PATH can also be a list. If PATH is neither of
neither of these, an error will be thrown by the function." these, an error will be thrown by the function."
(cond (cond
((stringp path) (abbreviate-file-name ((stringp path)
(if abbr (let ((abbr-path (abbreviate-file-name path)))
(eshell-info-banner--abbr-path (if abbr
(f-split (eshell-info-banner--abbr-path path))) (abbreviate-file-name
path))) (eshell-info-banner--abbr-path
(split-string abbr-path eshell-info-banner-path-separator t)))
abbr-path)))
((null path) "") ((null path) "")
((listp path) ((listp path)
(f-join (if (= (length path) 1) (let ((file (eshell-info-banner--abbr-path (cdr path)))
(car path) (directory (if (= (length path) 1)
(let* ((dir (car path)) (car path)
(first-char (substring dir 0 1))) (let* ((dir (car path))
(if (string= "." first-char) (first-char (substring dir 0 1)))
(substring dir 0 2) (if (string= "." first-char)
first-char))) (substring dir 0 2)
(eshell-info-banner--abbr-path (cdr path)))) first-char)))))
(if (string= "" file)
directory
(let ((relative-p (not (file-name-absolute-p directory)))
(new-dir (expand-file-name file directory)))
(if relative-p
(file-relative-name new-dir)
new-dir)))))
(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 () (defun eshell-info-banner--get-mounted-partitions-duf ()
@@ -429,7 +436,7 @@ Return detected partitions as a list of structs."
nil))))) 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.
For TEXT-PADDING and BAR-LENGTH, see the documentation of For TEXT-PADDING and BAR-LENGTH, see the documentation of
`eshell-info-banner--display-memory'." `eshell-info-banner--display-memory'."
@@ -468,6 +475,8 @@ For TEXT-PADDING and BAR-LENGTH, see the documentation of
t))) t)))
(defun eshell-info-banner--get-memory-unix-command-to-mem (command) (defun eshell-info-banner--get-memory-unix-command-to-mem (command)
"Get the output of COMMAND corresponding to memory information.
This function is to be only used on platforms which support sysctl."
(string-to-number (string-to-number
(s-trim (s-trim
(car (last (car (last
@@ -478,7 +487,7 @@ For TEXT-PADDING and BAR-LENGTH, see the documentation of
(defun eshell-info-banner--get-memory-netbsd () (defun eshell-info-banner--get-memory-netbsd ()
"Get memory usage for NetBSD systems. "Get memory usage for NetBSD systems.
See `eshell-info-banner--get-memory'." See `eshell-info-banner--get-memory'."
(let* ((total (eshell-info-banner--get-memory-unix-command-to-mem `("sysctl hw.physmem64"))) (let* ((total (eshell-info-banner--get-memory-unix-command-to-mem "sysctl hw.physmem64"))
(used (- total (used (- total
(* 1024 (string-to-number (* 1024 (string-to-number
(s-trim (s-trim
@@ -566,16 +575,16 @@ in bytes."
(defun eshell-info-banner--memory-to-string (type total used text-padding bar-length) (defun eshell-info-banner--memory-to-string (type total used text-padding bar-length)
"Display a memorys usage with a progress bar. "Display a memorys usage with a progress bar.
The `TYPE' of memory will be the text on the far left, while The TYPE of memory will be the text on the far left, while USED
`USED' and `TOTAL' will be displayed on the right of the progress and TOTAL will be displayed on the right of the progress bar.
bar. From them, a percentage will be computed which will be used From them, a percentage will be computed which will be used to
to display a colored percentage of the progress bar and it will display a colored percentage of the progress bar and it will be
be displayed on the far right. displayed on the far right.
`TEXT-PADDING' will determine how many dots are necessary between TEXT-PADDING will determine how many dots are necessary between
`TYPE' and the colon. TYPE and the colon.
`BAR-LENGTH' determines the length of the progress bar to be BAR-LENGTH determines the length of the progress bar to be
displayed." displayed."
(concat (s-pad-right text-padding "." type) (concat (s-pad-right text-padding "." type)
": " ": "
@@ -591,10 +600,10 @@ bars will have this appearance:
TYPE......: [=========] XXG / XXG (XX%) TYPE......: [=========] XXG / XXG (XX%)
`TEXT-PADDING': the space allocated to the text at the left of the TEXT-PADDING: the space allocated to the text at the left of the
progress bar. progress bar.
`BAR-LENGTH': the length of the progress bar." BAR-LENGTH: the length of the progress bar."
(mapconcat (lambda (mem) (mapconcat (lambda (mem)
(eshell-info-banner--memory-to-string (nth 0 mem) (nth 1 mem) (eshell-info-banner--memory-to-string (nth 0 mem) (nth 1 mem)
(nth 2 mem) text-padding (nth 2 mem) text-padding
@@ -606,7 +615,7 @@ progress bar.
; Display information ;;;;;;;;;;;;;;;;; ; Display information ;;;;;;;;;;;;;;;;;
(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."
(let ((percentage (if (stringp percentage) (let ((percentage (if (stringp percentage)
(string-to-number percentage) (string-to-number percentage)
percentage))) percentage)))
@@ -618,12 +627,12 @@ progress bar.
(t 'eshell-info-banner-normal-face)))) (t 'eshell-info-banner-normal-face))))
(defun eshell-info-banner--progress-bar (length percentage &optional invert) (defun eshell-info-banner--progress-bar (length percentage &optional invert)
"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.
If `INVERT' is t, then consider the percentage to approach If INVERT is t, then consider the percentage to approach
critical levels close to 0 rather than 100." critical levels close to 0 rather than 100."
(let* ((length-filled (if (= 0 percentage) (let* ((length-filled (if (= 0 percentage)
0 0
@@ -645,9 +654,9 @@ critical levels close to 0 rather than 100."
(defun eshell-info-banner--display-battery (text-padding bar-length) (defun eshell-info-banner--display-battery (text-padding bar-length)
"If the computer has a battery, display its level. "If the computer has a battery, display its level.
Pad the left text with dots by `TEXT-PADDING' characters. Pad the left text with dots by TEXT-PADDING characters.
`BAR-LENGTH' indicates the length in characters of the progress BAR-LENGTH indicates the length in characters of the progress
bar. bar.
The usage of `eshell-info-banner-warning-percentage' and The usage of `eshell-info-banner-warning-percentage' and
@@ -655,7 +664,9 @@ The usage of `eshell-info-banner-warning-percentage' and
thought of as the “percentage of discharge” of the computer. thought of as the “percentage of discharge” of the computer.
Thus, setting the warning at 75% will be translated as showing Thus, setting the warning at 75% will be translated as showing
the warning face with a battery level of 25% or less." the warning face with a battery level of 25% or less."
(let ((battery-level (when (file-readable-p "/sys/") (battery)))) (let ((battery-level (unless (and (equal system-type 'gnu/linux)
(not (file-readable-p "/sys/")))
(battery))))
(if (or (null battery-level) (if (or (null battery-level)
(string= battery-level "Battery status not available") (string= battery-level "Battery status not available")
(string-match-p (regexp-quote "N/A") battery-level)) (string-match-p (regexp-quote "N/A") battery-level))
@@ -776,9 +787,9 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
"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."
`(cond `(cond
,@(mapcar (lambda (major) ,@(mapcar (lambda (major)
`((string-match-p (regexp-quote ,(car major)) `((string-match-p ,(car major)
,version) ,version)
,(cdr major))) ,(cdr major)))
eshell-info-banner--macos-versions) eshell-info-banner--macos-versions)
(t "unknown version"))) (t "unknown version")))

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 54 KiB