2 Commits

Author SHA1 Message Date
fatalerrors
30b8b8241a bugfix 2026-04-15 14:54:49 +02:00
fatalerrors
a4056b9e82 fix line ending 2026-04-15 14:53:55 +02:00
16 changed files with 1409 additions and 1404 deletions

View File

@@ -1,71 +1,71 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
Versions follow `MAJOR.MINOR.PATCH-REVISION_STAGE_N` (e.g. `3.99.1-4_rc_1`). Versions follow `MAJOR.MINOR.PATCH-REVISION_STAGE_N` (e.g. `3.99.1-4_rc_1`).
--- ---
## [3.99.1-4_rc_1] — 2026 ## [3.99.1-4_rc_1] — 2026
### Added ### Added
- **Theming system** — `load_theme` in `profile.d/prompt.sh` loads `.theme` - **Theming system** — `load_theme` in `profile.d/prompt.sh` loads `.theme`
files from `profile.d/themes/` (or a custom directory set via files from `profile.d/themes/` (or a custom directory set via
`PROMPT_THEME_DIR`). Theme files are **parsed, not executed** — no shell code `PROMPT_THEME_DIR`). Theme files are **parsed, not executed** — no shell code
ever runs from a theme. ever runs from a theme.
- **Built-in themes** — `default`, `dark`, `light`, `solarized` (24-bit - **Built-in themes** — `default`, `dark`, `light`, `solarized` (24-bit
true-colour), `solarized-light` (24-bit), `monokai`, `monochrome`, `abyss`, true-colour), `solarized-light` (24-bit), `monokai`, `monochrome`, `abyss`,
`plasma`, `adwaita`. `plasma`, `adwaita`.
- **`[prompt]` section** — `PROMPT_THEME` and `PROMPT_THEME_DIR` keys to select - **`[prompt]` section** — `PROMPT_THEME` and `PROMPT_THEME_DIR` keys to select
a theme; eleven `PROMPT_COLOR_*` keys for per-key overrides in `profile.conf`. a theme; eleven `PROMPT_COLOR_*` keys for per-key overrides in `profile.conf`.
- **Standard colour variables as theme keys** — theme files may also override - **Standard colour variables as theme keys** — theme files may also override
the `disp.sh` colour variables (`Black`, `Blue`, `On_IBlack`, …) to remap the the `disp.sh` colour variables (`Black`, `Blue`, `On_IBlack`, …) to remap the
terminal palette used by `ls`, `grep`, and colour-aware tools. terminal palette used by `ls`, `grep`, and colour-aware tools.
- **Module configuration defaults** — all modules now expose their hardcoded - **Module configuration defaults** — all modules now expose their hardcoded
defaults as `profile.conf` keys: `TAZ_*`, `UTAZ_*`, `EXPANDLIST_*`, defaults as `profile.conf` keys: `TAZ_*`, `UTAZ_*`, `EXPANDLIST_*`,
`CLEAN_*`, `RMSPC_*`, `FINDBIG_*`, `RAIN_*`, `MATRIX_*`, `SSH_DEFAULT_OPT`, `CLEAN_*`, `RMSPC_*`, `FINDBIG_*`, `RAIN_*`, `MATRIX_*`, `SSH_DEFAULT_OPT`,
`GENPWD_*`, `PWDSCORE_*`, `BUSY_*`, `METEO_DEFAULT_CITY`, `DWL_*`, `GENPWD_*`, `PWDSCORE_*`, `BUSY_*`, `METEO_DEFAULT_CITY`, `DWL_*`,
`MYEXTIP_*`, `PKGS_*`, `PPU_*`, `KU_*`, `UPDT_DEFAULT_BRANCH`. `MYEXTIP_*`, `PKGS_*`, `PPU_*`, `KU_*`, `UPDT_DEFAULT_BRANCH`.
- **`UPDT_DEFAULT_BRANCH`** — configures the git branch used by `check_updates` - **`UPDT_DEFAULT_BRANCH`** — configures the git branch used by `check_updates`
and `profile_upgrade`. Changing the key causes `profile_upgrade` to and `profile_upgrade`. Changing the key causes `profile_upgrade` to
automatically switch the local checkout to the new branch and display a automatically switch the local checkout to the new branch and display a
warning. warning.
- **`doc/` directory** — `CONTRIBUTING.md`, `FAQ.md`, `profile.conf.example` - **`doc/` directory** — `CONTRIBUTING.md`, `FAQ.md`, `profile.conf.example`
(annotated template), `todo.md`. (annotated template), `todo.md`.
- **`.gitignore`** — `profile.conf` is now git-ignored so personal settings are - **`.gitignore`** — `profile.conf` is now git-ignored so personal settings are
never accidentally staged. never accidentally staged.
### Changed ### Changed
- README §2 now explains how to create `profile.conf` from - README §2 now explains how to create `profile.conf` from
`doc/profile.conf.example` (new section 2.1 "Initial configuration"). `doc/profile.conf.example` (new section 2.1 "Initial configuration").
- README §4 updated with full module-defaults tables, theming reference, and a - README §4 updated with full module-defaults tables, theming reference, and a
note about `profile.conf` being git-ignored. note about `profile.conf` being git-ignored.
- Theme values no longer carry the `export` keyword (they are not shell - Theme values no longer carry the `export` keyword (they are not shell
variables, only data). variables, only data).
### Security ### Security
- `load_theme` uses a strict allowlist (no `eval`, no sourcing). Only - `load_theme` uses a strict allowlist (no `eval`, no sourcing). Only
`PROMPT_COLOR_*` keys and known `disp.sh` colour variable names are accepted. `PROMPT_COLOR_*` keys and known `disp.sh` colour variable names are accepted.
Values must match `\$[A-Za-z_][A-Za-z0-9_]*` or `\\e\[[0-9;]*m`; any other Values must match `\$[A-Za-z_][A-Za-z0-9_]*` or `\\e\[[0-9;]*m`; any other
value is discarded with a warning. value is discarded with a warning.
--- ---
--- ---
> **Note:** Versions prior to `3.95.x-4_beta` did not maintain a formal > **Note:** Versions prior to `3.95.x-4_beta` did not maintain a formal
> changelog. The full history of earlier changes is available through the git > changelog. The full history of earlier changes is available through the git
> log (`git log --oneline`). > log (`git log --oneline`).
## [3.95.3-4_beta_3] — 2024 ## [3.95.3-4_beta_3] — 2024
### Added ### Added
- Initial public release candidate series. - Initial public release candidate series.
- Core modules: `compress`, `disp`, `filefct`, `fun`, `help`, `info`, `lang`, - Core modules: `compress`, `disp`, `filefct`, `fun`, `help`, `info`, `lang`,
`net`, `packages`, `processes`, `prompt`, `pwd`, `rain`, `ssh`, `updates`. `net`, `packages`, `processes`, `prompt`, `pwd`, `rain`, `ssh`, `updates`.
- Bar-style prompt with time, command duration, and exit code. - Bar-style prompt with time, command duration, and exit code.
- `taz` / `utaz` archive helpers. - `taz` / `utaz` archive helpers.
- `genpwd` / `pwdscore` password tools. - `genpwd` / `pwdscore` password tools.
- `matrix` / `rain` screensavers. - `matrix` / `rain` screensavers.
- `profile_upgrade` with git and archive download support. - `profile_upgrade` with git and archive download support.

View File

@@ -1,171 +1,171 @@
# Contributing to profile # Contributing to profile
Thank you for your interest in contributing. This document explains how to get Thank you for your interest in contributing. This document explains how to get
set up, what the conventions are, and how to submit work. set up, what the conventions are, and how to submit work.
--- ---
## 1. Before you start ## 1. Before you start
- Check the [to-do list](./todo.md) to see if your idea is already planned. - Check the [to-do list](./todo.md) to see if your idea is already planned.
- Check the [issue tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues) - Check the [issue tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues)
to avoid duplicate work. to avoid duplicate work.
- For significant changes, open an issue or contact the maintainer before - For significant changes, open an issue or contact the maintainer before
writing code — alignment on design saves everyone time. writing code — alignment on design saves everyone time.
--- ---
## 2. Getting the source ## 2. Getting the source
A Git clone is mandatory for contributions: A Git clone is mandatory for contributions:
```bash ```bash
git clone https://git.geoffray-levasseur.org/fatalerrors/profile.git git clone https://git.geoffray-levasseur.org/fatalerrors/profile.git
cd profile cd profile
``` ```
Always work from the **latest commit on `master`** (or the branch you intend Always work from the **latest commit on `master`** (or the branch you intend
to target). Stale forks cause avoidable merge conflicts. to target). Stale forks cause avoidable merge conflicts.
--- ---
## 3. Development environment ## 3. Development environment
| Requirement | Minimum version | Notes | | Requirement | Minimum version | Notes |
|---|---|---| |---|---|---|
| Bash | 4.3 | Namerefs (`local -n`) required | | Bash | 4.3 | Namerefs (`local -n`) required |
| shellcheck | any recent | Run before every commit | | shellcheck | any recent | Run before every commit |
| git | any | For contributing patches | | git | any | For contributing patches |
| bats-core | 1.x | Optional — for running the test suite | | bats-core | 1.x | Optional — for running the test suite |
Install shellcheck: Install shellcheck:
```bash ```bash
# Debian / Ubuntu # Debian / Ubuntu
apt-get install shellcheck apt-get install shellcheck
# Fedora / RHEL # Fedora / RHEL
dnf install ShellCheck dnf install ShellCheck
# macOS # macOS
brew install shellcheck brew install shellcheck
``` ```
--- ---
## 4. Code style ## 4. Code style
### General rules ### General rules
- **Bash only** — no external interpreters in core modules. Python or Perl is - **Bash only** — no external interpreters in core modules. Python or Perl is
acceptable for completely self-contained, optional utilities that have no acceptable for completely self-contained, optional utilities that have no
dependencies beyond a minimal Debian or CentOS installation. dependencies beyond a minimal Debian or CentOS installation.
- **4-space indentation** — no tabs. - **4-space indentation** — no tabs.
- **`[[ … ]]`** for all conditionals — not `[ … ]`. - **`[[ … ]]`** for all conditionals — not `[ … ]`.
- **`(( … ))`** for arithmetic — not `$(( … ))` in conditionals. - **`(( … ))`** for arithmetic — not `$(( … ))` in conditionals.
- **`local`** for all function-internal variables — avoid polluting the - **`local`** for all function-internal variables — avoid polluting the
environment. environment.
- **`printf`** instead of `echo` wherever the format matters. - **`printf`** instead of `echo` wherever the format matters.
- **Never `eval`** — use namerefs (`local -n`), `${!varname}` indirection, or - **Never `eval`** — use namerefs (`local -n`), `${!varname}` indirection, or
`declare -g` instead. `declare -g` instead.
- **No hardcoded defaults** — wire every configurable value through - **No hardcoded defaults** — wire every configurable value through
`${VAR:-default}` and document the key in `profile.conf` and `README.md §4`. `${VAR:-default}` and document the key in `profile.conf` and `README.md §4`.
### Function conventions ### Function conventions
- Public functions **must** be exported: `export -f funcname`. - Public functions **must** be exported: `export -f funcname`.
- Every public function **must** support `-h` / `--help` and print usage to - Every public function **must** support `-h` / `--help` and print usage to
stdout, returning 0. stdout, returning 0.
- Use `getopt` (not `getopts`) for option parsing — it handles long options and - Use `getopt` (not `getopts`) for option parsing — it handles long options and
`--` correctly. `--` correctly.
- Follow existing error-return conventions: 0 = success, 1 = usage error, - Follow existing error-return conventions: 0 = success, 1 = usage error,
2 = bad options, 3 = missing dependency, 4+ = runtime failure. 2 = bad options, 3 = missing dependency, 4+ = runtime failure.
- Prefix all local helper variables with a short unique prefix (e.g. `_taz_`) - Prefix all local helper variables with a short unique prefix (e.g. `_taz_`)
to prevent collisions with caller-scope variables. to prevent collisions with caller-scope variables.
### Module structure ### Module structure
Every new module should follow this pattern: Every new module should follow this pattern:
```bash ```bash
#!/usr/bin/env bash #!/usr/bin/env bash
# <copyright block identical to existing modules> # <copyright block identical to existing modules>
load_conf "<module_name>" load_conf "<module_name>"
# --- functions --- # --- functions ---
export -f my_function export -f my_function
# EOF # EOF
``` ```
Add the `load_conf` call near the top after any variable declarations. Add the `load_conf` call near the top after any variable declarations.
--- ---
## 5. Configuration keys ## 5. Configuration keys
When adding a configurable default: When adding a configurable default:
1. Use `${MY_VAR:-hardcoded_default}` in the function body. 1. Use `${MY_VAR:-hardcoded_default}` in the function body.
2. Add a commented-out entry with a description to `profile.conf`. 2. Add a commented-out entry with a description to `profile.conf`.
3. Document the key in the matching table in `README.md §4.2`. 3. Document the key in the matching table in `README.md §4.2`.
--- ---
## 6. Theming ## 6. Theming
New theme files go in `profile.d/themes/` with a `.theme` extension. New theme files go in `profile.d/themes/` with a `.theme` extension.
They are **parsed, not executed** — do not add shell logic. They are **parsed, not executed** — do not add shell logic.
See the existing themes and `README.md §4.4` for the allowed syntax. See the existing themes and `README.md §4.4` for the allowed syntax.
--- ---
## 7. Running shellcheck ## 7. Running shellcheck
```bash ```bash
shellcheck -x profile.sh profile.d/*.sh shellcheck -x profile.sh profile.d/*.sh
``` ```
All warnings must be resolved before a patch will be accepted. Accepted All warnings must be resolved before a patch will be accepted. Accepted
suppression directives (`# shellcheck disable=SCxxxx`) require an inline suppression directives (`# shellcheck disable=SCxxxx`) require an inline
comment explaining why the suppression is necessary. comment explaining why the suppression is necessary.
--- ---
## 8. Submitting a contribution ## 8. Submitting a contribution
### Via Git (preferred) ### Via Git (preferred)
1. Contact the maintainer to obtain push access, or fork on the Gitea instance. 1. Contact the maintainer to obtain push access, or fork on the Gitea instance.
2. Create a branch: `git checkout -b feature/my-feature`. 2. Create a branch: `git checkout -b feature/my-feature`.
3. Commit with a clear subject line: `module: short description (≤ 72 chars)`. 3. Commit with a clear subject line: `module: short description (≤ 72 chars)`.
4. Push and open a pull request against `master`. 4. Push and open a pull request against `master`.
### Via patch ### Via patch
If you do not have push access: If you do not have push access:
```bash ```bash
git format-patch origin/master git format-patch origin/master
``` ```
Send the resulting `.patch` file(s) to Send the resulting `.patch` file(s) to
`fatalerrors <at> geoffray-levasseur <dot> org`. `fatalerrors <at> geoffray-levasseur <dot> org`.
### Commit message format ### Commit message format
``` ```
module: imperative short description module: imperative short description
Optional longer explanation of what changed and why. Wrap at 72 characters. Optional longer explanation of what changed and why. Wrap at 72 characters.
Reference issue numbers if applicable: closes #42. Reference issue numbers if applicable: closes #42.
``` ```
--- ---
## 9. What will be rejected ## 9. What will be rejected
- Code requiring packages not in a minimal Debian or CentOS install. - Code requiring packages not in a minimal Debian or CentOS install.
- Use of `eval`, `source`-based config loading, or other code-injection vectors. - Use of `eval`, `source`-based config loading, or other code-injection vectors.
- Changes that break Bash 4.3 compatibility. - Changes that break Bash 4.3 compatibility.
- Patches without a passing `shellcheck` run. - Patches without a passing `shellcheck` run.
- New functions without `--help` support. - New functions without `--help` support.
--- ---
## 10. Financial contributions ## 10. Financial contributions
Contact the maintainer by mail if you wish to make a financial contribution. Contact the maintainer by mail if you wish to make a financial contribution.

View File

@@ -1,208 +1,208 @@
# Frequently Asked Questions # Frequently Asked Questions
--- ---
## Installation & loading ## Installation & loading
**Q: profile refuses to load and prints "This profile requires Bash 4.3 or higher."** **Q: profile refuses to load and prints "This profile requires Bash 4.3 or higher."**
Your system's default shell is an older Bash (common on macOS, which ships Your system's default shell is an older Bash (common on macOS, which ships
Bash 3.x for licensing reasons). Install a newer Bash: Bash 3.x for licensing reasons). Install a newer Bash:
```bash ```bash
# macOS # macOS
brew install bash brew install bash
# then add /opt/homebrew/bin/bash to /etc/shells and chsh # then add /opt/homebrew/bin/bash to /etc/shells and chsh
``` ```
Or point your terminal emulator at the newer binary explicitly. Or point your terminal emulator at the newer binary explicitly.
--- ---
**Q: I sourced `profile.sh` but functions are not available in sub-shells or scripts.** **Q: I sourced `profile.sh` but functions are not available in sub-shells or scripts.**
All public functions are exported with `export -f`. They are available in All public functions are exported with `export -f`. They are available in
child Bash processes, but **not** in POSIX `sh` sub-shells. Make sure your child Bash processes, but **not** in POSIX `sh` sub-shells. Make sure your
scripts start with `#!/usr/bin/env bash`. scripts start with `#!/usr/bin/env bash`.
--- ---
**Q: I set `PROFILE_PATH` but profile still can't find its modules.** **Q: I set `PROFILE_PATH` but profile still can't find its modules.**
`PROFILE_PATH` must be exported *before* you source `profile.sh`: `PROFILE_PATH` must be exported *before* you source `profile.sh`:
```bash ```bash
export PROFILE_PATH=/opt/profile export PROFILE_PATH=/opt/profile
source /opt/profile/profile.sh source /opt/profile/profile.sh
``` ```
If set after sourcing, `MYPATH` is already locked in and the variable has If set after sourcing, `MYPATH` is already locked in and the variable has
no effect. no effect.
--- ---
**Q: Can I load profile system-wide via `/etc/profile`?** **Q: Can I load profile system-wide via `/etc/profile`?**
It is not recommended. User `.bashrc` files frequently set variables that It is not recommended. User `.bashrc` files frequently set variables that
conflict with the aliases and locale functions defined here, leading to conflict with the aliases and locale functions defined here, leading to
surprising behaviour. Per-user sourcing from `~/.bashrc` is the supported surprising behaviour. Per-user sourcing from `~/.bashrc` is the supported
method. method.
--- ---
## Configuration ## Configuration
**Q: I edited `profile.conf` but my changes have no effect.** **Q: I edited `profile.conf` but my changes have no effect.**
`profile.conf` is parsed once per shell session at load time. Open a new `profile.conf` is parsed once per shell session at load time. Open a new
terminal (or `exec bash`) to pick up the changes. There is no live-reload. terminal (or `exec bash`) to pick up the changes. There is no live-reload.
--- ---
**Q: How do I find out which configuration keys a module supports?** **Q: How do I find out which configuration keys a module supports?**
Every supported key is documented with a comment in `profile.conf`. Every supported key is documented with a comment in `profile.conf`.
See also `README.md §4.2` for a consolidated table. See also `README.md §4.2` for a consolidated table.
--- ---
**Q: A key I set in `profile.conf` is being ignored.** **Q: A key I set in `profile.conf` is being ignored.**
Check that: Check that:
1. The key is inside the correct `[section]` header. 1. The key is inside the correct `[section]` header.
2. There is no leading space before the section name (`[section]` not 2. There is no leading space before the section name (`[section]` not
`[ section ]`). `[ section ]`).
3. The key is not commented out (no leading `#`). 3. The key is not commented out (no leading `#`).
4. The value contains no backticks or `$(…)` — these are stripped by the 4. The value contains no backticks or `$(…)` — these are stripped by the
parser as a security measure. parser as a security measure.
--- ---
## Prompt & theming ## Prompt & theming
**Q: How do I change the prompt theme?** **Q: How do I change the prompt theme?**
Add to `profile.conf`: Add to `profile.conf`:
```ini ```ini
[prompt] [prompt]
PROMPT_THEME = dark PROMPT_THEME = dark
``` ```
Built-in names: `default`, `dark`, `light`, `solarized`, `solarized-light`, Built-in names: `default`, `dark`, `light`, `solarized`, `solarized-light`,
`monokai`, `monochrome`, `abyss`, `plasma`, `adwaita`. `monokai`, `monochrome`, `abyss`, `plasma`, `adwaita`.
--- ---
**Q: The solarized or solarized-light theme shows wrong colours.** **Q: The solarized or solarized-light theme shows wrong colours.**
Those themes use 24-bit / true-colour ANSI sequences (`\e[38;2;R;G;Bm`). Those themes use 24-bit / true-colour ANSI sequences (`\e[38;2;R;G;Bm`).
Test your terminal: Test your terminal:
```bash ```bash
printf '\e[38;2;38;139;210mTrue colour test\e[0m\n' printf '\e[38;2;38;139;210mTrue colour test\e[0m\n'
``` ```
If you see a solid blue word your terminal supports true colour. If you see a solid blue word your terminal supports true colour.
If you see garbage or plain text, switch to a 16-colour theme If you see garbage or plain text, switch to a 16-colour theme
(`dark`, `default`, etc.) or upgrade your terminal emulator. (`dark`, `default`, etc.) or upgrade your terminal emulator.
--- ---
**Q: I created a custom theme but `load_theme` emits "key not allowed" warnings.** **Q: I created a custom theme but `load_theme` emits "key not allowed" warnings.**
Theme files are parsed, not executed. Only `PROMPT_COLOR_*` keys and the Theme files are parsed, not executed. Only `PROMPT_COLOR_*` keys and the
standard colour variable names from `disp.sh` (`Black`, `Blue`, `On_IBlack`, standard colour variable names from `disp.sh` (`Black`, `Blue`, `On_IBlack`,
…) are accepted. Any other key — including custom variables — is rejected. …) are accepted. Any other key — including custom variables — is rejected.
See `README.md §4.4` for the full list of accepted keys and value forms. See `README.md §4.4` for the full list of accepted keys and value forms.
--- ---
**Q: Can a theme file contain shell logic or `$(…)` command substitutions?** **Q: Can a theme file contain shell logic or `$(…)` command substitutions?**
No, and intentionally so. Theme files are parsed line-by-line; shell No, and intentionally so. Theme files are parsed line-by-line; shell
constructs are never evaluated. This is a security boundary — a malicious constructs are never evaluated. This is a security boundary — a malicious
theme file cannot execute code. Values must be a colour variable reference theme file cannot execute code. Values must be a colour variable reference
(`$Blue`) or a raw ANSI escape literal (`\e[0;34m`). (`$Blue`) or a raw ANSI escape literal (`\e[0;34m`).
--- ---
## Functions ## Functions
**Q: `meteo` prints "No city specified" even though I set a default.** **Q: `meteo` prints "No city specified" even though I set a default.**
The key is `METEO_DEFAULT_CITY` (not `DEFAULT_CITY`), and it must be in the The key is `METEO_DEFAULT_CITY` (not `DEFAULT_CITY`), and it must be in the
`[info]` section: `[info]` section:
```ini ```ini
[info] [info]
METEO_DEFAULT_CITY = Paris METEO_DEFAULT_CITY = Paris
``` ```
--- ---
**Q: `dwl` fails with "no download tool found".** **Q: `dwl` fails with "no download tool found".**
`dwl` requires one of `curl`, `wget`, or `fetch` to be installed. `dwl` requires one of `curl`, `wget`, or `fetch` to be installed.
Install curl: Install curl:
```bash ```bash
# Debian / Ubuntu # Debian / Ubuntu
apt-get install curl apt-get install curl
# Fedora / RHEL # Fedora / RHEL
dnf install curl dnf install curl
``` ```
Or set `DWL_PREFERRED_TOOL` in `[net]` to whichever tool you have. Or set `DWL_PREFERRED_TOOL` in `[net]` to whichever tool you have.
--- ---
**Q: `pkgs` does not find packages I know are installed.** **Q: `pkgs` does not find packages I know are installed.**
`pkgs` delegates to `dpkg -l` (Debian/Ubuntu) or `rpm -qa` (RHEL/Fedora). `pkgs` delegates to `dpkg -l` (Debian/Ubuntu) or `rpm -qa` (RHEL/Fedora).
If your distribution uses a different package manager (pacman, apk, brew …) If your distribution uses a different package manager (pacman, apk, brew …)
it is not yet supported. See `doc/todo.md` for the tracking issue. it is not yet supported. See `doc/todo.md` for the tracking issue.
--- ---
**Q: `profile_upgrade` says "no update available" but I know there is one.** **Q: `profile_upgrade` says "no update available" but I know there is one.**
`check_updates` compares the content of the remote `version` file against `check_updates` compares the content of the remote `version` file against
`$PROFVERSION`. If `UPDT_DEFAULT_BRANCH` in `[updates]` points to a different `$PROFVERSION`. If `UPDT_DEFAULT_BRANCH` in `[updates]` points to a different
branch than your installation, the version files may not match. Check: branch than your installation, the version files may not match. Check:
```bash ```bash
cat "$MYPATH/version" cat "$MYPATH/version"
``` ```
and make sure `UPDT_DEFAULT_BRANCH` matches the branch you track. and make sure `UPDT_DEFAULT_BRANCH` matches the branch you track.
--- ---
## Compatibility ## Compatibility
**Q: Some functions misbehave on macOS / Cygwin.** **Q: Some functions misbehave on macOS / Cygwin.**
Both environments ship non-GNU userland utilities with different flags and Both environments ship non-GNU userland utilities with different flags and
behaviour. profile is primarily developed and tested on Linux (Debian and behaviour. profile is primarily developed and tested on Linux (Debian and
RHEL families). macOS and Cygwin bugs are low priority; patches that add RHEL families). macOS and Cygwin bugs are low priority; patches that add
compatibility without breaking Linux support are welcome. compatibility without breaking Linux support are welcome.
--- ---
**Q: Can I use profile with ZSH?** **Q: Can I use profile with ZSH?**
Not officially. Blockers include `local -A` (ZSH requires `typeset -A`) and Not officially. Blockers include `local -A` (ZSH requires `typeset -A`) and
`local -n` namerefs. A compatibility layer is listed in `doc/todo.md` but `local -n` namerefs. A compatibility layer is listed in `doc/todo.md` but
has not been implemented yet. has not been implemented yet.
--- ---
## Miscellaneous ## Miscellaneous
**Q: How do I completely disable profile for one session?** **Q: How do I completely disable profile for one session?**
```bash ```bash
PROFILE_DISABLED=1 bash --norc PROFILE_DISABLED=1 bash --norc
``` ```
Or simply open a shell without sourcing `~/.bashrc` (`bash --norc`). Or simply open a shell without sourcing `~/.bashrc` (`bash --norc`).
--- ---
**Q: How do I report a bug?** **Q: How do I report a bug?**
Open an issue on the Open an issue on the
[Gitea tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues) [Gitea tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues)
or send a mail to `fatalerrors <at> geoffray-levasseur <dot> org` with: or send a mail to `fatalerrors <at> geoffray-levasseur <dot> org` with:
- The exact command that triggered the bug - The exact command that triggered the bug
- Your OS and Bash version (`bash --version`) - Your OS and Bash version (`bash --version`)
- The module involved - The module involved
- Any relevant error output - Any relevant error output

View File

@@ -1,247 +1,247 @@
# profile.conf — example / reference configuration # profile.conf — example / reference configuration
# Copy this file to the profile installation directory as "profile.conf" # Copy this file to the profile installation directory as "profile.conf"
# and uncomment / edit the keys you want to change. # and uncomment / edit the keys you want to change.
# #
# Format: # Format:
# [section_name] — starts a section # [section_name] — starts a section
# key = value — sets a key (whitespace around = is optional) # key = value — sets a key (whitespace around = is optional)
# # comment — line comment # # comment — line comment
# #
# All keys are optional. Sensible defaults apply when unset. # All keys are optional. Sensible defaults apply when unset.
# Values must not contain backticks or $(…) — those are stripped for security. # Values must not contain backticks or $(…) — those are stripped for security.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ============================================================================== # ==============================================================================
[system] [system]
# Bash history settings # Bash history settings
HISTSIZE=50000 HISTSIZE=50000
HISTFILESIZE=100000 HISTFILESIZE=100000
HISTIGNORE="&:[bf]g:exit" HISTIGNORE="&:[bf]g:exit"
# Default pager # Default pager
PAGER=less PAGER=less
# Terminal colour capability # Terminal colour capability
TERM=xterm-256color TERM=xterm-256color
# ============================================================================== # ==============================================================================
[compress] [compress]
# taz: Default archive format (-f/--format). # taz: Default archive format (-f/--format).
# Supported: lz (default), xz, bz2, gz, lzo, tar, zip, zst # Supported: lz (default), xz, bz2, gz, lzo, tar, zip, zst
#TAZ_DEFAULT_FORMAT=lz #TAZ_DEFAULT_FORMAT=lz
# taz: Number of compression threads (0 = auto-detect CPU count). # taz: Number of compression threads (0 = auto-detect CPU count).
#TAZ_DEFAULT_THREADS=0 #TAZ_DEFAULT_THREADS=0
# taz: Compression level 1 (fast/large) … 9 (slow/small). # taz: Compression level 1 (fast/large) … 9 (slow/small).
#TAZ_DEFAULT_LEVEL=6 #TAZ_DEFAULT_LEVEL=6
# utaz: Delete source archive after successful extraction (0=no, 1=yes). # utaz: Delete source archive after successful extraction (0=no, 1=yes).
#UTAZ_DEFAULT_DELETE=0 #UTAZ_DEFAULT_DELETE=0
# utaz: Subdirectory creation policy. # utaz: Subdirectory creation policy.
# auto — create one only when the archive has multiple top-level entries # auto — create one only when the archive has multiple top-level entries
# always — always extract into a new subdirectory # always — always extract into a new subdirectory
# never — always flatten into the current directory # never — always flatten into the current directory
#UTAZ_DEFAULT_DIR_MODE=auto #UTAZ_DEFAULT_DIR_MODE=auto
# ============================================================================== # ==============================================================================
[debug] [debug]
# (no configurable keys yet) # (no configurable keys yet)
# ============================================================================== # ==============================================================================
[disp] [disp]
# Uncomment to disable ANSI colours in profile's own output messages. # Uncomment to disable ANSI colours in profile's own output messages.
#NO_COLOR=1 #NO_COLOR=1
# ============================================================================== # ==============================================================================
[filefct] [filefct]
# expandlist: Separator between items (default: space). Use \n for newline. # expandlist: Separator between items (default: space). Use \n for newline.
#EXPANDLIST_DEFAULT_SEPARATOR=" " #EXPANDLIST_DEFAULT_SEPARATOR=" "
# clean: Recurse into subdirectories by default (0=no, 1=yes). # clean: Recurse into subdirectories by default (0=no, 1=yes).
#CLEAN_DEFAULT_RECURSIVE=0 #CLEAN_DEFAULT_RECURSIVE=0
# rmspc: Replacement character for spaces in filenames (default: underscore). # rmspc: Replacement character for spaces in filenames (default: underscore).
#RMSPC_DEFAULT_CHAR=_ #RMSPC_DEFAULT_CHAR=_
# findbig: Number of results to display (default: 10). # findbig: Number of results to display (default: 10).
#FINDBIG_DEFAULT_LIMIT=10 #FINDBIG_DEFAULT_LIMIT=10
# ============================================================================== # ==============================================================================
[fun] [fun]
# busy: Hex pattern searched in /dev/urandom hexdump. # busy: Hex pattern searched in /dev/urandom hexdump.
#BUSY_DEFAULT_PATTERN=ca fe #BUSY_DEFAULT_PATTERN=ca fe
# busy: Delay between matched lines in milliseconds (0 = no delay). # busy: Delay between matched lines in milliseconds (0 = no delay).
#BUSY_DEFAULT_DELAY=0 #BUSY_DEFAULT_DELAY=0
# ============================================================================== # ==============================================================================
[info] [info]
# meteo: Default city when no argument is given. Leave unset to require an # meteo: Default city when no argument is given. Leave unset to require an
# explicit city argument every time. # explicit city argument every time.
#METEO_DEFAULT_CITY=Paris #METEO_DEFAULT_CITY=Paris
# ============================================================================== # ==============================================================================
[lang] [lang]
# Comma-separated alias:locale pairs. One function is generated per entry. # Comma-separated alias:locale pairs. One function is generated per entry.
# Example: SET_LOCALE="fr:fr_FR.UTF-8,us:en_US.UTF-8,es:es_ES.UTF-8" # Example: SET_LOCALE="fr:fr_FR.UTF-8,us:en_US.UTF-8,es:es_ES.UTF-8"
# creates setfr, setus, setes. # creates setfr, setus, setes.
#SET_LOCALE=fr:fr_FR.UTF-8,us:en_US.UTF-8 #SET_LOCALE=fr:fr_FR.UTF-8,us:en_US.UTF-8
# ============================================================================== # ==============================================================================
[net] [net]
# dwl: Force a specific download tool (curl, wget, fetch). # dwl: Force a specific download tool (curl, wget, fetch).
# Unset = auto-detect (curl preferred, then wget, then fetch). # Unset = auto-detect (curl preferred, then wget, then fetch).
#DWL_PREFERRED_TOOL=curl #DWL_PREFERRED_TOOL=curl
# myextip: API endpoint for external IP lookup. # myextip: API endpoint for external IP lookup.
# Alternatives: https://ipinfo.io/json, https://ip-api.com/json/ # Alternatives: https://ipinfo.io/json, https://ip-api.com/json/
#MYEXTIP_DEFAULT_URL=https://ip-api.com/json/ #MYEXTIP_DEFAULT_URL=https://ip-api.com/json/
# ============================================================================== # ==============================================================================
[packages] [packages]
# pkgs: Case-insensitive search by default (0=no, 1=yes). # pkgs: Case-insensitive search by default (0=no, 1=yes).
#PKGS_DEFAULT_IGNORE_CASE=0 #PKGS_DEFAULT_IGNORE_CASE=0
# ============================================================================== # ==============================================================================
[processes] [processes]
# ppu: ps output columns (comma-separated ps field names). # ppu: ps output columns (comma-separated ps field names).
#PPU_DEFAULT_FORMAT=pid,user,%cpu,%mem,start,time,command #PPU_DEFAULT_FORMAT=pid,user,%cpu,%mem,start,time,command
# ku: Signal sent when killing a user's processes (without SIG prefix). # ku: Signal sent when killing a user's processes (without SIG prefix).
#KU_DEFAULT_SIGNAL=TERM #KU_DEFAULT_SIGNAL=TERM
# ============================================================================== # ==============================================================================
[prompt] [prompt]
# Name of the prompt theme to load, or an explicit path to a .theme file. # Name of the prompt theme to load, or an explicit path to a .theme file.
# Built-in themes: default, dark, light, solarized, solarized-light, # Built-in themes: default, dark, light, solarized, solarized-light,
# monokai, monochrome, abyss, plasma, adwaita # monokai, monochrome, abyss, plasma, adwaita
# Solarized variants require a terminal with 24-bit true-colour support. # Solarized variants require a terminal with 24-bit true-colour support.
#PROMPT_THEME=default #PROMPT_THEME=default
# Directory searched for bare theme names. Defaults to profile.d/themes/. # Directory searched for bare theme names. Defaults to profile.d/themes/.
#PROMPT_THEME_DIR=/path/to/my/themes #PROMPT_THEME_DIR=/path/to/my/themes
# Individual colour overrides — these always win over the loaded theme. # Individual colour overrides — these always win over the loaded theme.
# Values must be colour variable names from disp.sh (e.g. $Blue, $On_IBlack) # Values must be colour variable names from disp.sh (e.g. $Blue, $On_IBlack)
# or raw ANSI escape sequences (e.g. \e[0;34m). # or raw ANSI escape sequences (e.g. \e[0;34m).
# #
# Clock segment # Clock segment
#PROMPT_COLOR_TIME_FG=$Blue #PROMPT_COLOR_TIME_FG=$Blue
#PROMPT_COLOR_TIME_BG=$On_IBlack #PROMPT_COLOR_TIME_BG=$On_IBlack
# #
# Main bar background # Main bar background
#PROMPT_COLOR_BAR_BG=$On_Blue #PROMPT_COLOR_BAR_BG=$On_Blue
# #
# Exit-code segment — success # Exit-code segment — success
#PROMPT_COLOR_OK_FG=$White #PROMPT_COLOR_OK_FG=$White
#PROMPT_COLOR_OK_MARK=$Green #PROMPT_COLOR_OK_MARK=$Green
# #
# Exit-code segment — failure # Exit-code segment — failure
#PROMPT_COLOR_ERR_BG=$On_Red #PROMPT_COLOR_ERR_BG=$On_Red
#PROMPT_COLOR_ERR_FG=$White #PROMPT_COLOR_ERR_FG=$White
#PROMPT_COLOR_ERR_MARK=$BYellow #PROMPT_COLOR_ERR_MARK=$BYellow
# #
# User / host # User / host
#PROMPT_COLOR_ROOT_FG=$Red #PROMPT_COLOR_ROOT_FG=$Red
#PROMPT_COLOR_USER_FG=$Green #PROMPT_COLOR_USER_FG=$Green
# #
# Working directory # Working directory
#PROMPT_COLOR_DIR_FG=$ICyan #PROMPT_COLOR_DIR_FG=$ICyan
# ============================================================================== # ==============================================================================
[pwd] [pwd]
# genpwd: Default password length. # genpwd: Default password length.
#GENPWD_DEFAULT_LENGTH=16 #GENPWD_DEFAULT_LENGTH=16
# genpwd: Maximum occurrences of any single character. # genpwd: Maximum occurrences of any single character.
#GENPWD_DEFAULT_OCCURS=2 #GENPWD_DEFAULT_OCCURS=2
# genpwd: Number of passwords generated per invocation. # genpwd: Number of passwords generated per invocation.
#GENPWD_DEFAULT_COUNT=1 #GENPWD_DEFAULT_COUNT=1
# genpwd: Include symbols (1=yes, 0=no). # genpwd: Include symbols (1=yes, 0=no).
#GENPWD_DEFAULT_SYMBOLS=1 #GENPWD_DEFAULT_SYMBOLS=1
# genpwd: Include uppercase letters (1=yes, 0=no). # genpwd: Include uppercase letters (1=yes, 0=no).
#GENPWD_DEFAULT_UPPERCASE=1 #GENPWD_DEFAULT_UPPERCASE=1
# genpwd: Include lowercase letters (1=yes, 0=no). # genpwd: Include lowercase letters (1=yes, 0=no).
#GENPWD_DEFAULT_LOWERCASE=1 #GENPWD_DEFAULT_LOWERCASE=1
# genpwd: Include digits (1=yes, 0=no). # genpwd: Include digits (1=yes, 0=no).
#GENPWD_DEFAULT_NUMBERS=1 #GENPWD_DEFAULT_NUMBERS=1
# pwdscore: Show verbose breakdown by default (1=yes, 0=no). # pwdscore: Show verbose breakdown by default (1=yes, 0=no).
#PWDSCORE_DEFAULT_VERBOSE=0 #PWDSCORE_DEFAULT_VERBOSE=0
# ============================================================================== # ==============================================================================
[rain] [rain]
# rain: Falling speed — integer/100 gives seconds (5 → 0.05 s). # rain: Falling speed — integer/100 gives seconds (5 → 0.05 s).
# Values < 1 are used as raw seconds. # Values < 1 are used as raw seconds.
#RAIN_DEFAULT_SPEED=5 #RAIN_DEFAULT_SPEED=5
# rain: Colour theme. Supported: white (default), green, blue, red, yellow, cyan # rain: Colour theme. Supported: white (default), green, blue, red, yellow, cyan
#RAIN_DEFAULT_COLOR=white #RAIN_DEFAULT_COLOR=white
# matrix: Falling speed. # matrix: Falling speed.
#MATRIX_DEFAULT_SPEED=3.5 #MATRIX_DEFAULT_SPEED=3.5
# matrix: Colour theme. Supported: green (default), blue, red, yellow, cyan, white # matrix: Colour theme. Supported: green (default), blue, red, yellow, cyan, white
#MATRIX_DEFAULT_COLOR=green #MATRIX_DEFAULT_COLOR=green
# matrix: Character set. Supported: binary (default), kana, ascii # matrix: Character set. Supported: binary (default), kana, ascii
#MATRIX_DEFAULT_CHARSET=binary #MATRIX_DEFAULT_CHARSET=binary
# ============================================================================== # ==============================================================================
[ssh] [ssh]
# ssr: Default SSH options prepended to every ssr call. # ssr: Default SSH options prepended to every ssr call.
# Examples: # Examples:
# SSH_DEFAULT_OPT=-Y # X11 forwarding # SSH_DEFAULT_OPT=-Y # X11 forwarding
# SSH_DEFAULT_OPT=-Y -o StrictHostKeyChecking=accept-new # SSH_DEFAULT_OPT=-Y -o StrictHostKeyChecking=accept-new
# SSH_DEFAULT_OPT= # no default options # SSH_DEFAULT_OPT= # no default options
#SSH_DEFAULT_OPT=-Y #SSH_DEFAULT_OPT=-Y
# ============================================================================== # ==============================================================================
[updates] [updates]
# Git branch used for update checks and profile_upgrade. # Git branch used for update checks and profile_upgrade.
# Changing this causes profile_upgrade to automatically switch the local # Changing this causes profile_upgrade to automatically switch the local
# checkout to the new branch on the next run and display a warning. # checkout to the new branch on the next run and display a warning.
#UPDT_DEFAULT_BRANCH=master #UPDT_DEFAULT_BRANCH=master
# ============================================================================== # ==============================================================================
[general] [general]
# General-purpose section — set any environment variable you need globally. # General-purpose section — set any environment variable you need globally.
# Good place for compilation flags, personal PATH additions, etc. # Good place for compilation flags, personal PATH additions, etc.
#CFLAGS=-O2 -pipe -march=native #CFLAGS=-O2 -pipe -march=native
#CXXFLAGS=$CFLAGS #CXXFLAGS=$CFLAGS
#MAKEFLAGS=-j4 #MAKEFLAGS=-j4
#PKGSOURCES=/usr/local/src #PKGSOURCES=/usr/local/src
# ============================================================================== # ==============================================================================
[aliases] [aliases]
# Command aliases loaded for interactive shells only. # Command aliases loaded for interactive shells only.
# The value is the full command string; the key becomes the alias name. # The value is the full command string; the key becomes the alias name.
# The base command must be executable; if not, the alias is silently skipped. # The base command must be executable; if not, the alias is silently skipped.
# #
# ls # ls
ll=ls -laFh --color=auto ll=ls -laFh --color=auto
la=ls -Ah --color=auto la=ls -Ah --color=auto
l=ls -CF --color=auto l=ls -CF --color=auto
ls=ls --color=auto ls=ls --color=auto
# #
# grep # grep
grep=grep --color=auto grep=grep --color=auto
egrep=egrep --color=auto egrep=egrep --color=auto
fgrep=fgrep --color=auto fgrep=fgrep --color=auto
# #
# disk usage # disk usage
df=df -H df=df -H
du=du -ch du=du -ch
# #
# make shortcuts # make shortcuts
#mk=make #mk=make
#mkin=make install #mkin=make install
# End of profile.conf.example # End of profile.conf.example

View File

@@ -1,121 +1,121 @@
# profile — to-do list # profile — to-do list
Items marked **[easy]**, **[medium]**, or **[hard]** give a rough effort hint. Items marked **[easy]**, **[medium]**, or **[hard]** give a rough effort hint.
Items marked **[breaking]** would change existing behaviour and require a Items marked **[breaking]** would change existing behaviour and require a
version-bump. version-bump.
--- ---
## Shell / compatibility ## Shell / compatibility
- [ ] **ZSH compatibility layer** — most functions work already; the remaining - [ ] **ZSH compatibility layer** — most functions work already; the remaining
blockers are `local -A` (no associative arrays in ZSH without `typeset -A`) blockers are `local -A` (no associative arrays in ZSH without `typeset -A`)
and `local -n` namerefs. A thin compatibility shim would open the project to and `local -n` namerefs. A thin compatibility shim would open the project to
ZSH users. **[hard]** ZSH users. **[hard]**
- [ ] **Bash completion** — add a `profile.d/completion/` directory and write - [ ] **Bash completion** — add a `profile.d/completion/` directory and write
`_profile_upgrade`, `_taz`, `_utaz`, `_meteo`, etc. completions so that `_profile_upgrade`, `_taz`, `_utaz`, `_meteo`, etc. completions so that
`<Tab>` works on all public functions. **[medium]** `<Tab>` works on all public functions. **[medium]**
- [ ] **`shellcheck` clean pass** — run `shellcheck -x profile.sh profile.d/*.sh` - [ ] **`shellcheck` clean pass** — run `shellcheck -x profile.sh profile.d/*.sh`
and address every remaining warning (currently a handful of SC2034 and SC2086 and address every remaining warning (currently a handful of SC2034 and SC2086
items). Integrate as a pre-commit hook. **[easy]** items). Integrate as a pre-commit hook. **[easy]**
--- ---
## Prompt & theming ## Prompt & theming
- [ ] **Git branch in prompt** — show the current branch name (and dirty - [ ] **Git branch in prompt** — show the current branch name (and dirty
indicator) in the PS1 bar when inside a Git repository. Should be indicator) in the PS1 bar when inside a Git repository. Should be
gated behind a `[prompt]` config key so it can be disabled. **[medium]** gated behind a `[prompt]` config key so it can be disabled. **[medium]**
- [ ] **Virtual-env / conda indicator** — detect `$VIRTUAL_ENV` / `$CONDA_DEFAULT_ENV` - [ ] **Virtual-env / conda indicator** — detect `$VIRTUAL_ENV` / `$CONDA_DEFAULT_ENV`
and display the name in the prompt bar. **[easy]** and display the name in the prompt bar. **[easy]**
- [ ] **True-colour terminal auto-detection** — query `$COLORTERM` and - [ ] **True-colour terminal auto-detection** — query `$COLORTERM` and
`$TERM` at load time; automatically fall back from a 24-bit theme to its `$TERM` at load time; automatically fall back from a 24-bit theme to its
16-colour equivalent when the terminal does not support true colour. **[medium]** 16-colour equivalent when the terminal does not support true colour. **[medium]**
- [ ] **True-colour variants of other themes** — create `monokai-tc.theme`, - [ ] **True-colour variants of other themes** — create `monokai-tc.theme`,
`abyss-tc.theme`, etc. using the same `\e[38;2;R;G;Bm` approach as the `abyss-tc.theme`, etc. using the same `\e[38;2;R;G;Bm` approach as the
Solarized themes. **[easy]** _(per theme)_ Solarized themes. **[easy]** _(per theme)_
- [ ] **Theme preview command** — add a `theme_preview` (or `profile_theme`) - [ ] **Theme preview command** — add a `theme_preview` (or `profile_theme`)
function that renders a colour swatch and a sample prompt line for the function that renders a colour swatch and a sample prompt line for the
currently loaded theme, so users can evaluate themes without reloading currently loaded theme, so users can evaluate themes without reloading
the session. **[medium]** the session. **[medium]**
- [ ] **`load_theme` — DEFAULTCOL rebuild** — after overriding `DEFAULTFG` and - [ ] **`load_theme` — DEFAULTCOL rebuild** — after overriding `DEFAULTFG` and
`DEFAULTBG`, automatically recompute `DEFAULTCOL` from the new values instead `DEFAULTBG`, automatically recompute `DEFAULTCOL` from the new values instead
of requiring the theme file to set it explicitly. **[easy]** of requiring the theme file to set it explicitly. **[easy]**
--- ---
## Module improvements ## Module improvements
### compress ### compress
- [ ] **`taz` progress bar** — show a `pv` / `dd`-based progress indicator when - [ ] **`taz` progress bar** — show a `pv` / `dd`-based progress indicator when
compressing large trees, gated behind a `-p` flag. **[medium]** compressing large trees, gated behind a `-p` flag. **[medium]**
- [ ] **`utaz` integrity check** — run `tar -tOf` / `unzip -t` / `7z t` before - [ ] **`utaz` integrity check** — run `tar -tOf` / `unzip -t` / `7z t` before
extracting and abort if the archive is corrupt. **[easy]** extracting and abort if the archive is corrupt. **[easy]**
### filefct ### filefct
- [ ] **`findbig` / `findzero` / `finddead``fd` integration** — optionally - [ ] **`findbig` / `findzero` / `finddead``fd` integration** — optionally
use `fd` instead of `find` when available for faster traversal. **[easy]** use `fd` instead of `find` when available for faster traversal. **[easy]**
- [ ] **`file_stats` — human-readable totals** — add `--human` flag to emit - [ ] **`file_stats` — human-readable totals** — add `--human` flag to emit
sizes in K/M/G instead of bytes. **[easy]** sizes in K/M/G instead of bytes. **[easy]**
### info ### info
- [ ] **`showinfo` fallback** — when neither `neofetch` nor `fastfetch` is - [ ] **`showinfo` fallback** — when neither `neofetch` nor `fastfetch` is
installed, print a minimal sysinfo block (hostname, OS, kernel, uptime, installed, print a minimal sysinfo block (hostname, OS, kernel, uptime,
CPU, RAM) using pure Bash + `/proc`. **[medium]** CPU, RAM) using pure Bash + `/proc`. **[medium]**
### net ### net
- [ ] **`dwl` resume support** — pass `-C -` to curl / `--continue-at -` to - [ ] **`dwl` resume support** — pass `-C -` to curl / `--continue-at -` to
wget for interrupted downloads; gate behind a `-r` flag. **[easy]** wget for interrupted downloads; gate behind a `-r` flag. **[easy]**
- [ ] **`myextip` multiple providers** — fall back to a secondary URL - [ ] **`myextip` multiple providers** — fall back to a secondary URL
(configurable via `MYEXTIP_FALLBACK_URL`) when the primary times out. (configurable via `MYEXTIP_FALLBACK_URL`) when the primary times out.
**[easy]** **[easy]**
### packages ### packages
- [ ] **Additional backends** — add support for `pacman` (Arch), `apk` (Alpine), - [ ] **Additional backends** — add support for `pacman` (Arch), `apk` (Alpine),
`xbps-query` (Void), and `brew` (macOS). **[medium]** `xbps-query` (Void), and `brew` (macOS). **[medium]**
### processes ### processes
- [ ] **`ku` dry-run flag** — add `-n` / `--dry-run` to print what would be - [ ] **`ku` dry-run flag** — add `-n` / `--dry-run` to print what would be
killed without acting. **[easy]** killed without acting. **[easy]**
### pwd ### pwd
- [ ] **`genpwd` passphrase mode** — add `-w` / `--words N` to generate - [ ] **`genpwd` passphrase mode** — add `-w` / `--words N` to generate
word-based passphrases (diceware-style) from `/usr/share/dict/words`. word-based passphrases (diceware-style) from `/usr/share/dict/words`.
**[medium]** **[medium]**
### ssh ### ssh
- [ ] **SSH agent management** — add `ssh_agent_start` / `ssh_agent_stop` helpers - [ ] **SSH agent management** — add `ssh_agent_start` / `ssh_agent_stop` helpers
that start a persistent `ssh-agent`, add configured keys, and survive that start a persistent `ssh-agent`, add configured keys, and survive
re-login via a socket stored in `~/.ssh/agent.env`. **[medium]** re-login via a socket stored in `~/.ssh/agent.env`. **[medium]**
- [ ] **`rmhost` glob support** — allow `rmhost '*.example.com'` to remove all - [ ] **`rmhost` glob support** — allow `rmhost '*.example.com'` to remove all
matching entries in one call. **[easy]** matching entries in one call. **[easy]**
### updates ### updates
- [ ] **Automatic update check age** — store a timestamp in `~/.cache/profile_last_check`; - [ ] **Automatic update check age** — store a timestamp in `~/.cache/profile_last_check`;
skip the network request in `check_updates -q` if the last check was less skip the network request in `check_updates -q` if the last check was less
than `UPDT_CHECK_INTERVAL` hours ago (configurable, default 24). **[medium]** than `UPDT_CHECK_INTERVAL` hours ago (configurable, default 24). **[medium]**
- [ ] **Changelog display** — after a successful `profile_upgrade`, fetch and - [ ] **Changelog display** — after a successful `profile_upgrade`, fetch and
display `CHANGELOG.md` entries newer than the previously installed version. display `CHANGELOG.md` entries newer than the previously installed version.
**[medium]** **[medium]**
--- ---
## Infrastructure ## Infrastructure
- [ ] **Test suite** — add a `test/` directory with `bats` (Bash Automated - [ ] **Test suite** — add a `test/` directory with `bats` (Bash Automated
Testing System) unit tests for pure functions (`expandlist`, `genpwd`, Testing System) unit tests for pure functions (`expandlist`, `genpwd`,
`pwdscore`, `isipv4`, `isipv6`, `parse_conf`, `load_theme`, …). Target for `pwdscore`, `isipv4`, `isipv6`, `parse_conf`, `load_theme`, …). Target for
CI. **[hard]** CI. **[hard]**
- [ ] **CI pipeline** — Gitea Actions (or similar) job that runs `shellcheck` - [ ] **CI pipeline** — Gitea Actions (or similar) job that runs `shellcheck`
and the `bats` suite on every push. **[medium]** and the `bats` suite on every push. **[medium]**
- [ ] **`profile_status` function** — print a diagnostic summary: installed - [ ] **`profile_status` function** — print a diagnostic summary: installed
version, active theme, loaded modules, detected Bash version, interactive / version, active theme, loaded modules, detected Bash version, interactive /
login shell flags, and `profile.conf` path. **[easy]** login shell flags, and `profile.conf` path. **[easy]**
- [ ] **`profile_uninstall` function** — remove the `source` line from - [ ] **`profile_uninstall` function** — remove the `source` line from
`~/.bashrc` / `~/.profile` and optionally delete the install directory, `~/.bashrc` / `~/.profile` and optionally delete the install directory,
with a dry-run mode. **[medium]** with a dry-run mode. **[medium]**
- [ ] **`disp` syslog integration** — add a `DISP_SYSLOG=1` config key that - [ ] **`disp` syslog integration** — add a `DISP_SYSLOG=1` config key that
additionally pipes E/W messages to `logger`. **[easy]** additionally pipes E/W messages to `logger`. **[easy]**
- [ ] **XDG base-dir support** — honour `$XDG_CONFIG_HOME` as an alternative - [ ] **XDG base-dir support** — honour `$XDG_CONFIG_HOME` as an alternative
location for `profile.conf` so users can keep `~` tidy. **[medium]** location for `profile.conf` so users can keep `~` tidy. **[medium]**
**[breaking]** **[breaking]**

View File

@@ -140,9 +140,14 @@ load_theme()
continue continue
fi fi
# Strip surrounding quotes # Strip surrounding quotes (handles inline trailing comments like KEY="val" # note)
_lth_value="${_lth_value#\"}" ; _lth_value="${_lth_value%\"}" if [[ "$_lth_value" == '"'* ]]; then
_lth_value="${_lth_value#\'}" ; _lth_value="${_lth_value%\'}" _lth_value="${_lth_value#\"}"
_lth_value="${_lth_value%%\"*}"
elif [[ "$_lth_value" == "'"* ]]; then
_lth_value="${_lth_value#\'}"
_lth_value="${_lth_value%%\'*}"
fi
if [[ "$_lth_value" =~ $_lth_ref_re ]]; then if [[ "$_lth_value" =~ $_lth_ref_re ]]; then
# Safe colour variable reference — resolve via indirection # Safe colour variable reference — resolve via indirection

View File

@@ -1,42 +1,42 @@
# Abyss prompt theme — deep ocean navy, electric teal, golden accents # Abyss prompt theme — deep ocean navy, electric teal, golden accents
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Inspired by the VS Code "Abyss" theme: deep navy/black backdrop, electric # Inspired by the VS Code "Abyss" theme: deep navy/black backdrop, electric
# teal highlights, golden-yellow accents, cool electric blue for identifiers. # teal highlights, golden-yellow accents, cool electric blue for identifiers.
# Palette overrides shift the cooler hues to their high-intensity (electric) # Palette overrides shift the cooler hues to their high-intensity (electric)
# equivalents — blue becomes IBlue, green shifts toward teal (ICyan). # equivalents — blue becomes IBlue, green shifts toward teal (ICyan).
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Palette overrides — shift colours toward cool electric hues # Palette overrides — shift colours toward cool electric hues
Blue="\e[0;94m" # electric blue (IBlue — abyss identifier colour) Blue="\e[0;94m" # electric blue (IBlue — abyss identifier colour)
Green="\e[0;96m" # teal (ICyan — abyss string colour) Green="\e[0;96m" # teal (ICyan — abyss string colour)
Yellow="\e[0;93m" # bright gold (IYellow — abyss constant colour) Yellow="\e[0;93m" # bright gold (IYellow — abyss constant colour)
PROMPT_COLOR_TIME_FG="$ICyan" # electric teal clock PROMPT_COLOR_TIME_FG="$ICyan" # electric teal clock
PROMPT_COLOR_TIME_BG="$On_Black" # deep black background PROMPT_COLOR_TIME_BG="$On_Black" # deep black background
PROMPT_COLOR_BAR_BG="$On_Blue" # deep blue bar PROMPT_COLOR_BAR_BG="$On_Blue" # deep blue bar
PROMPT_COLOR_OK_FG="$ICyan" # teal on success PROMPT_COLOR_OK_FG="$ICyan" # teal on success
PROMPT_COLOR_OK_MARK="$IGreen" # bright teal-green checkmark PROMPT_COLOR_OK_MARK="$IGreen" # bright teal-green checkmark
PROMPT_COLOR_ERR_BG="$On_Red" # red background on failure PROMPT_COLOR_ERR_BG="$On_Red" # red background on failure
PROMPT_COLOR_ERR_FG="$IWhite" # bright white text PROMPT_COLOR_ERR_FG="$IWhite" # bright white text
PROMPT_COLOR_ERR_MARK="$IYellow" # golden X PROMPT_COLOR_ERR_MARK="$IYellow" # golden X
PROMPT_COLOR_ROOT_FG="$IRed" # red for root PROMPT_COLOR_ROOT_FG="$IRed" # red for root
PROMPT_COLOR_USER_FG="$IBlue" # electric blue for user PROMPT_COLOR_USER_FG="$IBlue" # electric blue for user
PROMPT_COLOR_DIR_FG="$ICyan" # teal path PROMPT_COLOR_DIR_FG="$ICyan" # teal path

View File

@@ -1,42 +1,42 @@
# Adwaita prompt theme — clean GNOME defaults, blue accent, green/red status # Adwaita prompt theme — clean GNOME defaults, blue accent, green/red status
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Follows the GNOME HIG colour intent: a single calm blue accent (#3584e4), # Follows the GNOME HIG colour intent: a single calm blue accent (#3584e4),
# pleasant green for success (#33d17a), clear red for errors (#e01b24). # pleasant green for success (#33d17a), clear red for errors (#e01b24).
# No intense saturation, no heavy remapping — legibility over spectacle. # No intense saturation, no heavy remapping — legibility over spectacle.
# Palette overrides gently shift Blue and Green to their IBlue/IGreen # Palette overrides gently shift Blue and Green to their IBlue/IGreen
# variants to better match Adwaita's brighter, flatter tones. # variants to better match Adwaita's brighter, flatter tones.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Palette overrides — align to Adwaita's brighter accent tones # Palette overrides — align to Adwaita's brighter accent tones
Blue="\e[0;94m" # IBlue → closer to Adwaita blue (#3584e4) Blue="\e[0;94m" # IBlue → closer to Adwaita blue (#3584e4)
Green="\e[0;92m" # IGreen → closer to Adwaita green (#33d17a) Green="\e[0;92m" # IGreen → closer to Adwaita green (#33d17a)
PROMPT_COLOR_TIME_FG="$Cyan" # calm cyan clock text PROMPT_COLOR_TIME_FG="$Cyan" # calm cyan clock text
PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background
PROMPT_COLOR_BAR_BG="$On_Blue" # blue main bar (Adwaita accent) PROMPT_COLOR_BAR_BG="$On_Blue" # blue main bar (Adwaita accent)
PROMPT_COLOR_OK_FG="$White" # clean white on success PROMPT_COLOR_OK_FG="$White" # clean white on success
PROMPT_COLOR_OK_MARK="$Green" # Adwaita green checkmark PROMPT_COLOR_OK_MARK="$Green" # Adwaita green checkmark
PROMPT_COLOR_ERR_BG="$On_Red" # Adwaita red on failure PROMPT_COLOR_ERR_BG="$On_Red" # Adwaita red on failure
PROMPT_COLOR_ERR_FG="$White" # white text PROMPT_COLOR_ERR_FG="$White" # white text
PROMPT_COLOR_ERR_MARK="$Yellow" # yellow X (warning intent) PROMPT_COLOR_ERR_MARK="$Yellow" # yellow X (warning intent)
PROMPT_COLOR_ROOT_FG="$Red" # Adwaita red for root PROMPT_COLOR_ROOT_FG="$Red" # Adwaita red for root
PROMPT_COLOR_USER_FG="$IBlue" # Adwaita blue for user PROMPT_COLOR_USER_FG="$IBlue" # Adwaita blue for user
PROMPT_COLOR_DIR_FG="$IGreen" # Adwaita green for path PROMPT_COLOR_DIR_FG="$IGreen" # Adwaita green for path

View File

@@ -1,32 +1,32 @@
# Dark prompt theme — dark grey bar, cyan user, magenta path # Dark prompt theme — dark grey bar, cyan user, magenta path
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
PROMPT_COLOR_TIME_FG="$ICyan" # Clock text PROMPT_COLOR_TIME_FG="$ICyan" # Clock text
PROMPT_COLOR_TIME_BG="$On_Black" # Clock background (black) PROMPT_COLOR_TIME_BG="$On_Black" # Clock background (black)
PROMPT_COLOR_BAR_BG="$On_IBlack" # Main bar background (dark grey) PROMPT_COLOR_BAR_BG="$On_IBlack" # Main bar background (dark grey)
PROMPT_COLOR_OK_FG="$IGreen" # Exit-code text on success PROMPT_COLOR_OK_FG="$IGreen" # Exit-code text on success
PROMPT_COLOR_OK_MARK="$BGreen" # Checkmark colour on success PROMPT_COLOR_OK_MARK="$BGreen" # Checkmark colour on success
PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure
PROMPT_COLOR_ERR_FG="$BIWhite" # Exit-code text on failure PROMPT_COLOR_ERR_FG="$BIWhite" # Exit-code text on failure
PROMPT_COLOR_ERR_MARK="$BIYellow" # X mark colour on failure PROMPT_COLOR_ERR_MARK="$BIYellow" # X mark colour on failure
PROMPT_COLOR_ROOT_FG="$BIRed" # Username colour when root PROMPT_COLOR_ROOT_FG="$BIRed" # Username colour when root
PROMPT_COLOR_USER_FG="$ICyan" # Username@host colour for normal users PROMPT_COLOR_USER_FG="$ICyan" # Username@host colour for normal users
PROMPT_COLOR_DIR_FG="$IPurple" # Working directory colour PROMPT_COLOR_DIR_FG="$IPurple" # Working directory colour

View File

@@ -1,32 +1,32 @@
# Default prompt theme — blue bar, green user, cyan path # Default prompt theme — blue bar, green user, cyan path
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
PROMPT_COLOR_TIME_FG="$Blue" # Clock text PROMPT_COLOR_TIME_FG="$Blue" # Clock text
PROMPT_COLOR_TIME_BG="$On_IBlack" # Clock background (dark grey) PROMPT_COLOR_TIME_BG="$On_IBlack" # Clock background (dark grey)
PROMPT_COLOR_BAR_BG="$On_Blue" # Main bar background PROMPT_COLOR_BAR_BG="$On_Blue" # Main bar background
PROMPT_COLOR_OK_FG="$White" # Exit-code text on success PROMPT_COLOR_OK_FG="$White" # Exit-code text on success
PROMPT_COLOR_OK_MARK="$Green" # Checkmark colour on success PROMPT_COLOR_OK_MARK="$Green" # Checkmark colour on success
PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure
PROMPT_COLOR_ERR_FG="$White" # Exit-code text on failure PROMPT_COLOR_ERR_FG="$White" # Exit-code text on failure
PROMPT_COLOR_ERR_MARK="$BYellow" # X mark colour on failure PROMPT_COLOR_ERR_MARK="$BYellow" # X mark colour on failure
PROMPT_COLOR_ROOT_FG="$Red" # Username colour when root PROMPT_COLOR_ROOT_FG="$Red" # Username colour when root
PROMPT_COLOR_USER_FG="$Green" # Username@host colour for normal users PROMPT_COLOR_USER_FG="$Green" # Username@host colour for normal users
PROMPT_COLOR_DIR_FG="$ICyan" # Working directory colour PROMPT_COLOR_DIR_FG="$ICyan" # Working directory colour

View File

@@ -1,35 +1,35 @@
# Light prompt theme — white bar, blue user, purple path # Light prompt theme — white bar, blue user, purple path
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Opposite of dark.theme: backgrounds flip to bright whites, foregrounds # Opposite of dark.theme: backgrounds flip to bright whites, foregrounds
# shift to their dark/regular equivalents for contrast on a light terminal. # shift to their dark/regular equivalents for contrast on a light terminal.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
PROMPT_COLOR_TIME_FG="$Blue" # Clock text (ICyan → Blue, darker for light bg) PROMPT_COLOR_TIME_FG="$Blue" # Clock text (ICyan → Blue, darker for light bg)
PROMPT_COLOR_TIME_BG="$On_IWhite" # Clock background (On_Black → On_IWhite) PROMPT_COLOR_TIME_BG="$On_IWhite" # Clock background (On_Black → On_IWhite)
PROMPT_COLOR_BAR_BG="$On_White" # Main bar background (On_IBlack → On_White) PROMPT_COLOR_BAR_BG="$On_White" # Main bar background (On_IBlack → On_White)
PROMPT_COLOR_OK_FG="$Green" # Exit-code text on success (IGreen → Green) PROMPT_COLOR_OK_FG="$Green" # Exit-code text on success (IGreen → Green)
PROMPT_COLOR_OK_MARK="$BGreen" # Checkmark colour on success (unchanged — bold green reads on both) PROMPT_COLOR_OK_MARK="$BGreen" # Checkmark colour on success (unchanged — bold green reads on both)
PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure (unchanged) PROMPT_COLOR_ERR_BG="$On_Red" # Exit-code background on failure (unchanged)
PROMPT_COLOR_ERR_FG="$BIWhite" # Exit-code text on failure (unchanged — white on red works on both) PROMPT_COLOR_ERR_FG="$BIWhite" # Exit-code text on failure (unchanged — white on red works on both)
PROMPT_COLOR_ERR_MARK="$BYellow" # X mark on failure (BIYellow → BYellow, less glaring on light) PROMPT_COLOR_ERR_MARK="$BYellow" # X mark on failure (BIYellow → BYellow, less glaring on light)
PROMPT_COLOR_ROOT_FG="$Red" # Username when root (BIRed → Red) PROMPT_COLOR_ROOT_FG="$Red" # Username when root (BIRed → Red)
PROMPT_COLOR_USER_FG="$Blue" # Username@host normal user (ICyan → Blue) PROMPT_COLOR_USER_FG="$Blue" # Username@host normal user (ICyan → Blue)
PROMPT_COLOR_DIR_FG="$Purple" # Working directory (IPurple → Purple) PROMPT_COLOR_DIR_FG="$Purple" # Working directory (IPurple → Purple)

View File

@@ -1,64 +1,64 @@
# Monochrome prompt theme — strict greyscale, no hue at all # Monochrome prompt theme — strict greyscale, no hue at all
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# All hues are silenced — colour variables are remapped to greyscale ANSI # All hues are silenced — colour variables are remapped to greyscale ANSI
# codes so that ls, man, grep, etc. also lose their colour cues. Contrast # codes so that ls, man, grep, etc. also lose their colour cues. Contrast
# is achieved entirely through brightness: dark grey / light grey / white. # is achieved entirely through brightness: dark grey / light grey / white.
# Error state uses an inverted (white background, black text) bar so it # Error state uses an inverted (white background, black text) bar so it
# remains visually distinct without relying on red. # remains visually distinct without relying on red.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Palette overrides — replace every hue with a grey equivalent # Palette overrides — replace every hue with a grey equivalent
Red="\e[0;37m" # light grey Red="\e[0;37m" # light grey
Green="\e[0;97m" # bright white (success intent kept as brightest) Green="\e[0;97m" # bright white (success intent kept as brightest)
Yellow="\e[0;90m" # dark grey Yellow="\e[0;90m" # dark grey
Blue="\e[0;90m" # dark grey Blue="\e[0;90m" # dark grey
Purple="\e[0;37m" # light grey Purple="\e[0;37m" # light grey
Cyan="\e[0;37m" # light grey Cyan="\e[0;37m" # light grey
BRed="\e[1;37m" # bold light grey BRed="\e[1;37m" # bold light grey
BGreen="\e[1;97m" # bold bright white BGreen="\e[1;97m" # bold bright white
BYellow="\e[1;90m" # bold dark grey BYellow="\e[1;90m" # bold dark grey
BBlue="\e[1;90m" # bold dark grey BBlue="\e[1;90m" # bold dark grey
BPurple="\e[1;37m" # bold light grey BPurple="\e[1;37m" # bold light grey
BCyan="\e[1;37m" # bold light grey BCyan="\e[1;37m" # bold light grey
IRed="\e[0;97m" # bright white IRed="\e[0;97m" # bright white
IGreen="\e[0;97m" # bright white IGreen="\e[0;97m" # bright white
IYellow="\e[0;90m" # dark grey IYellow="\e[0;90m" # dark grey
IBlue="\e[0;90m" # dark grey IBlue="\e[0;90m" # dark grey
IPurple="\e[0;37m" # light grey IPurple="\e[0;37m" # light grey
ICyan="\e[0;37m" # light grey ICyan="\e[0;37m" # light grey
BIRed="\e[1;97m" # bold bright white BIRed="\e[1;97m" # bold bright white
BIGreen="\e[1;97m" # bold bright white BIGreen="\e[1;97m" # bold bright white
BIYellow="\e[1;90m" # bold dark grey BIYellow="\e[1;90m" # bold dark grey
BIBlue="\e[1;90m" # bold dark grey BIBlue="\e[1;90m" # bold dark grey
BIPurple="\e[1;37m" # bold light grey BIPurple="\e[1;37m" # bold light grey
BICyan="\e[1;37m" # bold light grey BICyan="\e[1;37m" # bold light grey
PROMPT_COLOR_TIME_FG="$IBlack" # dark grey clock text (subtle) PROMPT_COLOR_TIME_FG="$IBlack" # dark grey clock text (subtle)
PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background
PROMPT_COLOR_BAR_BG="$On_IBlack" # dark grey main bar PROMPT_COLOR_BAR_BG="$On_IBlack" # dark grey main bar
PROMPT_COLOR_OK_FG="$IWhite" # bright white on success PROMPT_COLOR_OK_FG="$IWhite" # bright white on success
PROMPT_COLOR_OK_MARK="$BIWhite" # bold bright white checkmark PROMPT_COLOR_OK_MARK="$BIWhite" # bold bright white checkmark
PROMPT_COLOR_ERR_BG="$On_White" # inverted: bright white bar on error PROMPT_COLOR_ERR_BG="$On_White" # inverted: bright white bar on error
PROMPT_COLOR_ERR_FG="$Black" # black text on white background PROMPT_COLOR_ERR_FG="$Black" # black text on white background
PROMPT_COLOR_ERR_MARK="$BBlack" # bold black X PROMPT_COLOR_ERR_MARK="$BBlack" # bold black X
PROMPT_COLOR_ROOT_FG="$BIWhite" # bold bright white for root warning PROMPT_COLOR_ROOT_FG="$BIWhite" # bold bright white for root warning
PROMPT_COLOR_USER_FG="$IWhite" # bright white for normal user PROMPT_COLOR_USER_FG="$IWhite" # bright white for normal user
PROMPT_COLOR_DIR_FG="$White" # standard white for path PROMPT_COLOR_DIR_FG="$White" # standard white for path

View File

@@ -1,45 +1,45 @@
# Monokai prompt theme — high-saturation, vivid hues on near-black # Monokai prompt theme — high-saturation, vivid hues on near-black
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Monokai's signature: lime green, orange-yellow, hot pink/red, bright violet, # Monokai's signature: lime green, orange-yellow, hot pink/red, bright violet,
# electric cyan — all on a near-black (#272822) background. # electric cyan — all on a near-black (#272822) background.
# Palette overrides remap the dim ANSI regulars to their vivid high-intensity # Palette overrides remap the dim ANSI regulars to their vivid high-intensity
# equivalents so that ls, grep colour output, etc. also look more "Monokai". # equivalents so that ls, grep colour output, etc. also look more "Monokai".
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Palette overrides — boost regular colours to Monokai-vivid equivalents # Palette overrides — boost regular colours to Monokai-vivid equivalents
Red="\e[0;91m" # hot pink/red (#F92672) Red="\e[0;91m" # hot pink/red (#F92672)
Green="\e[0;92m" # lime green (#A6E22E) Green="\e[0;92m" # lime green (#A6E22E)
Yellow="\e[0;93m" # orange-yellow (#E6DB74 / #FD971F) Yellow="\e[0;93m" # orange-yellow (#E6DB74 / #FD971F)
Blue="\e[0;94m" # electric blue (#66D9E8 → shift blue) Blue="\e[0;94m" # electric blue (#66D9E8 → shift blue)
Purple="\e[0;95m" # bright violet (#AE81FF) Purple="\e[0;95m" # bright violet (#AE81FF)
Cyan="\e[0;96m" # electric cyan (#66D9E8) Cyan="\e[0;96m" # electric cyan (#66D9E8)
PROMPT_COLOR_TIME_FG="$IYellow" # orange clock text PROMPT_COLOR_TIME_FG="$IYellow" # orange clock text
PROMPT_COLOR_TIME_BG="$On_IBlack" # near-black Monokai background PROMPT_COLOR_TIME_BG="$On_IBlack" # near-black Monokai background
PROMPT_COLOR_BAR_BG="$On_IBlack" # flat dark bar PROMPT_COLOR_BAR_BG="$On_IBlack" # flat dark bar
PROMPT_COLOR_OK_FG="$IGreen" # lime green on success PROMPT_COLOR_OK_FG="$IGreen" # lime green on success
PROMPT_COLOR_OK_MARK="$IGreen" # lime green checkmark PROMPT_COLOR_OK_MARK="$IGreen" # lime green checkmark
PROMPT_COLOR_ERR_BG="$On_IBlack" # keep dark — use colour for contrast PROMPT_COLOR_ERR_BG="$On_IBlack" # keep dark — use colour for contrast
PROMPT_COLOR_ERR_FG="$IRed" # hot pink on failure PROMPT_COLOR_ERR_FG="$IRed" # hot pink on failure
PROMPT_COLOR_ERR_MARK="$IRed" # hot pink X PROMPT_COLOR_ERR_MARK="$IRed" # hot pink X
PROMPT_COLOR_ROOT_FG="$IRed" # hot pink for root PROMPT_COLOR_ROOT_FG="$IRed" # hot pink for root
PROMPT_COLOR_USER_FG="$IYellow" # orange-yellow for user PROMPT_COLOR_USER_FG="$IYellow" # orange-yellow for user
PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan for path PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan for path

View File

@@ -1,42 +1,42 @@
# Plasma prompt theme — vivid KDE Plasma purples and electric cyan # Plasma prompt theme — vivid KDE Plasma purples and electric cyan
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Captures the charged, vivid energy of KDE Plasma: dominant bright magenta/ # Captures the charged, vivid energy of KDE Plasma: dominant bright magenta/
# purple, electric cyan highlights, all on a dark background. Palette overrides # purple, electric cyan highlights, all on a dark background. Palette overrides
# boost Blue, Purple, and Cyan to their high-intensity equivalents so that # boost Blue, Purple, and Cyan to their high-intensity equivalents so that
# shell colour output reflects the same vivid palette. # shell colour output reflects the same vivid palette.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Palette overrides — vivid charged hues # Palette overrides — vivid charged hues
Blue="\e[0;94m" # electric blue (IBlue) Blue="\e[0;94m" # electric blue (IBlue)
Purple="\e[0;95m" # vivid magenta (IPurple — Plasma's signature colour) Purple="\e[0;95m" # vivid magenta (IPurple — Plasma's signature colour)
Cyan="\e[0;96m" # electric cyan (ICyan) Cyan="\e[0;96m" # electric cyan (ICyan)
PROMPT_COLOR_TIME_FG="$IPurple" # vivid purple clock text PROMPT_COLOR_TIME_FG="$IPurple" # vivid purple clock text
PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey background PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey background
PROMPT_COLOR_BAR_BG="$On_Purple" # bright magenta bar PROMPT_COLOR_BAR_BG="$On_Purple" # bright magenta bar
PROMPT_COLOR_OK_FG="$ICyan" # electric cyan on success PROMPT_COLOR_OK_FG="$ICyan" # electric cyan on success
PROMPT_COLOR_OK_MARK="$IGreen" # green checkmark PROMPT_COLOR_OK_MARK="$IGreen" # green checkmark
PROMPT_COLOR_ERR_BG="$On_Red" # red bar on failure PROMPT_COLOR_ERR_BG="$On_Red" # red bar on failure
PROMPT_COLOR_ERR_FG="$IWhite" # bright white text PROMPT_COLOR_ERR_FG="$IWhite" # bright white text
PROMPT_COLOR_ERR_MARK="$IYellow" # yellow X PROMPT_COLOR_ERR_MARK="$IYellow" # yellow X
PROMPT_COLOR_ROOT_FG="$IRed" # red for root PROMPT_COLOR_ROOT_FG="$IRed" # red for root
PROMPT_COLOR_USER_FG="$BIPurple" # bold vivid purple for user PROMPT_COLOR_USER_FG="$BIPurple" # bold vivid purple for user
PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan path PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan path

View File

@@ -1,127 +1,127 @@
# Solarized Light prompt theme — exact 24-bit / true-colour palette # Solarized Light prompt theme — exact 24-bit / true-colour palette
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Requires a terminal with true-colour / 24-bit support. # Requires a terminal with true-colour / 24-bit support.
# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' # Check with: printf '\e[38;2;220;50;47mred\e[0m\n'
# If you see solid red text, your terminal supports this theme. # If you see solid red text, your terminal supports this theme.
# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) # (konsole, iTerm2, kitty, alacritty, Windows Terminal all do)
# #
# Solarized Light base tones (inverted vs Dark): # Solarized Light base tones (inverted vs Dark):
# Base3 #fdf6e3 →253 246 227 (main background — lightest) # Base3 #fdf6e3 →253 246 227 (main background — lightest)
# Base2 #eee8d5 →238 232 213 (background highlights) # Base2 #eee8d5 →238 232 213 (background highlights)
# Base1 #93a1a1 →147 161 161 (comments / secondary content) # Base1 #93a1a1 →147 161 161 (comments / secondary content)
# Base0 #839496 →131 148 150 (body text — secondary) # Base0 #839496 →131 148 150 (body text — secondary)
# Base00 #657b83 →101 123 131 (body text — main on light bg) # Base00 #657b83 →101 123 131 (body text — main on light bg)
# Base01 #586e75 → 88 110 117 (emphasis) # Base01 #586e75 → 88 110 117 (emphasis)
# Base02 #073642 → 7 54 66 (darkest — used for strong contrast) # Base02 #073642 → 7 54 66 (darkest — used for strong contrast)
# #
# Accent colours are identical to Solarized Dark: # Accent colours are identical to Solarized Dark:
# Yellow #b58900 →181 137 0 # Yellow #b58900 →181 137 0
# Orange #cb4b16 →203 75 22 # Orange #cb4b16 →203 75 22
# Red #dc322f →220 50 47 # Red #dc322f →220 50 47
# Magenta #d33682 →211 54 130 # Magenta #d33682 →211 54 130
# Violet #6c71c4 →108 113 196 # Violet #6c71c4 →108 113 196
# Blue #268bd2 → 38 139 210 # Blue #268bd2 → 38 139 210
# Cyan #2aa198 → 42 161 152 # Cyan #2aa198 → 42 161 152
# Green #859900 →133 153 0 # Green #859900 →133 153 0
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ---- Foreground palette overrides ------------------------------------------- # ---- Foreground palette overrides -------------------------------------------
# The accent fg colours are identical to Dark — only the base/neutral roles flip. # The accent fg colours are identical to Dark — only the base/neutral roles flip.
# Regular # Regular
Black="\e[38;2;253;246;227m" # Base3 — lightest (fg on light bg = invisible; used as bg fg pair complement) Black="\e[38;2;253;246;227m" # Base3 — lightest (fg on light bg = invisible; used as bg fg pair complement)
Red="\e[38;2;220;50;47m" # Red Red="\e[38;2;220;50;47m" # Red
Green="\e[38;2;133;153;0m" # Green Green="\e[38;2;133;153;0m" # Green
Yellow="\e[38;2;181;137;0m" # Yellow — primary accent Yellow="\e[38;2;181;137;0m" # Yellow — primary accent
Blue="\e[38;2;38;139;210m" # Blue Blue="\e[38;2;38;139;210m" # Blue
Purple="\e[38;2;211;54;130m" # Magenta Purple="\e[38;2;211;54;130m" # Magenta
Cyan="\e[38;2;42;161;152m" # Cyan Cyan="\e[38;2;42;161;152m" # Cyan
White="\e[38;2;101;123;131m" # Base00 — main body text on light bg White="\e[38;2;101;123;131m" # Base00 — main body text on light bg
# Bold # Bold
BBlack="\e[1;38;2;238;232;213m" # Base2 bold BBlack="\e[1;38;2;238;232;213m" # Base2 bold
BRed="\e[1;38;2;220;50;47m" # Red bold BRed="\e[1;38;2;220;50;47m" # Red bold
BGreen="\e[1;38;2;133;153;0m" # Green bold BGreen="\e[1;38;2;133;153;0m" # Green bold
BYellow="\e[1;38;2;181;137;0m" # Yellow bold BYellow="\e[1;38;2;181;137;0m" # Yellow bold
BBlue="\e[1;38;2;38;139;210m" # Blue bold BBlue="\e[1;38;2;38;139;210m" # Blue bold
BPurple="\e[1;38;2;211;54;130m" # Magenta bold BPurple="\e[1;38;2;211;54;130m" # Magenta bold
BCyan="\e[1;38;2;42;161;152m" # Cyan bold BCyan="\e[1;38;2;42;161;152m" # Cyan bold
BWhite="\e[1;38;2;88;110;117m" # Base01 bold — emphasis text BWhite="\e[1;38;2;88;110;117m" # Base01 bold — emphasis text
# High intensity (emphasis / I* family) # High intensity (emphasis / I* family)
IBlack="\e[38;2;147;161;161m" # Base1 — secondary/comments IBlack="\e[38;2;147;161;161m" # Base1 — secondary/comments
IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red"
IGreen="\e[38;2;133;153;0m" # Green (no brighter variant) IGreen="\e[38;2;133;153;0m" # Green (no brighter variant)
IYellow="\e[38;2;181;137;0m" # Yellow (no brighter variant) IYellow="\e[38;2;181;137;0m" # Yellow (no brighter variant)
IBlue="\e[38;2;108;113;196m" # Violet — Solarized's "bright blue" IBlue="\e[38;2;108;113;196m" # Violet — Solarized's "bright blue"
IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant)
ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant)
IWhite="\e[38;2;88;110;117m" # Base01 — emphasis IWhite="\e[38;2;88;110;117m" # Base01 — emphasis
# Bold high intensity # Bold high intensity
BIBlack="\e[1;38;2;147;161;161m" # Base1 bold BIBlack="\e[1;38;2;147;161;161m" # Base1 bold
BIRed="\e[1;38;2;203;75;22m" # Orange bold BIRed="\e[1;38;2;203;75;22m" # Orange bold
BIGreen="\e[1;38;2;133;153;0m" # Green bold BIGreen="\e[1;38;2;133;153;0m" # Green bold
BIYellow="\e[1;38;2;181;137;0m" # Yellow bold BIYellow="\e[1;38;2;181;137;0m" # Yellow bold
BIBlue="\e[1;38;2;108;113;196m" # Violet bold BIBlue="\e[1;38;2;108;113;196m" # Violet bold
BIPurple="\e[1;38;2;211;54;130m" # Magenta bold BIPurple="\e[1;38;2;211;54;130m" # Magenta bold
BICyan="\e[1;38;2;42;161;152m" # Cyan bold BICyan="\e[1;38;2;42;161;152m" # Cyan bold
BIWhite="\e[1;38;2;88;110;117m" # Base01 bold BIWhite="\e[1;38;2;88;110;117m" # Base01 bold
# ---- Background palette overrides ------------------------------------------- # ---- Background palette overrides -------------------------------------------
# Light bases flip: On_Black → Base3 (lightest), On_IBlack → Base2 (highlights) # Light bases flip: On_Black → Base3 (lightest), On_IBlack → Base2 (highlights)
On_Black="\e[48;2;253;246;227m" # Base3 — main light background On_Black="\e[48;2;253;246;227m" # Base3 — main light background
On_Red="\e[48;2;220;50;47m" # Red On_Red="\e[48;2;220;50;47m" # Red
On_Green="\e[48;2;133;153;0m" # Green On_Green="\e[48;2;133;153;0m" # Green
On_Yellow="\e[48;2;181;137;0m" # Yellow On_Yellow="\e[48;2;181;137;0m" # Yellow
On_Blue="\e[48;2;38;139;210m" # Blue On_Blue="\e[48;2;38;139;210m" # Blue
On_Purple="\e[48;2;211;54;130m" # Magenta On_Purple="\e[48;2;211;54;130m" # Magenta
On_Cyan="\e[48;2;42;161;152m" # Cyan On_Cyan="\e[48;2;42;161;152m" # Cyan
On_White="\e[48;2;101;123;131m" # Base00 On_White="\e[48;2;101;123;131m" # Base00
On_IBlack="\e[48;2;238;232;213m" # Base2 — background highlights (slightly darker than Base3) On_IBlack="\e[48;2;238;232;213m" # Base2 — background highlights (slightly darker than Base3)
On_IRed="\e[48;2;203;75;22m" # Orange On_IRed="\e[48;2;203;75;22m" # Orange
On_IGreen="\e[48;2;133;153;0m" # Green On_IGreen="\e[48;2;133;153;0m" # Green
On_IYellow="\e[48;2;181;137;0m" # Yellow On_IYellow="\e[48;2;181;137;0m" # Yellow
On_IBlue="\e[48;2;108;113;196m" # Violet On_IBlue="\e[48;2;108;113;196m" # Violet
On_IPurple="\e[48;2;211;54;130m" # Magenta On_IPurple="\e[48;2;211;54;130m" # Magenta
On_ICyan="\e[48;2;42;161;152m" # Cyan On_ICyan="\e[48;2;42;161;152m" # Cyan
On_IWhite="\e[48;2;88;110;117m" # Base01 On_IWhite="\e[48;2;88;110;117m" # Base01
# ---- Special codes ---------------------------------------------------------- # ---- Special codes ----------------------------------------------------------
DEFAULTFG="\e[38;2;101;123;131m" # Base00 — default foreground on light bg DEFAULTFG="\e[38;2;101;123;131m" # Base00 — default foreground on light bg
DEFAULTBG="\e[48;2;253;246;227m" # Base3 — default background DEFAULTBG="\e[48;2;253;246;227m" # Base3 — default background
RESETCOL="\e[0m" RESETCOL="\e[0m"
# ---- Prompt colour slots ---------------------------------------------------- # ---- Prompt colour slots ----------------------------------------------------
# All specified as direct ANSI sequences to avoid ordering dependencies # All specified as direct ANSI sequences to avoid ordering dependencies
# with the palette overrides above. # with the palette overrides above.
PROMPT_COLOR_TIME_FG="\e[38;2;181;137;0m" # Yellow — primary accent PROMPT_COLOR_TIME_FG="\e[38;2;181;137;0m" # Yellow — primary accent
PROMPT_COLOR_TIME_BG="\e[48;2;238;232;213m" # Base2 — slightly darker than bg PROMPT_COLOR_TIME_BG="\e[48;2;238;232;213m" # Base2 — slightly darker than bg
PROMPT_COLOR_BAR_BG="\e[48;2;238;232;213m" # Base2 — warm light bar PROMPT_COLOR_BAR_BG="\e[48;2;238;232;213m" # Base2 — warm light bar
PROMPT_COLOR_OK_FG="\e[38;2;7;54;66m" # Base02 — dark text for contrast on light PROMPT_COLOR_OK_FG="\e[38;2;7;54;66m" # Base02 — dark text for contrast on light
PROMPT_COLOR_OK_MARK="\e[38;2;133;153;0m" # Green — checkmark PROMPT_COLOR_OK_MARK="\e[38;2;133;153;0m" # Green — checkmark
PROMPT_COLOR_ERR_BG="\e[48;2;220;50;47m" # Red — error background PROMPT_COLOR_ERR_BG="\e[48;2;220;50;47m" # Red — error background
PROMPT_COLOR_ERR_FG="\e[38;2;253;246;227m" # Base3 — light text on red PROMPT_COLOR_ERR_FG="\e[38;2;253;246;227m" # Base3 — light text on red
PROMPT_COLOR_ERR_MARK="\e[38;2;253;246;227m" # Base3 — X mark (bright on red) PROMPT_COLOR_ERR_MARK="\e[38;2;253;246;227m" # Base3 — X mark (bright on red)
PROMPT_COLOR_ROOT_FG="\e[38;2;220;50;47m" # Red — root warning PROMPT_COLOR_ROOT_FG="\e[38;2;220;50;47m" # Red — root warning
PROMPT_COLOR_USER_FG="\e[38;2;42;161;152m" # Cyan — normal user PROMPT_COLOR_USER_FG="\e[38;2;42;161;152m" # Cyan — normal user
PROMPT_COLOR_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory PROMPT_COLOR_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory

View File

@@ -1,122 +1,122 @@
# Solarized Dark prompt theme — exact 24-bit / true-colour palette # Solarized Dark prompt theme — exact 24-bit / true-colour palette
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Theme files are NOT executed as shell scripts. load_theme() parses them # Theme files are NOT executed as shell scripts. load_theme() parses them
# line by line. Only the following value forms are accepted: # line by line. Only the following value forms are accepted:
# #
# KEY="$ColorVarName" — reference to a colour variable from disp.sh # KEY="$ColorVarName" — reference to a colour variable from disp.sh
# KEY="${ColorVarName}" — same with braces # KEY="${ColorVarName}" — same with braces
# KEY="\e[...m" — raw ANSI escape sequence (single block) # KEY="\e[...m" — raw ANSI escape sequence (single block)
# #
# Accepted keys: # Accepted keys:
# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) # PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt])
# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette # Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette
# from disp.sh for the whole shell session) # from disp.sh for the whole shell session)
# #
# Any unknown key, unsafe value, or shell construct will be ignored with a # Any unknown key, unsafe value, or shell construct will be ignored with a
# warning — theme files cannot execute code. # warning — theme files cannot execute code.
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# Requires a terminal with true-colour / 24-bit support. # Requires a terminal with true-colour / 24-bit support.
# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' # Check with: printf '\e[38;2;220;50;47mred\e[0m\n'
# If you see solid red text, your terminal supports this theme. # If you see solid red text, your terminal supports this theme.
# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) # (konsole, iTerm2, kitty, alacritty, Windows Terminal all do)
# #
# Solarized Dark exact hex → RGB mapping used below: # Solarized Dark exact hex → RGB mapping used below:
# Base03 #002b36 → 0 43 54 (darkest background) # Base03 #002b36 → 0 43 54 (darkest background)
# Base02 #073642 → 7 54 66 (background highlights) # Base02 #073642 → 7 54 66 (background highlights)
# Base01 #586e75 → 88 110 117 (comments / secondary content) # Base01 #586e75 → 88 110 117 (comments / secondary content)
# Base00 #657b83 →101 123 131 (body text — dark background) # Base00 #657b83 →101 123 131 (body text — dark background)
# Base0 #839496 →131 148 150 (body text — main) # Base0 #839496 →131 148 150 (body text — main)
# Base1 #93a1a1 →147 161 161 (optional emphasis) # Base1 #93a1a1 →147 161 161 (optional emphasis)
# Yellow #b58900 →181 137 0 # Yellow #b58900 →181 137 0
# Orange #cb4b16 →203 75 22 # Orange #cb4b16 →203 75 22
# Red #dc322f →220 50 47 # Red #dc322f →220 50 47
# Magenta #d33682 →211 54 130 # Magenta #d33682 →211 54 130
# Violet #6c71c4 →108 113 196 # Violet #6c71c4 →108 113 196
# Blue #268bd2 → 38 139 210 # Blue #268bd2 → 38 139 210
# Cyan #2aa198 → 42 161 152 # Cyan #2aa198 → 42 161 152
# Green #859900 →133 153 0 # Green #859900 →133 153 0
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# ---- Foreground palette overrides ------------------------------------------- # ---- Foreground palette overrides -------------------------------------------
# Regular # Regular
Black="\e[38;2;0;43;54m" # Base03 — darkest content fg Black="\e[38;2;0;43;54m" # Base03 — darkest content fg
Red="\e[38;2;220;50;47m" # Red Red="\e[38;2;220;50;47m" # Red
Green="\e[38;2;133;153;0m" # Green Green="\e[38;2;133;153;0m" # Green
Yellow="\e[38;2;181;137;0m" # Yellow — primary accent Yellow="\e[38;2;181;137;0m" # Yellow — primary accent
Blue="\e[38;2;38;139;210m" # Blue Blue="\e[38;2;38;139;210m" # Blue
Purple="\e[38;2;211;54;130m" # Magenta Purple="\e[38;2;211;54;130m" # Magenta
Cyan="\e[38;2;42;161;152m" # Cyan Cyan="\e[38;2;42;161;152m" # Cyan
White="\e[38;2;131;148;150m" # Base0 — body text White="\e[38;2;131;148;150m" # Base0 — body text
# Bold # Bold
BBlack="\e[1;38;2;7;54;66m" # Base02 bold BBlack="\e[1;38;2;7;54;66m" # Base02 bold
BRed="\e[1;38;2;220;50;47m" # Red bold BRed="\e[1;38;2;220;50;47m" # Red bold
BGreen="\e[1;38;2;133;153;0m" # Green bold BGreen="\e[1;38;2;133;153;0m" # Green bold
BYellow="\e[1;38;2;181;137;0m" # Yellow bold BYellow="\e[1;38;2;181;137;0m" # Yellow bold
BBlue="\e[1;38;2;38;139;210m" # Blue bold BBlue="\e[1;38;2;38;139;210m" # Blue bold
BPurple="\e[1;38;2;211;54;130m" # Magenta bold BPurple="\e[1;38;2;211;54;130m" # Magenta bold
BCyan="\e[1;38;2;42;161;152m" # Cyan bold BCyan="\e[1;38;2;42;161;152m" # Cyan bold
BWhite="\e[1;38;2;147;161;161m" # Base1 bold BWhite="\e[1;38;2;147;161;161m" # Base1 bold
# High intensity (brighter / emphasis roles in Solarized) # High intensity (brighter / emphasis roles in Solarized)
IBlack="\e[38;2;88;110;117m" # Base01 — secondary/comments IBlack="\e[38;2;88;110;117m" # Base01 — secondary/comments
IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red"
IGreen="\e[38;2;133;153;0m" # Green (no brighter variant) IGreen="\e[38;2;133;153;0m" # Green (no brighter variant)
IYellow="\e[38;2;181;137;0m" # Yellow (no brighter variant) IYellow="\e[38;2;181;137;0m" # Yellow (no brighter variant)
IBlue="\e[38;2;108;113;196m" # Violet — Solarized's "bright blue" IBlue="\e[38;2;108;113;196m" # Violet — Solarized's "bright blue"
IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant)
ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant)
IWhite="\e[38;2;147;161;161m" # Base1 — optional emphasis IWhite="\e[38;2;147;161;161m" # Base1 — optional emphasis
# Bold high intensity # Bold high intensity
BIBlack="\e[1;38;2;88;110;117m" # Base01 bold BIBlack="\e[1;38;2;88;110;117m" # Base01 bold
BIRed="\e[1;38;2;203;75;22m" # Orange bold BIRed="\e[1;38;2;203;75;22m" # Orange bold
BIGreen="\e[1;38;2;133;153;0m" # Green bold BIGreen="\e[1;38;2;133;153;0m" # Green bold
BIYellow="\e[1;38;2;181;137;0m" # Yellow bold BIYellow="\e[1;38;2;181;137;0m" # Yellow bold
BIBlue="\e[1;38;2;108;113;196m" # Violet bold BIBlue="\e[1;38;2;108;113;196m" # Violet bold
BIPurple="\e[1;38;2;211;54;130m" # Magenta bold BIPurple="\e[1;38;2;211;54;130m" # Magenta bold
BICyan="\e[1;38;2;42;161;152m" # Cyan bold BICyan="\e[1;38;2;42;161;152m" # Cyan bold
BIWhite="\e[1;38;2;147;161;161m" # Base1 bold BIWhite="\e[1;38;2;147;161;161m" # Base1 bold
# ---- Background palette overrides ------------------------------------------- # ---- Background palette overrides -------------------------------------------
On_Black="\e[48;2;0;43;54m" # Base03 On_Black="\e[48;2;0;43;54m" # Base03
On_Red="\e[48;2;220;50;47m" # Red On_Red="\e[48;2;220;50;47m" # Red
On_Green="\e[48;2;133;153;0m" # Green On_Green="\e[48;2;133;153;0m" # Green
On_Yellow="\e[48;2;181;137;0m" # Yellow On_Yellow="\e[48;2;181;137;0m" # Yellow
On_Blue="\e[48;2;38;139;210m" # Blue On_Blue="\e[48;2;38;139;210m" # Blue
On_Purple="\e[48;2;211;54;130m" # Magenta On_Purple="\e[48;2;211;54;130m" # Magenta
On_Cyan="\e[48;2;42;161;152m" # Cyan On_Cyan="\e[48;2;42;161;152m" # Cyan
On_White="\e[48;2;131;148;150m" # Base0 On_White="\e[48;2;131;148;150m" # Base0
On_IBlack="\e[48;2;7;54;66m" # Base02 — background highlights On_IBlack="\e[48;2;7;54;66m" # Base02 — background highlights
On_IRed="\e[48;2;203;75;22m" # Orange On_IRed="\e[48;2;203;75;22m" # Orange
On_IGreen="\e[48;2;133;153;0m" # Green On_IGreen="\e[48;2;133;153;0m" # Green
On_IYellow="\e[48;2;181;137;0m" # Yellow On_IYellow="\e[48;2;181;137;0m" # Yellow
On_IBlue="\e[48;2;108;113;196m" # Violet On_IBlue="\e[48;2;108;113;196m" # Violet
On_IPurple="\e[48;2;211;54;130m" # Magenta On_IPurple="\e[48;2;211;54;130m" # Magenta
On_ICyan="\e[48;2;42;161;152m" # Cyan On_ICyan="\e[48;2;42;161;152m" # Cyan
On_IWhite="\e[48;2;147;161;161m" # Base1 On_IWhite="\e[48;2;147;161;161m" # Base1
# ---- Special codes ---------------------------------------------------------- # ---- Special codes ----------------------------------------------------------
DEFAULTFG="\e[38;2;131;148;150m" # Base0 — default foreground DEFAULTFG="\e[38;2;131;148;150m" # Base0 — default foreground
DEFAULTBG="\e[48;2;0;43;54m" # Base03 — default background DEFAULTBG="\e[48;2;0;43;54m" # Base03 — default background
RESETCOL="\e[0m" RESETCOL="\e[0m"
# ---- Prompt colour slots ---------------------------------------------------- # ---- Prompt colour slots ----------------------------------------------------
# All specified as direct ANSI sequences to avoid ordering dependencies # All specified as direct ANSI sequences to avoid ordering dependencies
# with the palette overrides above. # with the palette overrides above.
PROMPT_COLOR_TIME_FG="\e[38;2;181;137;0m" # Yellow — primary accent PROMPT_COLOR_TIME_FG="\e[38;2;181;137;0m" # Yellow — primary accent
PROMPT_COLOR_TIME_BG="\e[48;2;0;43;54m" # Base03 — darkest background PROMPT_COLOR_TIME_BG="\e[48;2;0;43;54m" # Base03 — darkest background
PROMPT_COLOR_BAR_BG="\e[48;2;7;54;66m" # Base02 — bar background PROMPT_COLOR_BAR_BG="\e[48;2;7;54;66m" # Base02 — bar background
PROMPT_COLOR_OK_FG="\e[38;2;131;148;150m" # Base0 — body text on success PROMPT_COLOR_OK_FG="\e[38;2;131;148;150m" # Base0 — body text on success
PROMPT_COLOR_OK_MARK="\e[38;2;133;153;0m" # Green — checkmark PROMPT_COLOR_OK_MARK="\e[38;2;133;153;0m" # Green — checkmark
PROMPT_COLOR_ERR_BG="\e[48;2;220;50;47m" # Red — error background PROMPT_COLOR_ERR_BG="\e[48;2;220;50;47m" # Red — error background
PROMPT_COLOR_ERR_FG="\e[38;2;253;246;227m" # Base3 — bright fg on red PROMPT_COLOR_ERR_FG="\e[38;2;253;246;227m" # Base3 — bright fg on red
PROMPT_COLOR_ERR_MARK="\e[38;2;181;137;0m" # Yellow — X mark on red bg PROMPT_COLOR_ERR_MARK="\e[38;2;181;137;0m" # Yellow — X mark on red bg
PROMPT_COLOR_ROOT_FG="\e[38;2;220;50;47m" # Red — root warning PROMPT_COLOR_ROOT_FG="\e[38;2;220;50;47m" # Red — root warning
PROMPT_COLOR_USER_FG="\e[38;2;42;161;152m" # Cyan — normal user PROMPT_COLOR_USER_FG="\e[38;2;42;161;152m" # Cyan — normal user
PROMPT_COLOR_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory PROMPT_COLOR_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory