Compare commits

...

29 Commits
0.7.7 ... main

Author SHA1 Message Date
SqrtMinusOne 2f4e59ea7a Add new variables to the README 2022-07-28 12:06:06 +02:00
SqrtMinusOne 987e69a662 Add an option to exclude some partitions 2022-07-28 12:06:06 +02:00
SqrtMinusOne 6b464b1b73 Add an option to filter duplicate partitions 2022-07-28 12:06:06 +02:00
Lucien Cartier-Tilet b7f2bfc013
v0.8.8 2022-05-31 11:40:22 +02:00
Lucien Cartier-Tilet fcc88df86a
Add CI with Github Actions
Check for compatibility with all version of Emacs since Emacs 25.1

Add Cask file for managing dependencies in CI

Add badge in README for CI
2022-05-31 11:40:22 +02:00
Lucien Cartier-Tilet 4ffaf329db
Fix erroneous require 2022-05-31 11:40:12 +02:00
Juergen Hoetzel 8e57add6c7 Use tramp-aware shell function
Fixes wrong report of disk usage when using
‘eshell-info-banner-tramp-aware’.
2022-05-16 19:14:29 +02:00
Juergen Hoetzel 8c6e37cc61 GNU and Darwin df shows space in 1K blocks by default
Als use the "-k" parameter to enforce this block size, so that the
command does not depend on environment variables (POSIXLY_CORRECT and
BLOCKSIZE).

Fixes #21
2022-05-14 22:01:14 +02:00
Lucien Cartier-Tilet 53fc69b871
Clarify partition detection paragraph for Windows users 2022-04-02 19:31:30 +02:00
Lucien Cartier-Tilet ce7b5f69cd
Reimplement and replace s-repeat
Progressively phasing out s.el as a dependency
2022-04-02 19:21:37 +02:00
Lucien Cartier-Tilet dedcb8cee5
Replace s-trim with string-trim
Progressively phasing out s.el as a dependency
2022-04-02 19:21:34 +02:00
Lucien Cartier-Tilet f9490f07a1
Turns out I misunderstood what `:version` is for in defcustom 2022-03-29 00:06:14 +02:00
Lucien Cartier-Tilet 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
Lucien Cartier-Tilet 247d8bf4dd
Remove eval-when-compile on const variable
Fixes #20
2022-01-14 11:21:29 +01:00
Lucien Cartier-Tilet d4033120c1
Evaluate eshell-info-banner-path-separator on compile 2022-01-07 12:09:44 +01:00
Lucien Cartier-Tilet 89d2b7226b
Remove dependency on f.el 2022-01-07 12:06:39 +01:00
Lucien Cartier-Tilet 2c53218cc7
Better documentation formatting 2022-01-07 02:56:38 +01:00
Lucien Cartier-Tilet f59a472204
Fix erroneous function call on NetBSD 2022-01-07 02:04:31 +01:00
Lucien Cartier-Tilet f9113b7a35
Improve functions documentation 2022-01-07 02:03:44 +01:00
Lucien Cartier-Tilet d145705a61
Update screenshot 2022-01-05 19:24:55 +01:00
Lucien Cartier-Tilet 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
Lucien Cartier-Tilet 20d0682f39
Separate functions getting memory info for Darwin and NetBSD systems
Fixes #17
2022-01-04 20:00:52 +01:00
Lucien Cartier-Tilet d248447cb0
Add macOS versions
Add support for Mac OS X 10.0 to 10.4
Add support for macOS Monterey
2021-12-21 10:44:47 +01:00
Lucien Cartier-Tilet 36b964a993
Merge fix/locale-non-posix-shells into master
commit 8a18bcd346fc146e104f77d3a3362a52db210bc3
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Tue Dec 21 00:06:45 2021 +0100

    Change `eshell-info-banner--shell-command-to-string' to function

    `eshell-info-banner--shell-command-to-string' being a macro causes
    problems in at least `eshell-info-banner--get-memory-unix'.
    This commit makes `eshell-info-banner--shell-command-to-string' a
    regular function.

commit 981b42c3f530a314990b0d69a6efa9f0bb4957dc
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Mon Dec 20 23:29:17 2021 +0100

    Fix variables preceeding commands on non-POSIX shells

    This commit introduces a fix to run commands only on POSIX-compliant
    shells defined in the new constant `eshell-info-banner--posix-shells'.
    If any is found on the machine, the command will be run through it,
    otherwise it will default to `sh'.

commit 364e0f5189471ca3d568638144c208a255808e76
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Mon Dec 20 23:12:15 2021 +0100

    Fix setting locale when the default shell is non-POSIX compliant

    In some cases, the default shell does not accept any environment
    variables preceeding the command, such as:

        LANG=C uptime

    For instance, tcsh on DragonFly BSD reports

        LANG=C: Command not found.

    This commit makes the command run on bash, zsh, or sh.
2021-12-21 00:12:41 +01:00
Lucien Cartier-Tilet 661ae7c87d
Remove REMOTE arg from `eshell-info-banner--executable-find'
`eshell-info-banner--executable-find' now only acts according to the
user’s preferences set with `eshell-info-banner-tramp-aware'.
2021-12-20 23:11:44 +01:00
Lucien Cartier-Tilet 382bb55064
Add support for RAM detection in NetBSD
Squashed commit of the following:

commit e11e3cbbd04c9c693d6e48f72e9ea99b64a83556
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Sun Dec 19 18:34:09 2021 +0100

    Multiply by 2014 to go from Kilobytes to Bytes

commit 786c9bbfdfd8a1fc6d6b21ea92ac8252b9dd0a50
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Sun Dec 19 18:23:21 2021 +0100

    Read in /proc/meminfo to get used/available memory

    Apparently NetBSD doesn’t properly implement hw.usermem.
    Also it needs to read hw.physmem64 instead of hw.physmem with sysctl

commit c9e7b8cadfcbfb877f180a9c89ee9d87f271d17c
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Sun Dec 19 17:50:24 2021 +0100

    Why doesn’t `last' return the last /element/?

commit f2248810132813191ebdd11f739d24bcc49f3165
Author: Lucien Cartier-Tilet <lucien@phundrak.com>
Date:   Sun Dec 19 17:46:33 2021 +0100

    Fix RAM detection on NetBSD
2021-12-19 18:35:59 +01:00
Lucien Cartier-Tilet a2f24e4633
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
2021-12-19 17:19:42 +01:00
Lucien Cartier-Tilet 89f78f023a
Fix uptime detection on NetBSD 2021-12-19 13:48:34 +01:00
Lucien Cartier-Tilet 6ec3280a8d
Add documentation on new function 2021-12-19 00:17:27 +01:00
7 changed files with 448 additions and 195 deletions

46
.github/workflows/workflow.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: CI
on:
push:
pull_request:
workflow_dispatch:
jobs:
check-compatibility:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
emacs_version:
- 25.1
- 25.2
- 25.3
- 26.1
- 26.2
- 26.3
- 27.1
- 27.2
- 28.1
- snapshot
steps:
- uses: actions/checkout@v3
- uses: purcell/setup-emacs@master
with:
version: ${{ matrix.emacs_version }}
- uses: actions/cache@v2
id: cache-cask-packages
with:
path: .cask
key: cache-cask-packages-000
- uses: actions/cache@v2
id: cache-cask-executable
with:
path: ~/.cask
key: cache-cask-executable-000
- name: "Cask setup"
uses: cask/setup-cask@master
if: steps.cask-cache-executable.outputs.cache-hit != 'true'
- name: "Install Cask dependencies"
run: cask install
if: steps.cask-cache-executable.outputs.cache-hit != 'true'
- name: "Check version compatibility"
run: make all

7
Cask Normal file
View File

@ -0,0 +1,7 @@
(source melpa)
(source gnu)
(package-file "eshell-info-banner.el")
(development
(depends-on "s"))

11
Makefile Normal file
View File

@ -0,0 +1,11 @@
# -*- indent-tabs-mode: t -*-
export EMACS ?= $(shell which emacs)
CASK ?= $(shell which cask)
all: compile
compile:
${CASK} exec ${EMACS} -Q --script bin/compile-package.el 2>&1 | grep -A 2 -E "([Ee]rror|[Ww]arning):" && exit 1 || exit 0
.PHONY: all compile

View File

@ -3,13 +3,14 @@
#+email: lucien@phundrak.com
[[https://melpa.org/#/eshell-info-banner][file:https://melpa.org/packages/eshell-info-banner-badge.svg]]
[[https://stable.melpa.org/#/eshell-info-banner][file:https://stable.melpa.org/packages/eshell-info-banner-badge.svg]]
[[https://github.com/Phundrak/eshell-info-banner.el/actions/workflows/workflow.yml][file:https://github.com/Phundrak/eshell-info-banner.el/actions/workflows/workflow.yml/badge.svg]]
* Introduction
~eshell-info-banner.el~ is a utility for creating an informative banner,
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
@ -22,15 +23,23 @@ macOS. PR are welcome if you want to fix that!
* Table of Contents :TOC_2_gh:
- [[#introduction][Introduction]]
- [[#recent-breaking-changes][Recent Breaking Changes]]
- [[#081][~0.8.1~]]
- [[#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]]
- [[#license][License]]
* Recent Breaking Changes
** ~0.8.1~
Version ~0.8.1~ removes the optional argument ~REMOTE~ from
~eshell-info-banner--executable-find~. It now only acts according to the
users preference set with ~eshell-info-banner-tramp-aware~.
** ~0.7.0~
Version ~0.7.0~ renames several functions to conform with the Elisp
Coding Conventions.
@ -89,6 +98,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
@ -99,6 +109,15 @@ A couple of variables can be edited by the user in order to configure
set its value to ~("/dev" "zroot")~.
Default value: ~("/dev")~
- ~eshell-info-banner-filter-duplicate-partitions~ :: Try to filter
out duplicate partitions. Two partitions are considered duplicate if
they have the same size and amount of space used.
Default value: ~nil~
- ~eshell-info-banner-exclude-partitions~ :: List of pattens to exclude
from the partition list.
Default value: ~nil~
- ~eshell-info-banner-shorten-path-from~ :: Maximum length of the mount
path of a partition before it gets abbreviated. Set it to ridiculous
numbers in order to disable it (something like ~1000~ should be more
@ -143,7 +162,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
@ -168,10 +199,9 @@ line if you have one. If you dont have a battery, the only difference
is you will have one less line than laptop users.
* Advice for Windows users
Currently, the partitions detection is done only with the ~duf~
command-line utility. If you want a list of your partitions, I
strongly encourage you to install it on your system. See
[[https://github.com/muesli/duf#windows]].
Currently, ~eshell-info-banner~ can only look for your partitions with
~duf~. If you want a list of your partitions, I strongly encourage you
to install it on your system. See [[https://github.com/muesli/duf#windows][muesli/duf]].
* Contributing
See [[file:CONTRIBUTING.org]].

1
bin/compile-package.el Normal file
View File

@ -0,0 +1 @@
(byte-recompile-directory "." 0 'force)

View File

@ -2,8 +2,8 @@
;; Author: Lucien Cartier-Tilet <lucien@phundrak.com>
;; Maintainer: Lucien Cartier-Tilet <lucien@phundrak.com>
;; Version: 0.7.7
;; Package-Requires: ((emacs "25.1") (f "0.20") (s "1"))
;; Version: 0.8.8
;; Package-Requires: ((emacs "25.1") (s "1"))
;; Homepage: https://github.com/Phundrak/eshell-info-banner.el
;; This file is not part of GNU Emacs
@ -38,7 +38,7 @@
;;; Code:
(require 'cl-lib)
(require 'f)
(require 's)
(require 'em-banner)
(require 'json)
(require 'seq)
@ -60,55 +60,38 @@
; 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
"Minimum length of text on the left hand side of the banner.")
(eval-when-compile
(defconst eshell-info-banner--macos-versions
'(("10.4" . "Mac OS X Tiger")
("10.5" . "Mac OS X Leopard")
("10.6" . "Mac OS X Snow Leopard")
("10.7" . "Mac OS X Lion")
("10.8" . "OS X Mountain Lion")
("10.9" . "OS X Mavericks")
("10.10" . "OS X Yosemite")
("10.11" . "OS X El Capitan")
("10.12" . "macOS Sierra")
("10.13" . "macOS High Sierra")
("10.14" . "macOS Mojave")
("10.15" . "macOS Catalina")
("10.16" . "macOS Big Sur")
("11.0" . "macOS Big Sur")
("11.1" . "macOS Big Sur")
("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"))
'(("^10\\.0\\." . "Mac OS X Cheetah")
("^10\\.1\\." . "Mac OS X Puma")
("^10\\.2\\." . "Mac OS X Jaguar")
("^10\\.3\\." . "Mac OS X Panther")
("^10\\.4\\." . "Mac OS X Tiger")
("^10\\.5\\." . "Mac OS X Leopard")
("^10\\.6\\." . "Mac OS X Snow Leopard")
("^10\\.7\\." . "Mac OS X Lion")
("^10\\.8\\." . "OS X Mountain Lion")
("^10\\.9\\." . "OS X Mavericks")
("^10\\.10\\." . "OS X Yosemite")
("^10\\.11\\." . "OS X El Capitan")
("^10\\.12\\." . "macOS Sierra")
("^10\\.13\\." . "macOS High Sierra")
("^10\\.14\\." . "macOS Mojave")
("^10\\.15\\." . "macOS Catalina")
("^10\\.16\\." . "macOS Big Sur")
("^11\\." . "macOS Big Sur")
("^12\\." . "macOS Monterey"))
"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)
(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)))
(defconst eshell-info-banner--posix-shells '("bash" "zsh" "sh")
"List of POSIX-compliant shells to run external commands through.")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -119,56 +102,77 @@ Ensures the command is ran with LANG=C."
"Make `eshell-info-banner' TRAMP aware."
:group 'eshell-info-banner
:type 'boolean
:safe #'booleanp
:version "0.3.0")
:safe #'booleanp)
(defcustom eshell-info-banner-shorten-path-from 7
"From which length should a path be shortened?"
:group 'eshell-info-banner
:type 'integer
:safe #'integer-or-marker-p
:version "0.1.0")
:safe #'integer-or-marker-p)
(defcustom eshell-info-banner-width 80
"Width of the info banner to be shown in Eshell."
:group 'eshell-info-banner
:type 'integer
:safe #'integer-or-marker-p
:version "0.1.0")
:safe #'integer-or-marker-p)
(defcustom eshell-info-banner-progress-bar-char "="
"Character to fill the progress bars with."
:group 'eshell-info-banner
:type 'string
:safe #'stringp
:version "0.1.0")
:safe #'stringp)
(defcustom eshell-info-banner-warning-percentage 75
"When to warn about a percentage."
:group 'eshell-info-banner
:type 'float
:safe #'floatp
:version "0.1.0")
:safe #'floatp)
(defcustom eshell-info-banner-critical-percentage 90
"When a percentage becomes critical."
:group 'eshell-info-banner
:type 'float
:safe #'floatp
:version "0.1.0")
:safe #'floatp)
(defcustom eshell-info-banner-partition-prefixes '("/dev")
"List of prefixes for detecting which partitions to display."
:group 'eshell-info-banner
:type 'list
:version "0.3.0")
:type 'list)
(defcustom eshell-info-banner-filter-duplicate-partitions nil
"Whether to filter duplicate partitions.
Two partitions are considered duplicate if they have the same
size and amount of space used."
:group 'eshell-info-banner
:type 'boolean)
(defcustom eshell-info-banner-exclude-partitions nil
"List of patterns to exclude from the partition list.
Patterns are matched against the partition name with
`string-match-p'."
:group 'eshell-info-banner
:type '(repeat string))
(defmacro eshell-info-banner--executable-find (program)
"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. `executable-find's remote argument has the value of
`eshell-info-banner-tramp-aware'."
(if (version< emacs-version "27.1")
`(let ((default-directory (if eshell-info-banner-tramp-aware
default-directory
"~")))
(executable-find ,program))
`(executable-find ,program eshell-info-banner-tramp-aware)))
(defcustom eshell-info-banner-duf-executable "duf"
"Path to the `duf' executable."
:group 'eshell-info-banner
:type 'string
:safe #'stringp
:version "0.5.0")
:safe #'stringp)
(defcustom eshell-info-banner-use-duf
(if (eshell-info-banner--executable-find eshell-info-banner-duf-executable)
@ -177,8 +181,14 @@ Ensures the command is ran with LANG=C."
"If non-nil, use `duf' instead of `df'."
:group 'eshell-info-banner
:type 'boolean
:safe #'booleanp
:version "0.5.0")
:safe #'booleanp)
(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)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -205,6 +215,56 @@ 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."
(let ((shell (or (seq-find (lambda (shell)
(eshell-info-banner--executable-find shell))
eshell-info-banner--posix-shells)
"sh")))
(with-temp-buffer
(let ((default-directory (if eshell-info-banner-tramp-aware default-directory "~")))
(process-file shell nil t nil "-c" (concat "LANG=C " command))
(buffer-string)))))
(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.
Optional argument NEWLINE: Whether to output a newline at the end
of the progress bar."
(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" "")))))
(defun eshell-info-banner--string-repeat (str times)
"Repeat STR for TIMES times."
(declare (pure t) (side-effect-free t))
(let (result)
(cl-dotimes (_ times)
(setq result (cons str result)))
(apply #'concat result)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Internal functions ;
@ -220,7 +280,7 @@ If the executable `uptime' is not found, return nil."
(let ((uptime-str (eshell-info-banner--shell-command-to-string "uptime -p")))
(if (not (seq-some (lambda (keyword)
(string-match-p keyword uptime-str))
'("invalid" "illegal")))
'("invalid" "illegal" "unknown")))
(s-chop-prefix "up " (s-trim uptime-str))
(let ((uptime-str (eshell-info-banner--shell-command-to-string "uptime")))
(save-match-data
@ -236,7 +296,7 @@ If the executable `uptime' is not found, return nil."
path size used percent)
(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
`eshell-info-banner--min-length-left'."
@ -246,34 +306,43 @@ The returned value is in any case greater than
(length (eshell-info-banner--mounted-partitions-path partition)))))))
(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
present in the former, and if `ABBR' is t then all parent
directories of the current `PATH' are abbreviated to only one
character. If an abbreviated directory starts with a dot, then
include it before the abbreviated name of the directory,
e.g. \".config\" -> \".c\".
Abbreviate PATH by removing the value of HOME if it is present in
the former, and if ABBR is t then all parent directories of the
current PATH are abbreviated to only one character. If an
abbreviated directory starts with a dot, then include it before
the abbreviated name of the directory, e.g. \".config\" ->
\".c\".
For public use, `PATH' should be a string representing a UNIX
path. For internal use, `PATH' can also be a list. If `PATH' is
neither of these, an error will be thrown by the function."
For public use, PATH should be a string representing a UNIX path.
For internal use, PATH can also be a list. If PATH is neither of
these, an error will be thrown by the function."
(cond
((stringp path) (abbreviate-file-name
(if abbr
(eshell-info-banner--abbr-path
(f-split (eshell-info-banner--abbr-path path)))
path)))
((stringp path)
(let ((abbr-path (abbreviate-file-name path)))
(if abbr
(abbreviate-file-name
(eshell-info-banner--abbr-path
(split-string abbr-path eshell-info-banner-path-separator t)))
abbr-path)))
((null path) "")
((listp path)
(f-join (if (= (length path) 1)
(car path)
(let* ((dir (car path))
(first-char (substring dir 0 1)))
(if (string= "." first-char)
(substring dir 0 2)
first-char)))
(eshell-info-banner--abbr-path (cdr path))))
(let ((file (eshell-info-banner--abbr-path (cdr path)))
(directory (if (= (length path) 1)
(car path)
(let* ((dir (car path))
(first-char (substring dir 0 1)))
(if (string= "." first-char)
(substring dir 0 2)
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))))
(defun eshell-info-banner--get-mounted-partitions-duf ()
@ -300,8 +369,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)))
@ -313,15 +382,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 -k")
(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)) 1024))
(used (* (string-to-number (nth 2 partition)) 1024))
(percent (nth 4 partition))
(mount (nth mount-position partition)))
(when (seq-some (lambda (prefix)
@ -334,7 +403,7 @@ MOUNT-POSITION."
:size size
:used used
:percent (string-to-number
(string-trim-left percent (regexp-quote "%")))))))
(s-chop-suffix "%" percent))))))
partitions))))
(defun eshell-info-banner--get-mounted-partitions-gnu ()
@ -363,43 +432,67 @@ Return detected partitions as a list of structs. See
chosen. Relies on the `df' command."
(eshell-info-banner--get-mounted-partitions-df 8))
(defun eshell-info-banner--get-mounted-partitions ()
(defun eshell-info-banner--get-mounted-partitions-1 ()
"Detect mounted partitions on the system.
Return detected partitions as a list of structs."
(if eshell-info-banner-use-duf
(eshell-info-banner--get-mounted-partitions-duf)
(pcase system-type
((or 'gnu 'gnu/linux 'gnu/kfreebsd 'berkeley-unix)
(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
((or 'gnu 'gnu/linux 'gnu/kfreebsd 'berkeley-unix)
(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
(warn "Partition detection for %s not yet supported." other)
nil)))))
(defun eshell-info-banner--get-mounted-partitions ()
"Detect mounted partitions on the system.
Take `eshell-info-banner-filter-duplicate-partitions' and
`eshell-info-banner-exclude-partitions' into account."
(let ((partitions (eshell-info-banner--get-mounted-partitions-1)))
(when eshell-info-banner-filter-duplicate-partitions
(setq partitions
(cl-loop for partition in partitions
with used = nil
for signature =
(format "%d-%d"
(eshell-info-banner--mounted-partitions-size partition)
(eshell-info-banner--mounted-partitions-used partition))
unless (member signature used)
collect partition and do (push signature used))))
(when eshell-info-banner-exclude-partitions
(setq partitions
(seq-filter (lambda (partition)
(let ((path (eshell-info-banner--mounted-partitions-path
partition)))
(not (seq-some
(lambda (pattern)
(string-match-p pattern path))
eshell-info-banner-exclude-partitions))))
partitions)))
partitions))
(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
`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.
@ -424,19 +517,80 @@ For TEXT-PADDING and BAR-LENGTH, see the documentation of
"\n"
t)))
(defun eshell-info-banner--get-memory-unix ()
"Get memory usage for UNIX systems.
Compatible with Darwin and FreeBSD at least."
(let* ((command-to-mem (lambda (command)
(string-to-number
(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
(s-trim
(car (last
(split-string (eshell-info-banner--shell-command-to-string command)
" "
t))))))
(defun eshell-info-banner--get-memory-netbsd ()
"Get memory usage for NetBSD systems.
See `eshell-info-banner--get-memory'."
(let* ((total (eshell-info-banner--get-memory-unix-command-to-mem "sysctl hw.physmem64"))
(used (- total
(* 1024 (string-to-number
(s-trim
(cadr
(split-string (eshell-info-banner--shell-command-to-string command)
" "
t)))))))
`(("RAM"
,(apply command-to-mem '("sysctl hw.physmem"))
,(apply command-to-mem '("sysctl hw.usermem"))))))
(with-temp-buffer
(insert-file-contents-literally "/proc/meminfo")
(save-match-data
(string-match (rx bol
"MemFree:"
(* blank)
(group (+ digit))
(* blank)
"kB")
(buffer-string))
(substring-no-properties (buffer-string)
(match-beginning 1)
(match-end 1))))))))))
`(("RAM" ,total ,used))))
(defun eshell-info-banner--get-memory-darwin ()
"Get memory usage for Darwin systems.
See `eshell-info-banner--get-memory'."
(let* ((total (eshell-info-banner--get-memory-unix-command-to-mem "sysctl -n hw.memsize"))
(vmstat (with-temp-buffer
(call-process "vm_stat" nil t nil)
(buffer-string)))
(wired (save-match-data
(string-match (rx " wired" (* (not digit)) (+ blank) (group (+ digit)) ".")
vmstat)
(* 1024 4
(string-to-number (substring-no-properties vmstat
(match-beginning 1)
(match-end 1))))))
(active (save-match-data
(string-match (rx " active" (* (not digit)) (+ blank) (group (+ digit)) ".")
vmstat)
(* 1024 4
(string-to-number (substring-no-properties vmstat
(match-beginning 1)
(match-end 1))))))
(compressed (save-match-data
(if (string-match (rx " occupied" (* (not digit)) (+ blank) (group (+ digit)) ".")
vmstat)
(* 1024 4
(string-to-number (substring-no-properties vmstat
(match-beginning 1)
(match-end 1))))
0))))
`(("RAM" ,total ,(+ wired active compressed)))))
(defun eshell-info-banner--get-memory-unix ()
"Get memory usage for UNIX systems."
(cond ((and (equal system-type 'berkeley-unix)
(string-match-p "NetBSD" (eshell-info-banner--shell-command-to-string "uname")))
(eshell-info-banner--get-memory-netbsd))
((equal system-type 'darwin)
(eshell-info-banner--get-memory-darwin))
(t
(let* ((total (eshell-info-banner--get-memory-unix-command-to-mem "sysctl hw.physmem"))
(used (eshell-info-banner--get-memory-unix-command-to-mem "sysctl hw.usermem")))
`(("RAM" ,total ,used))))))
(defun eshell-info-banner--get-memory-windows ()
"Get memory usage for Window."
@ -464,29 +618,20 @@ in bytes."
(defun eshell-info-banner--memory-to-string (type total used text-padding bar-length)
"Display a memorys usage with a progress bar.
The `TYPE' of memory will be the text on the far left, while
`USED' and `TOTAL' will be displayed on the right of the progress
bar. From them, a percentage will be computed which will be used
to display a colored percentage of the progress bar and it will
be displayed on the far right.
The TYPE of memory will be the text on the far left, while USED
and TOTAL will be displayed on the right of the progress bar.
From them, a percentage will be computed which will be used to
display a colored percentage of the progress bar and it will be
displayed on the far right.
`TEXT-PADDING' will determine how many dots are necessary between
`TYPE' and the colon.
TEXT-PADDING will determine how many dots are necessary between
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."
(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.
@ -498,10 +643,10 @@ bars will have this appearance:
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.
`BAR-LENGTH': the length of the progress bar."
BAR-LENGTH: the length of the progress bar."
(mapconcat (lambda (mem)
(eshell-info-banner--memory-to-string (nth 0 mem) (nth 1 mem)
(nth 2 mem) text-padding
@ -513,7 +658,7 @@ progress bar.
; Display information ;;;;;;;;;;;;;;;;;
(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)
(string-to-number percentage)
percentage)))
@ -525,12 +670,12 @@ progress bar.
(t 'eshell-info-banner-normal-face))))
(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
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."
(let* ((length-filled (if (= 0 percentage)
0
@ -541,10 +686,12 @@ critical levels close to 0 rather than 100."
percentage)))
(concat
(eshell-info-banner--with-face "[" :weight 'bold)
(eshell-info-banner--with-face (s-repeat length-filled eshell-info-banner-progress-bar-char)
(eshell-info-banner--with-face (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
length-filled)
:weight 'bold
:inherit (eshell-info-banner--get-color-percentage percentage-level))
(eshell-info-banner--with-face (s-repeat length-empty eshell-info-banner-progress-bar-char)
(eshell-info-banner--with-face (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
length-empty)
:weight 'bold
:inherit 'eshell-info-banner-background-face)
(eshell-info-banner--with-face "]" :weight 'bold))))
@ -552,9 +699,9 @@ critical levels close to 0 rather than 100."
(defun eshell-info-banner--display-battery (text-padding bar-length)
"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.
The usage of `eshell-info-banner-warning-percentage' and
@ -562,7 +709,9 @@ The usage of `eshell-info-banner-warning-percentage' and
thought of as the percentage of discharge of the computer.
Thus, setting the warning at 75% will be translated as showing
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)
(string= battery-level "Battery status not available")
(string-match-p (regexp-quote "N/A") battery-level))
@ -577,7 +726,9 @@ the warning face with a battery level of 25% or less."
(eshell-info-banner--progress-bar bar-length
percentage
t)
(s-repeat 17 " ")
(eshell-info-banner--string-repeat
" "
(if (equal eshell-info-banner-file-size-flavor 'iec) 21 17))
(format "(%3s%%)\n"
(eshell-info-banner--with-face
(number-to-string percentage)
@ -644,7 +795,7 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
(insert-file-contents (concat prefix "/bedrock/etc/bedrock-release"))
(buffer-string))))
;; Proxmox
((eshell-info-banner--executable-find "pveversion" eshell-info-banner-tramp-aware)
((eshell-info-banner--executable-find "pveversion")
(let ((distro (eshell-info-banner--shell-command-to-string "pveversion")))
(save-match-data
(string-match "/\\([^/]+\\)/" distro)
@ -652,9 +803,9 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
(substring-no-properties distro
(match-beginning 1)
(match-end 1))))))
((eshell-info-banner--executable-find "hostnamectl" eshell-info-banner-tramp-aware)
((eshell-info-banner--executable-find "hostnamectl")
(eshell-info-banner--get-os-information-from-hostnamectl))
((eshell-info-banner--executable-find "lsb_release" eshell-info-banner-tramp-aware)
((eshell-info-banner--executable-find "lsb_release")
(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))
@ -683,15 +834,17 @@ If RELEASE-FILE is nil, use '/etc/os-release'."
"Get the name of the current macOS or OSX system based on its VERSION."
`(cond
,@(mapcar (lambda (major)
`((string-match-p (regexp-quote ,(car major))
,version)
,(cdr major)))
`((string-match-p ,(car major)
,version)
,(cdr major)))
eshell-info-banner--macos-versions)
(t "unknown version")))
(defun eshell-info-banner--get-os-information-darwin ()
"See `eshell-info-banner--get-os-information'."
`(,(eshell-info-banner--get-macos-name (s-trim (eshell-info-banner--shell-command-to-string "sw_vers -productVersion")))
`(,(eshell-info-banner--get-macos-name
(s-trim
(eshell-info-banner--shell-command-to-string "sw_vers -productVersion")))
.
,(s-trim (eshell-info-banner--shell-command-to-string "uname -rs"))))
@ -719,27 +872,31 @@ 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)))
(concat (format "%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char))
(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" (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
tot-width))
(format "%s: %s Kernel.: %s\n"
(s-pad-right left-padding
"."
@ -753,7 +910,8 @@ build number)."
(eshell-info-banner--display-battery left-padding bar-length)
(eshell-info-banner--display-memory left-padding bar-length)
(eshell-info-banner--display-partitions left-padding bar-length)
(format "\n%s\n" (s-repeat tot-width eshell-info-banner-progress-bar-char)))))
(format "\n%s\n" (eshell-info-banner--string-repeat eshell-info-banner-progress-bar-char
tot-width)))))
;;;###autoload
(defun eshell-info-banner-update-banner ()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 54 KiB