mirror of
https://github.com/dylanaraps/pfetch.git
synced 2026-01-02 16:02:12 +01:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c20823937c | ||
|
|
177f30b72f | ||
|
|
aea34f832c | ||
|
|
6829866ba9 | ||
|
|
f7180ec8a7 | ||
|
|
777a64b4b1 | ||
|
|
765dc077e7 | ||
|
|
2e3da189ca | ||
|
|
344086b464 | ||
|
|
e0b082423f | ||
|
|
66e0bfe709 | ||
|
|
c97120b82f | ||
|
|
46b68022a3 | ||
|
|
146c6b6bae | ||
|
|
d8becf6692 | ||
|
|
887df06b6a | ||
|
|
a6b4b085fb | ||
|
|
cfc0e8e4d0 | ||
|
|
29b09c8622 | ||
|
|
6c2ffdd07e | ||
|
|
8974dad27a | ||
|
|
9442360c09 | ||
|
|
ee265316d9 | ||
|
|
442a2ba217 | ||
|
|
120e8a8760 |
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
@@ -8,4 +8,4 @@ jobs:
|
|||||||
- name: Run shellcheck.
|
- name: Run shellcheck.
|
||||||
run: |
|
run: |
|
||||||
shellcheck pfetch
|
shellcheck pfetch
|
||||||
sh pfetch
|
TERM=dumb sh pfetch
|
||||||
|
|||||||
54
README.md
54
README.md
@@ -21,7 +21,18 @@ _/\ __)/_) pkgs 130
|
|||||||
|
|
||||||
## OS support
|
## OS support
|
||||||
|
|
||||||
- Linux
|
- **Haiku**
|
||||||
|
- **MacOS**
|
||||||
|
- **Minix**
|
||||||
|
- **Solaris**
|
||||||
|
- **BSD**
|
||||||
|
- DragonflyBSD
|
||||||
|
- FreeBSD
|
||||||
|
- NetBSD
|
||||||
|
- OpenBSD
|
||||||
|
- **Windows**
|
||||||
|
- Windows subsystem for Linux.
|
||||||
|
- **Linux**
|
||||||
- Alpine Linux
|
- Alpine Linux
|
||||||
- Arch Linux
|
- Arch Linux
|
||||||
- Arco Linux
|
- Arco Linux
|
||||||
@@ -47,28 +58,16 @@ _/\ __)/_) pkgs 130
|
|||||||
- Slackware
|
- Slackware
|
||||||
- Ubuntu
|
- Ubuntu
|
||||||
- Void Linux
|
- Void Linux
|
||||||
- BSD
|
- Other distributions are supported with a generic penguin logo.
|
||||||
- DragonflyBSD
|
|
||||||
- FreeBSD
|
|
||||||
- NetBSD
|
|
||||||
- OpenBSD
|
|
||||||
- MacOS
|
|
||||||
- Haiku
|
|
||||||
- Minix
|
|
||||||
- Solaris
|
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
- [ ] Add optional and additional information detection.
|
- [ ] Add optional and additional information detection.
|
||||||
- [ ] CPU
|
|
||||||
- [ ] Terminal Emulator ([#12](https://github.com/dylanaraps/pfetch/pull/12))
|
- [ ] Terminal Emulator ([#12](https://github.com/dylanaraps/pfetch/pull/12))
|
||||||
- The way I implement this in `neofetch` is interesting.
|
- The way I implement this in `neofetch` is interesting.
|
||||||
- [x] Terminal colors ([commit](https://github.com/dylanaraps/pfetch/commit/ba03cb3cf4dfbc767abce6acd53c07ab5568e23d))
|
|
||||||
- [ ] Window manager ([#13](https://github.com/dylanaraps/pfetch/pull/13))
|
|
||||||
- [ ] ???
|
|
||||||
- [ ] Expand operating system support.
|
- [ ] Expand operating system support.
|
||||||
- [x] Solaris ([#5](https://github.com/dylanaraps/pfetch/issues/5))
|
- [ ] Android
|
||||||
- [x] MINIX ([#6](https://github.com/dylanaraps/pfetch/issues/6))
|
- [ ] iOS
|
||||||
- [ ] AIX ([#7](https://github.com/dylanaraps/pfetch/issues/7))
|
- [ ] AIX ([#7](https://github.com/dylanaraps/pfetch/issues/7))
|
||||||
- [ ] IRIX ([#8](https://github.com/dylanaraps/pfetch/issues/8))
|
- [ ] IRIX ([#8](https://github.com/dylanaraps/pfetch/issues/8))
|
||||||
- [ ] FreeMiNT ([#9](https://github.com/dylanaraps/pfetch/issues/9))
|
- [ ] FreeMiNT ([#9](https://github.com/dylanaraps/pfetch/issues/9))
|
||||||
@@ -76,7 +75,6 @@ _/\ __)/_) pkgs 130
|
|||||||
- [ ] CYGWIN
|
- [ ] CYGWIN
|
||||||
- [ ] MSYS
|
- [ ] MSYS
|
||||||
- [ ] MINGW
|
- [ ] MINGW
|
||||||
- [x] WSL (*this is fairly simple*)
|
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
@@ -88,7 +86,7 @@ _/\ __)/_) pkgs 130
|
|||||||
# Default: first example below
|
# Default: first example below
|
||||||
# Valid: space separated string
|
# Valid: space separated string
|
||||||
#
|
#
|
||||||
# OFF by default: shell palette
|
# OFF by default: shell editor wm de palette
|
||||||
PF_INFO="ascii title os host kernel uptime pkgs memory"
|
PF_INFO="ascii title os host kernel uptime pkgs memory"
|
||||||
|
|
||||||
# Example: Only ASCII.
|
# Example: Only ASCII.
|
||||||
@@ -126,6 +124,26 @@ PF_ALIGN=""
|
|||||||
# Default: unset (auto)
|
# Default: unset (auto)
|
||||||
# Valid: string
|
# Valid: string
|
||||||
PF_ASCII="openbsd"
|
PF_ASCII="openbsd"
|
||||||
|
|
||||||
|
# The below environment variables control more
|
||||||
|
# than just 'pfetch' and can be passed using
|
||||||
|
# 'HOSTNAME=cool_pc pfetch' to restrict their
|
||||||
|
# usage solely to 'pfetch'.
|
||||||
|
|
||||||
|
# Which user to display.
|
||||||
|
USER=""
|
||||||
|
|
||||||
|
# Which hostname to display.
|
||||||
|
HOSTNAME=""
|
||||||
|
|
||||||
|
# Which editor to display.
|
||||||
|
EDITOR=""
|
||||||
|
|
||||||
|
# Which shell to display.
|
||||||
|
SHELL=""
|
||||||
|
|
||||||
|
# Which desktop environment to display.
|
||||||
|
XDG_CURRENT_DESKTOP=""
|
||||||
```
|
```
|
||||||
|
|
||||||
## Credit
|
## Credit
|
||||||
|
|||||||
189
pfetch
189
pfetch
@@ -156,7 +156,7 @@ get_os() {
|
|||||||
|
|
||||||
else
|
else
|
||||||
# This used to be a simple '. /etc/os-release' but I believe
|
# This used to be a simple '. /etc/os-release' but I believe
|
||||||
# this is insecure as we blindly execute whatever is in the
|
# this is insecure as we blindly executed whatever was in the
|
||||||
# file. This parser instead simply handles 'key=val', treating
|
# file. This parser instead simply handles 'key=val', treating
|
||||||
# the file contents as plain-text.
|
# the file contents as plain-text.
|
||||||
while IFS='=' read -r key val; do
|
while IFS='=' read -r key val; do
|
||||||
@@ -177,17 +177,22 @@ get_os() {
|
|||||||
command -v guix && distro='Guix System'
|
command -v guix && distro='Guix System'
|
||||||
|
|
||||||
# Check to see if Linux is running in Windows 10 under
|
# Check to see if Linux is running in Windows 10 under
|
||||||
# WSL (Windows subsystem for Linux) and append a string
|
# WSL1 (Windows subsystem for Linux [version 1]) and
|
||||||
# accordingly.
|
# append a string accordingly.
|
||||||
#
|
#
|
||||||
# If the kernel version string ends in "-Microsoft",
|
# If the kernel version string ends in "-Microsoft",
|
||||||
# we're very likely running under Windows 10 in WSL.
|
# we're very likely running under Windows 10 in WSL1.
|
||||||
#
|
|
||||||
# This also acts as a means of allowing the user to
|
|
||||||
# fake this by changing their kernel version to end in
|
|
||||||
# "Microsoft".
|
|
||||||
[ "${kernel%%*-Microsoft}" ] ||
|
[ "${kernel%%*-Microsoft}" ] ||
|
||||||
distro="$distro on Windows 10"
|
distro="$distro on Windows 10 [WSL1]"
|
||||||
|
|
||||||
|
# Check to see if Linux is running in Windows 10 under
|
||||||
|
# WSL2 (Windows subsystem for Linux [version 2]) and
|
||||||
|
# append a string accordingly.
|
||||||
|
#
|
||||||
|
# This checks to see if '$WSLENV' is defined. This
|
||||||
|
# appends the Windows 10 string even if '$WSLENV' is
|
||||||
|
# empty. We only need to check that is has been _exported_.
|
||||||
|
distro="${distro}${WSLENV+ on Windows 10 [WSL2]}"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
Darwin*)
|
Darwin*)
|
||||||
@@ -277,10 +282,6 @@ get_kernel() {
|
|||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
get_shell() {
|
|
||||||
log shell "${SHELL##*/}" >&6
|
|
||||||
}
|
|
||||||
|
|
||||||
get_host() {
|
get_host() {
|
||||||
case $os in
|
case $os in
|
||||||
Linux*)
|
Linux*)
|
||||||
@@ -444,7 +445,7 @@ get_pkgs() {
|
|||||||
has emerge && printf '%s\n' /var/db/pkg/*/*/
|
has emerge && printf '%s\n' /var/db/pkg/*/*/
|
||||||
has pkgtool && printf '%s\n' /var/log/packages/*
|
has pkgtool && printf '%s\n' /var/log/packages/*
|
||||||
|
|
||||||
# NIX requires two commands.
|
# 'nix' requires two commands.
|
||||||
has nix-store && {
|
has nix-store && {
|
||||||
nix-store -q --requisites /run/current-system/sw
|
nix-store -q --requisites /run/current-system/sw
|
||||||
nix-store -q --requisites ~.nix-profile
|
nix-store -q --requisites ~.nix-profile
|
||||||
@@ -644,6 +645,15 @@ get_memory() {
|
|||||||
SunOS)
|
SunOS)
|
||||||
hw_pagesize=$(pagesize)
|
hw_pagesize=$(pagesize)
|
||||||
|
|
||||||
|
# 'kstat' outputs memory in the following format:
|
||||||
|
# unix:0:system_pages:pagestotal 1046397
|
||||||
|
# unix:0:system_pages:pagesfree 885018
|
||||||
|
#
|
||||||
|
# This simply uses the first "element" (white-space
|
||||||
|
# separated) as the key and the second element as the
|
||||||
|
# value.
|
||||||
|
#
|
||||||
|
# A variable is then assigned based on the key.
|
||||||
while read -r key val; do
|
while read -r key val; do
|
||||||
case $key in
|
case $key in
|
||||||
*total) pages_full=$val ;;
|
*total) pages_full=$val ;;
|
||||||
@@ -663,6 +673,115 @@ get_memory() {
|
|||||||
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
|
log memory "${mem_used:-?}M / ${mem_full:-?}M" >&6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_wm() {
|
||||||
|
case $os in
|
||||||
|
# Don't display window manager on macOS.
|
||||||
|
Darwin*) ;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
# xprop can be used to grab the window manager's properties
|
||||||
|
# which contains the window manager's name under '_NET_WM_NAME'.
|
||||||
|
#
|
||||||
|
# The upside to using 'xprop' is that you don't need to hardcode
|
||||||
|
# a list of known window manager names. The downside is that
|
||||||
|
# not all window managers conform to setting the '_NET_WM_NAME'
|
||||||
|
# atom..
|
||||||
|
#
|
||||||
|
# List of window managers which fail to set the name atom:
|
||||||
|
# catwm, fvwm, dwm, 2bwm and monster.
|
||||||
|
#
|
||||||
|
# The final downside to this approach is that it does _not_
|
||||||
|
# support Wayland environments. The only solution which supports
|
||||||
|
# Wayland is the 'ps' parsing mentioned below.
|
||||||
|
#
|
||||||
|
# A more naive implementation is to parse the last line of
|
||||||
|
# '~/.xinitrc' to extract the second white-space separated
|
||||||
|
# element.
|
||||||
|
#
|
||||||
|
# The issue with an approach like this is that this line data
|
||||||
|
# does not always equate to the name of the window manager and
|
||||||
|
# could in theory be _anything_.
|
||||||
|
#
|
||||||
|
# This also fails when the user launches xorg through a display
|
||||||
|
# manager or other means.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Another naive solution is to parse 'ps' with a hardcoded list
|
||||||
|
# of window managers to detect the current window manager (based
|
||||||
|
# on what is running).
|
||||||
|
#
|
||||||
|
# The issue with this approach is the need to hardcode and
|
||||||
|
# maintain a list of known window managers.
|
||||||
|
#
|
||||||
|
# Another issue is that process names do not always equate to
|
||||||
|
# the name of the window manager. False-positives can happen too.
|
||||||
|
#
|
||||||
|
# This is the only solution which supports Wayland based
|
||||||
|
# environments sadly. It'd be nice if some kind of standard were
|
||||||
|
# established to identify Wayland environments.
|
||||||
|
#
|
||||||
|
# pfetch's goal is to remain _simple_, if you'd like a "full"
|
||||||
|
# implementation of window manager detection use 'neofetch'.
|
||||||
|
#
|
||||||
|
# Neofetch use a combination of 'xprop' and 'ps' parsing to
|
||||||
|
# support all window managers (including non-conforming and
|
||||||
|
# Wayland) though it's a lot more complicated!
|
||||||
|
|
||||||
|
# Don't display window manager if X isn't running.
|
||||||
|
[ "$DISPLAY" ] || return
|
||||||
|
|
||||||
|
# This is a two pass call to xprop. One call to get the window
|
||||||
|
# manager's ID and another to print its properties.
|
||||||
|
command -v xprop && {
|
||||||
|
# The output of the ID command is as follows:
|
||||||
|
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
|
||||||
|
#
|
||||||
|
# To extract the ID, everything before the last space
|
||||||
|
# is removed.
|
||||||
|
id=$(xprop -root -notype _NET_SUPPORTING_WM_CHECK)
|
||||||
|
id=${id##* }
|
||||||
|
|
||||||
|
# The output of the property command is as follows:
|
||||||
|
# _NAME 8t
|
||||||
|
# _NET_WM_PID = 252
|
||||||
|
# _NET_WM_NAME = "bspwm"
|
||||||
|
# _NET_SUPPORTING_WM_CHECK: window id # 0x400000
|
||||||
|
# WM_CLASS = "wm", "Bspwm"
|
||||||
|
#
|
||||||
|
# To extract the name, everything before '_NET_WM_NAME = \"'
|
||||||
|
# is removed and everything after the next '"' is removed.
|
||||||
|
wm=$(xprop -id "$id" -notype -len 25 -f _NET_WM_NAME 8t)
|
||||||
|
wm=${wm##*_NET_WM_NAME = \"}
|
||||||
|
wm=${wm%%\"*}
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log wm "$wm" >&6
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
get_de() {
|
||||||
|
# This only supports Xorg related desktop environments though
|
||||||
|
# this is fine as knowing the desktop envrionment on Windows,
|
||||||
|
# macOS etc is useless (they'll always report the same value).
|
||||||
|
#
|
||||||
|
# Display the value of '$XDG_CURRENT_DESKTOP', if it's empty,
|
||||||
|
# display the value of '$DESKTOP_SESSION'.
|
||||||
|
log de "${XDG_CURRENT_DESKTOP:-$DESKTOP_SESSION}" >&6
|
||||||
|
}
|
||||||
|
|
||||||
|
get_shell() {
|
||||||
|
# Display the basename of the '$SHELL' environment variable.
|
||||||
|
log shell "${SHELL##*/}" >&6
|
||||||
|
}
|
||||||
|
|
||||||
|
get_editor() {
|
||||||
|
# Display the value of '$VISUAL', if it's empty, display the
|
||||||
|
# value of '$EDITOR'.
|
||||||
|
log editor "${VISUAL:-$EDITOR}" >&6
|
||||||
|
}
|
||||||
|
|
||||||
get_palette() {
|
get_palette() {
|
||||||
# Print the first 8 terminal colors. This uses the existing
|
# Print the first 8 terminal colors. This uses the existing
|
||||||
# sequences to change text color with a sequence prepended
|
# sequences to change text color with a sequence prepended
|
||||||
@@ -726,6 +845,17 @@ get_ascii() {
|
|||||||
EOF
|
EOF
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
[Aa]ndroid*)
|
||||||
|
read_ascii 2 <<-EOF
|
||||||
|
${c2} ;, ,;
|
||||||
|
';,.-----.,;'
|
||||||
|
,' ',
|
||||||
|
/ O O \\
|
||||||
|
| |
|
||||||
|
'-----------------'
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
|
||||||
[Aa]rch*)
|
[Aa]rch*)
|
||||||
read_ascii 4 <<-EOF
|
read_ascii 4 <<-EOF
|
||||||
${c6} /\\
|
${c6} /\\
|
||||||
@@ -1150,12 +1280,6 @@ get_ascii() {
|
|||||||
# Add a gap between the ascii art and the information.
|
# Add a gap between the ascii art and the information.
|
||||||
ascii_width=$((ascii_width + 4))
|
ascii_width=$((ascii_width + 4))
|
||||||
|
|
||||||
# Minix and DragonFly don't support these!
|
|
||||||
# '[?7l': Disable line-wrapping.
|
|
||||||
# '[?25l': Hide the cursor.
|
|
||||||
[ "$os" != Minix ] && [ "$os" != DragonFly ] &&
|
|
||||||
printf '[?7l[?25l' >&6
|
|
||||||
|
|
||||||
# Print the ascii art and position the cursor back where we
|
# Print the ascii art and position the cursor back where we
|
||||||
# started prior to printing it.
|
# started prior to printing it.
|
||||||
# '[1m': Print the ascii in bold.
|
# '[1m': Print the ascii in bold.
|
||||||
@@ -1165,11 +1289,6 @@ get_ascii() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
# Leave the terminal how we found it on exit or Ctrl+C.
|
|
||||||
# '[?7h': Enable line-wrapping.
|
|
||||||
# '[?25h': Un-hide the cursor.
|
|
||||||
trap 'printf [?7h[?25h >&6' EXIT
|
|
||||||
|
|
||||||
# Hide 'stderr' unless the first argument is '-v'. This saves
|
# Hide 'stderr' unless the first argument is '-v'. This saves
|
||||||
# polluting the script with '2>/dev/null'.
|
# polluting the script with '2>/dev/null'.
|
||||||
[ "$1" = -v ] || exec 2>/dev/null
|
[ "$1" = -v ] || exec 2>/dev/null
|
||||||
@@ -1188,6 +1307,26 @@ main() {
|
|||||||
c7='[37m'; c8='[38m'
|
c7='[37m'; c8='[38m'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Avoid text-wrapping from wrecking the program output
|
||||||
|
# and hide the cursor to hide its moving around during
|
||||||
|
# the printing process.
|
||||||
|
#
|
||||||
|
# Some terminals don't support these sequences, nor do they
|
||||||
|
# silently conceal them if they're printed resulting in
|
||||||
|
# partial sequences being printed to the terminal!
|
||||||
|
[ "$TERM" = dumb ] ||
|
||||||
|
[ "$TERM" = minix ] ||
|
||||||
|
[ "$TERM" = cons25 ] || {
|
||||||
|
# '[?7l': Disable line-wrapping.
|
||||||
|
# '[?25l': Hide the cursor.
|
||||||
|
printf '[?7l[?25l' >&6
|
||||||
|
|
||||||
|
# Leave the terminal how we found it on exit or Ctrl+C.
|
||||||
|
# '[?7h': Enable line-wrapping.
|
||||||
|
# '[?25h': Show the cursor.
|
||||||
|
trap 'printf [?7h[?25h >&6' EXIT
|
||||||
|
}
|
||||||
|
|
||||||
# Store the output of 'uname' to avoid calling it multiple times
|
# Store the output of 'uname' to avoid calling it multiple times
|
||||||
# throughout the script. 'read <<EOF' is the simplest way of reading
|
# throughout the script. 'read <<EOF' is the simplest way of reading
|
||||||
# a command into a list of variables.
|
# a command into a list of variables.
|
||||||
|
|||||||
Reference in New Issue
Block a user