diff --git a/doc/CHANGELOG.md b/doc/CHANGELOG.md index 7878abf..32a8f02 100755 --- a/doc/CHANGELOG.md +++ b/doc/CHANGELOG.md @@ -1,71 +1,71 @@ -# Changelog - -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/). -Versions follow `MAJOR.MINOR.PATCH-REVISION_STAGE_N` (e.g. `3.99.1-4_rc_1`). - ---- - -## [3.99.1-4_rc_1] — 2026 - -### Added -- **Theming system** — `load_theme` in `profile.d/prompt.sh` loads `.theme` - files from `profile.d/themes/` (or a custom directory set via - `PROMPT_THEME_DIR`). Theme files are **parsed, not executed** — no shell code - ever runs from a theme. -- **Built-in themes** — `default`, `dark`, `light`, `solarized` (24-bit - true-colour), `solarized-light` (24-bit), `monokai`, `monochrome`, `abyss`, - `plasma`, `adwaita`. -- **`[prompt]` section** — `PROMPT_THEME` and `PROMPT_THEME_DIR` keys to select - a theme; eleven `PROMPT_COLOR_*` keys for per-key overrides in `profile.conf`. -- **Standard colour variables as theme keys** — theme files may also override - the `disp.sh` colour variables (`Black`, `Blue`, `On_IBlack`, …) to remap the - terminal palette used by `ls`, `grep`, and colour-aware tools. -- **Module configuration defaults** — all modules now expose their hardcoded - defaults as `profile.conf` keys: `TAZ_*`, `UTAZ_*`, `EXPANDLIST_*`, - `CLEAN_*`, `RMSPC_*`, `FINDBIG_*`, `RAIN_*`, `MATRIX_*`, `SSH_DEFAULT_OPT`, - `GENPWD_*`, `PWDSCORE_*`, `BUSY_*`, `METEO_DEFAULT_CITY`, `DWL_*`, - `MYEXTIP_*`, `PKGS_*`, `PPU_*`, `KU_*`, `UPDT_DEFAULT_BRANCH`. -- **`UPDT_DEFAULT_BRANCH`** — configures the git branch used by `check_updates` - and `profile_upgrade`. Changing the key causes `profile_upgrade` to - automatically switch the local checkout to the new branch and display a - warning. -- **`doc/` directory** — `CONTRIBUTING.md`, `FAQ.md`, `profile.conf.example` - (annotated template), `todo.md`. -- **`.gitignore`** — `profile.conf` is now git-ignored so personal settings are - never accidentally staged. - -### Changed -- README §2 now explains how to create `profile.conf` from - `doc/profile.conf.example` (new section 2.1 "Initial configuration"). -- README §4 updated with full module-defaults tables, theming reference, and a - note about `profile.conf` being git-ignored. -- Theme values no longer carry the `export` keyword (they are not shell - variables, only data). - -### Security -- `load_theme` uses a strict allowlist (no `eval`, no sourcing). Only - `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 - value is discarded with a warning. - ---- - ---- - -> **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 -> log (`git log --oneline`). - -## [3.95.3-4_beta_3] — 2024 - -### Added -- Initial public release candidate series. -- Core modules: `compress`, `disp`, `filefct`, `fun`, `help`, `info`, `lang`, - `net`, `packages`, `processes`, `prompt`, `pwd`, `rain`, `ssh`, `updates`. -- Bar-style prompt with time, command duration, and exit code. -- `taz` / `utaz` archive helpers. -- `genpwd` / `pwdscore` password tools. -- `matrix` / `rain` screensavers. -- `profile_upgrade` with git and archive download support. +# Changelog + +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/). +Versions follow `MAJOR.MINOR.PATCH-REVISION_STAGE_N` (e.g. `3.99.1-4_rc_1`). + +--- + +## [3.99.1-4_rc_1] — 2026 + +### Added +- **Theming system** — `load_theme` in `profile.d/prompt.sh` loads `.theme` + files from `profile.d/themes/` (or a custom directory set via + `PROMPT_THEME_DIR`). Theme files are **parsed, not executed** — no shell code + ever runs from a theme. +- **Built-in themes** — `default`, `dark`, `light`, `solarized` (24-bit + true-colour), `solarized-light` (24-bit), `monokai`, `monochrome`, `abyss`, + `plasma`, `adwaita`. +- **`[prompt]` section** — `PROMPT_THEME` and `PROMPT_THEME_DIR` keys to select + a theme; eleven `PROMPT_COLOR_*` keys for per-key overrides in `profile.conf`. +- **Standard colour variables as theme keys** — theme files may also override + the `disp.sh` colour variables (`Black`, `Blue`, `On_IBlack`, …) to remap the + terminal palette used by `ls`, `grep`, and colour-aware tools. +- **Module configuration defaults** — all modules now expose their hardcoded + defaults as `profile.conf` keys: `TAZ_*`, `UTAZ_*`, `EXPANDLIST_*`, + `CLEAN_*`, `RMSPC_*`, `FINDBIG_*`, `RAIN_*`, `MATRIX_*`, `SSH_DEFAULT_OPT`, + `GENPWD_*`, `PWDSCORE_*`, `BUSY_*`, `METEO_DEFAULT_CITY`, `DWL_*`, + `MYEXTIP_*`, `PKGS_*`, `PPU_*`, `KU_*`, `UPDT_DEFAULT_BRANCH`. +- **`UPDT_DEFAULT_BRANCH`** — configures the git branch used by `check_updates` + and `profile_upgrade`. Changing the key causes `profile_upgrade` to + automatically switch the local checkout to the new branch and display a + warning. +- **`doc/` directory** — `CONTRIBUTING.md`, `FAQ.md`, `profile.conf.example` + (annotated template), `todo.md`. +- **`.gitignore`** — `profile.conf` is now git-ignored so personal settings are + never accidentally staged. + +### Changed +- README §2 now explains how to create `profile.conf` from + `doc/profile.conf.example` (new section 2.1 "Initial configuration"). +- README §4 updated with full module-defaults tables, theming reference, and a + note about `profile.conf` being git-ignored. +- Theme values no longer carry the `export` keyword (they are not shell + variables, only data). + +### Security +- `load_theme` uses a strict allowlist (no `eval`, no sourcing). Only + `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 + value is discarded with a warning. + +--- + +--- + +> **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 +> log (`git log --oneline`). + +## [3.95.3-4_beta_3] — 2024 + +### Added +- Initial public release candidate series. +- Core modules: `compress`, `disp`, `filefct`, `fun`, `help`, `info`, `lang`, + `net`, `packages`, `processes`, `prompt`, `pwd`, `rain`, `ssh`, `updates`. +- Bar-style prompt with time, command duration, and exit code. +- `taz` / `utaz` archive helpers. +- `genpwd` / `pwdscore` password tools. +- `matrix` / `rain` screensavers. +- `profile_upgrade` with git and archive download support. diff --git a/doc/CONTRIBUTING.md b/doc/CONTRIBUTING.md index 3fb95bf..52348f9 100755 --- a/doc/CONTRIBUTING.md +++ b/doc/CONTRIBUTING.md @@ -1,171 +1,171 @@ -# Contributing to profile - -Thank you for your interest in contributing. This document explains how to get -set up, what the conventions are, and how to submit work. - ---- - -## 1. Before you start - -- 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) - to avoid duplicate work. -- For significant changes, open an issue or contact the maintainer before - writing code — alignment on design saves everyone time. - ---- - -## 2. Getting the source - -A Git clone is mandatory for contributions: - -```bash -git clone https://git.geoffray-levasseur.org/fatalerrors/profile.git -cd profile -``` - -Always work from the **latest commit on `master`** (or the branch you intend -to target). Stale forks cause avoidable merge conflicts. - ---- - -## 3. Development environment - -| Requirement | Minimum version | Notes | -|---|---|---| -| Bash | 4.3 | Namerefs (`local -n`) required | -| shellcheck | any recent | Run before every commit | -| git | any | For contributing patches | -| bats-core | 1.x | Optional — for running the test suite | - -Install shellcheck: -```bash -# Debian / Ubuntu -apt-get install shellcheck - -# Fedora / RHEL -dnf install ShellCheck - -# macOS -brew install shellcheck -``` - ---- - -## 4. Code style - -### General rules -- **Bash only** — no external interpreters in core modules. Python or Perl is - acceptable for completely self-contained, optional utilities that have no - dependencies beyond a minimal Debian or CentOS installation. -- **4-space indentation** — no tabs. -- **`[[ … ]]`** for all conditionals — not `[ … ]`. -- **`(( … ))`** for arithmetic — not `$(( … ))` in conditionals. -- **`local`** for all function-internal variables — avoid polluting the - environment. -- **`printf`** instead of `echo` wherever the format matters. -- **Never `eval`** — use namerefs (`local -n`), `${!varname}` indirection, or - `declare -g` instead. -- **No hardcoded defaults** — wire every configurable value through - `${VAR:-default}` and document the key in `profile.conf` and `README.md §4`. - -### Function conventions -- Public functions **must** be exported: `export -f funcname`. -- Every public function **must** support `-h` / `--help` and print usage to - stdout, returning 0. -- Use `getopt` (not `getopts`) for option parsing — it handles long options and - `--` correctly. -- Follow existing error-return conventions: 0 = success, 1 = usage error, - 2 = bad options, 3 = missing dependency, 4+ = runtime failure. -- Prefix all local helper variables with a short unique prefix (e.g. `_taz_`) - to prevent collisions with caller-scope variables. - -### Module structure -Every new module should follow this pattern: - -```bash -#!/usr/bin/env bash -# - -load_conf "" - -# --- functions --- - -export -f my_function - -# EOF -``` - -Add the `load_conf` call near the top after any variable declarations. - ---- - -## 5. Configuration keys - -When adding a configurable default: - -1. Use `${MY_VAR:-hardcoded_default}` in the function body. -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`. - ---- - -## 6. Theming - -New theme files go in `profile.d/themes/` with a `.theme` extension. -They are **parsed, not executed** — do not add shell logic. -See the existing themes and `README.md §4.4` for the allowed syntax. - ---- - -## 7. Running shellcheck - -```bash -shellcheck -x profile.sh profile.d/*.sh -``` - -All warnings must be resolved before a patch will be accepted. Accepted -suppression directives (`# shellcheck disable=SCxxxx`) require an inline -comment explaining why the suppression is necessary. - ---- - -## 8. Submitting a contribution - -### Via Git (preferred) -1. Contact the maintainer to obtain push access, or fork on the Gitea instance. -2. Create a branch: `git checkout -b feature/my-feature`. -3. Commit with a clear subject line: `module: short description (≤ 72 chars)`. -4. Push and open a pull request against `master`. - -### Via patch -If you do not have push access: -```bash -git format-patch origin/master -``` -Send the resulting `.patch` file(s) to -`fatalerrors geoffray-levasseur org`. - -### Commit message format -``` -module: imperative short description - -Optional longer explanation of what changed and why. Wrap at 72 characters. -Reference issue numbers if applicable: closes #42. -``` - ---- - -## 9. What will be rejected - -- Code requiring packages not in a minimal Debian or CentOS install. -- Use of `eval`, `source`-based config loading, or other code-injection vectors. -- Changes that break Bash 4.3 compatibility. -- Patches without a passing `shellcheck` run. -- New functions without `--help` support. - ---- - -## 10. Financial contributions - -Contact the maintainer by mail if you wish to make a financial contribution. +# Contributing to profile + +Thank you for your interest in contributing. This document explains how to get +set up, what the conventions are, and how to submit work. + +--- + +## 1. Before you start + +- 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) + to avoid duplicate work. +- For significant changes, open an issue or contact the maintainer before + writing code — alignment on design saves everyone time. + +--- + +## 2. Getting the source + +A Git clone is mandatory for contributions: + +```bash +git clone https://git.geoffray-levasseur.org/fatalerrors/profile.git +cd profile +``` + +Always work from the **latest commit on `master`** (or the branch you intend +to target). Stale forks cause avoidable merge conflicts. + +--- + +## 3. Development environment + +| Requirement | Minimum version | Notes | +|---|---|---| +| Bash | 4.3 | Namerefs (`local -n`) required | +| shellcheck | any recent | Run before every commit | +| git | any | For contributing patches | +| bats-core | 1.x | Optional — for running the test suite | + +Install shellcheck: +```bash +# Debian / Ubuntu +apt-get install shellcheck + +# Fedora / RHEL +dnf install ShellCheck + +# macOS +brew install shellcheck +``` + +--- + +## 4. Code style + +### General rules +- **Bash only** — no external interpreters in core modules. Python or Perl is + acceptable for completely self-contained, optional utilities that have no + dependencies beyond a minimal Debian or CentOS installation. +- **4-space indentation** — no tabs. +- **`[[ … ]]`** for all conditionals — not `[ … ]`. +- **`(( … ))`** for arithmetic — not `$(( … ))` in conditionals. +- **`local`** for all function-internal variables — avoid polluting the + environment. +- **`printf`** instead of `echo` wherever the format matters. +- **Never `eval`** — use namerefs (`local -n`), `${!varname}` indirection, or + `declare -g` instead. +- **No hardcoded defaults** — wire every configurable value through + `${VAR:-default}` and document the key in `profile.conf` and `README.md §4`. + +### Function conventions +- Public functions **must** be exported: `export -f funcname`. +- Every public function **must** support `-h` / `--help` and print usage to + stdout, returning 0. +- Use `getopt` (not `getopts`) for option parsing — it handles long options and + `--` correctly. +- Follow existing error-return conventions: 0 = success, 1 = usage error, + 2 = bad options, 3 = missing dependency, 4+ = runtime failure. +- Prefix all local helper variables with a short unique prefix (e.g. `_taz_`) + to prevent collisions with caller-scope variables. + +### Module structure +Every new module should follow this pattern: + +```bash +#!/usr/bin/env bash +# + +load_conf "" + +# --- functions --- + +export -f my_function + +# EOF +``` + +Add the `load_conf` call near the top after any variable declarations. + +--- + +## 5. Configuration keys + +When adding a configurable default: + +1. Use `${MY_VAR:-hardcoded_default}` in the function body. +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`. + +--- + +## 6. Theming + +New theme files go in `profile.d/themes/` with a `.theme` extension. +They are **parsed, not executed** — do not add shell logic. +See the existing themes and `README.md §4.4` for the allowed syntax. + +--- + +## 7. Running shellcheck + +```bash +shellcheck -x profile.sh profile.d/*.sh +``` + +All warnings must be resolved before a patch will be accepted. Accepted +suppression directives (`# shellcheck disable=SCxxxx`) require an inline +comment explaining why the suppression is necessary. + +--- + +## 8. Submitting a contribution + +### Via Git (preferred) +1. Contact the maintainer to obtain push access, or fork on the Gitea instance. +2. Create a branch: `git checkout -b feature/my-feature`. +3. Commit with a clear subject line: `module: short description (≤ 72 chars)`. +4. Push and open a pull request against `master`. + +### Via patch +If you do not have push access: +```bash +git format-patch origin/master +``` +Send the resulting `.patch` file(s) to +`fatalerrors geoffray-levasseur org`. + +### Commit message format +``` +module: imperative short description + +Optional longer explanation of what changed and why. Wrap at 72 characters. +Reference issue numbers if applicable: closes #42. +``` + +--- + +## 9. What will be rejected + +- Code requiring packages not in a minimal Debian or CentOS install. +- Use of `eval`, `source`-based config loading, or other code-injection vectors. +- Changes that break Bash 4.3 compatibility. +- Patches without a passing `shellcheck` run. +- New functions without `--help` support. + +--- + +## 10. Financial contributions + +Contact the maintainer by mail if you wish to make a financial contribution. diff --git a/doc/FAQ.md b/doc/FAQ.md index d54735c..4f81cf9 100755 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -1,208 +1,208 @@ -# Frequently Asked Questions - ---- - -## Installation & loading - -**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 -Bash 3.x for licensing reasons). Install a newer Bash: -```bash -# macOS -brew install bash -# then add /opt/homebrew/bin/bash to /etc/shells and chsh -``` -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.** - -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 -scripts start with `#!/usr/bin/env bash`. - ---- - -**Q: I set `PROFILE_PATH` but profile still can't find its modules.** - -`PROFILE_PATH` must be exported *before* you source `profile.sh`: -```bash -export PROFILE_PATH=/opt/profile -source /opt/profile/profile.sh -``` -If set after sourcing, `MYPATH` is already locked in and the variable has -no effect. - ---- - -**Q: Can I load profile system-wide via `/etc/profile`?** - -It is not recommended. User `.bashrc` files frequently set variables that -conflict with the aliases and locale functions defined here, leading to -surprising behaviour. Per-user sourcing from `~/.bashrc` is the supported -method. - ---- - -## Configuration - -**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 -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?** - -Every supported key is documented with a comment in `profile.conf`. -See also `README.md §4.2` for a consolidated table. - ---- - -**Q: A key I set in `profile.conf` is being ignored.** - -Check that: -1. The key is inside the correct `[section]` header. -2. There is no leading space before the section name (`[section]` not - `[ section ]`). -3. The key is not commented out (no leading `#`). -4. The value contains no backticks or `$(…)` — these are stripped by the - parser as a security measure. - ---- - -## Prompt & theming - -**Q: How do I change the prompt theme?** - -Add to `profile.conf`: -```ini -[prompt] -PROMPT_THEME = dark -``` -Built-in names: `default`, `dark`, `light`, `solarized`, `solarized-light`, -`monokai`, `monochrome`, `abyss`, `plasma`, `adwaita`. - ---- - -**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`). -Test your terminal: -```bash -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 garbage or plain text, switch to a 16-colour theme -(`dark`, `default`, etc.) or upgrade your terminal emulator. - ---- - -**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 -standard colour variable names from `disp.sh` (`Black`, `Blue`, `On_IBlack`, -…) 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. - ---- - -**Q: Can a theme file contain shell logic or `$(…)` command substitutions?** - -No, and intentionally so. Theme files are parsed line-by-line; shell -constructs are never evaluated. This is a security boundary — a malicious -theme file cannot execute code. Values must be a colour variable reference -(`$Blue`) or a raw ANSI escape literal (`\e[0;34m`). - ---- - -## Functions - -**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 -`[info]` section: -```ini -[info] -METEO_DEFAULT_CITY = Paris -``` - ---- - -**Q: `dwl` fails with "no download tool found".** - -`dwl` requires one of `curl`, `wget`, or `fetch` to be installed. -Install curl: -```bash -# Debian / Ubuntu -apt-get install curl - -# Fedora / RHEL -dnf install curl -``` -Or set `DWL_PREFERRED_TOOL` in `[net]` to whichever tool you have. - ---- - -**Q: `pkgs` does not find packages I know are installed.** - -`pkgs` delegates to `dpkg -l` (Debian/Ubuntu) or `rpm -qa` (RHEL/Fedora). -If your distribution uses a different package manager (pacman, apk, brew …) -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.** - -`check_updates` compares the content of the remote `version` file against -`$PROFVERSION`. If `UPDT_DEFAULT_BRANCH` in `[updates]` points to a different -branch than your installation, the version files may not match. Check: -```bash -cat "$MYPATH/version" -``` -and make sure `UPDT_DEFAULT_BRANCH` matches the branch you track. - ---- - -## Compatibility - -**Q: Some functions misbehave on macOS / Cygwin.** - -Both environments ship non-GNU userland utilities with different flags and -behaviour. profile is primarily developed and tested on Linux (Debian and -RHEL families). macOS and Cygwin bugs are low priority; patches that add -compatibility without breaking Linux support are welcome. - ---- - -**Q: Can I use profile with ZSH?** - -Not officially. Blockers include `local -A` (ZSH requires `typeset -A`) and -`local -n` namerefs. A compatibility layer is listed in `doc/todo.md` but -has not been implemented yet. - ---- - -## Miscellaneous - -**Q: How do I completely disable profile for one session?** - -```bash -PROFILE_DISABLED=1 bash --norc -``` -Or simply open a shell without sourcing `~/.bashrc` (`bash --norc`). - ---- - -**Q: How do I report a bug?** - -Open an issue on the -[Gitea tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues) -or send a mail to `fatalerrors geoffray-levasseur org` with: -- The exact command that triggered the bug -- Your OS and Bash version (`bash --version`) -- The module involved -- Any relevant error output +# Frequently Asked Questions + +--- + +## Installation & loading + +**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 +Bash 3.x for licensing reasons). Install a newer Bash: +```bash +# macOS +brew install bash +# then add /opt/homebrew/bin/bash to /etc/shells and chsh +``` +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.** + +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 +scripts start with `#!/usr/bin/env bash`. + +--- + +**Q: I set `PROFILE_PATH` but profile still can't find its modules.** + +`PROFILE_PATH` must be exported *before* you source `profile.sh`: +```bash +export PROFILE_PATH=/opt/profile +source /opt/profile/profile.sh +``` +If set after sourcing, `MYPATH` is already locked in and the variable has +no effect. + +--- + +**Q: Can I load profile system-wide via `/etc/profile`?** + +It is not recommended. User `.bashrc` files frequently set variables that +conflict with the aliases and locale functions defined here, leading to +surprising behaviour. Per-user sourcing from `~/.bashrc` is the supported +method. + +--- + +## Configuration + +**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 +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?** + +Every supported key is documented with a comment in `profile.conf`. +See also `README.md §4.2` for a consolidated table. + +--- + +**Q: A key I set in `profile.conf` is being ignored.** + +Check that: +1. The key is inside the correct `[section]` header. +2. There is no leading space before the section name (`[section]` not + `[ section ]`). +3. The key is not commented out (no leading `#`). +4. The value contains no backticks or `$(…)` — these are stripped by the + parser as a security measure. + +--- + +## Prompt & theming + +**Q: How do I change the prompt theme?** + +Add to `profile.conf`: +```ini +[prompt] +PROMPT_THEME = dark +``` +Built-in names: `default`, `dark`, `light`, `solarized`, `solarized-light`, +`monokai`, `monochrome`, `abyss`, `plasma`, `adwaita`. + +--- + +**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`). +Test your terminal: +```bash +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 garbage or plain text, switch to a 16-colour theme +(`dark`, `default`, etc.) or upgrade your terminal emulator. + +--- + +**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 +standard colour variable names from `disp.sh` (`Black`, `Blue`, `On_IBlack`, +…) 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. + +--- + +**Q: Can a theme file contain shell logic or `$(…)` command substitutions?** + +No, and intentionally so. Theme files are parsed line-by-line; shell +constructs are never evaluated. This is a security boundary — a malicious +theme file cannot execute code. Values must be a colour variable reference +(`$Blue`) or a raw ANSI escape literal (`\e[0;34m`). + +--- + +## Functions + +**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 +`[info]` section: +```ini +[info] +METEO_DEFAULT_CITY = Paris +``` + +--- + +**Q: `dwl` fails with "no download tool found".** + +`dwl` requires one of `curl`, `wget`, or `fetch` to be installed. +Install curl: +```bash +# Debian / Ubuntu +apt-get install curl + +# Fedora / RHEL +dnf install curl +``` +Or set `DWL_PREFERRED_TOOL` in `[net]` to whichever tool you have. + +--- + +**Q: `pkgs` does not find packages I know are installed.** + +`pkgs` delegates to `dpkg -l` (Debian/Ubuntu) or `rpm -qa` (RHEL/Fedora). +If your distribution uses a different package manager (pacman, apk, brew …) +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.** + +`check_updates` compares the content of the remote `version` file against +`$PROFVERSION`. If `UPDT_DEFAULT_BRANCH` in `[updates]` points to a different +branch than your installation, the version files may not match. Check: +```bash +cat "$MYPATH/version" +``` +and make sure `UPDT_DEFAULT_BRANCH` matches the branch you track. + +--- + +## Compatibility + +**Q: Some functions misbehave on macOS / Cygwin.** + +Both environments ship non-GNU userland utilities with different flags and +behaviour. profile is primarily developed and tested on Linux (Debian and +RHEL families). macOS and Cygwin bugs are low priority; patches that add +compatibility without breaking Linux support are welcome. + +--- + +**Q: Can I use profile with ZSH?** + +Not officially. Blockers include `local -A` (ZSH requires `typeset -A`) and +`local -n` namerefs. A compatibility layer is listed in `doc/todo.md` but +has not been implemented yet. + +--- + +## Miscellaneous + +**Q: How do I completely disable profile for one session?** + +```bash +PROFILE_DISABLED=1 bash --norc +``` +Or simply open a shell without sourcing `~/.bashrc` (`bash --norc`). + +--- + +**Q: How do I report a bug?** + +Open an issue on the +[Gitea tracker](https://git.geoffray-levasseur.org/fatalerrors/profile/issues) +or send a mail to `fatalerrors geoffray-levasseur org` with: +- The exact command that triggered the bug +- Your OS and Bash version (`bash --version`) +- The module involved +- Any relevant error output diff --git a/doc/profile.conf.example b/doc/profile.conf.example index b2c2a82..86a94c8 100755 --- a/doc/profile.conf.example +++ b/doc/profile.conf.example @@ -1,247 +1,247 @@ -# profile.conf — example / reference configuration -# Copy this file to the profile installation directory as "profile.conf" -# and uncomment / edit the keys you want to change. -# -# Format: -# [section_name] — starts a section -# key = value — sets a key (whitespace around = is optional) -# # comment — line comment -# -# All keys are optional. Sensible defaults apply when unset. -# Values must not contain backticks or $(…) — those are stripped for security. -# ------------------------------------------------------------------------------ - -# ============================================================================== -[system] -# Bash history settings -HISTSIZE=50000 -HISTFILESIZE=100000 -HISTIGNORE="&:[bf]g:exit" - -# Default pager -PAGER=less - -# Terminal colour capability -TERM=xterm-256color - -# ============================================================================== -[compress] -# taz: Default archive format (-f/--format). -# Supported: lz (default), xz, bz2, gz, lzo, tar, zip, zst -#TAZ_DEFAULT_FORMAT=lz - -# taz: Number of compression threads (0 = auto-detect CPU count). -#TAZ_DEFAULT_THREADS=0 - -# taz: Compression level 1 (fast/large) … 9 (slow/small). -#TAZ_DEFAULT_LEVEL=6 - -# utaz: Delete source archive after successful extraction (0=no, 1=yes). -#UTAZ_DEFAULT_DELETE=0 - -# utaz: Subdirectory creation policy. -# auto — create one only when the archive has multiple top-level entries -# always — always extract into a new subdirectory -# never — always flatten into the current directory -#UTAZ_DEFAULT_DIR_MODE=auto - -# ============================================================================== -[debug] -# (no configurable keys yet) - -# ============================================================================== -[disp] -# Uncomment to disable ANSI colours in profile's own output messages. -#NO_COLOR=1 - -# ============================================================================== -[filefct] -# expandlist: Separator between items (default: space). Use \n for newline. -#EXPANDLIST_DEFAULT_SEPARATOR=" " - -# clean: Recurse into subdirectories by default (0=no, 1=yes). -#CLEAN_DEFAULT_RECURSIVE=0 - -# rmspc: Replacement character for spaces in filenames (default: underscore). -#RMSPC_DEFAULT_CHAR=_ - -# findbig: Number of results to display (default: 10). -#FINDBIG_DEFAULT_LIMIT=10 - -# ============================================================================== -[fun] -# busy: Hex pattern searched in /dev/urandom hexdump. -#BUSY_DEFAULT_PATTERN=ca fe - -# busy: Delay between matched lines in milliseconds (0 = no delay). -#BUSY_DEFAULT_DELAY=0 - -# ============================================================================== -[info] -# meteo: Default city when no argument is given. Leave unset to require an -# explicit city argument every time. -#METEO_DEFAULT_CITY=Paris - -# ============================================================================== -[lang] -# 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" -# creates setfr, setus, setes. -#SET_LOCALE=fr:fr_FR.UTF-8,us:en_US.UTF-8 - -# ============================================================================== -[net] -# dwl: Force a specific download tool (curl, wget, fetch). -# Unset = auto-detect (curl preferred, then wget, then fetch). -#DWL_PREFERRED_TOOL=curl - -# myextip: API endpoint for external IP lookup. -# Alternatives: https://ipinfo.io/json, https://ip-api.com/json/ -#MYEXTIP_DEFAULT_URL=https://ip-api.com/json/ - -# ============================================================================== -[packages] -# pkgs: Case-insensitive search by default (0=no, 1=yes). -#PKGS_DEFAULT_IGNORE_CASE=0 - -# ============================================================================== -[processes] -# ppu: ps output columns (comma-separated ps field names). -#PPU_DEFAULT_FORMAT=pid,user,%cpu,%mem,start,time,command - -# ku: Signal sent when killing a user's processes (without SIG prefix). -#KU_DEFAULT_SIGNAL=TERM - -# ============================================================================== -[prompt] -# Name of the prompt theme to load, or an explicit path to a .theme file. -# Built-in themes: default, dark, light, solarized, solarized-light, -# monokai, monochrome, abyss, plasma, adwaita -# Solarized variants require a terminal with 24-bit true-colour support. -#PROMPT_THEME=default - -# Directory searched for bare theme names. Defaults to profile.d/themes/. -#PROMPT_THEME_DIR=/path/to/my/themes - -# Individual colour overrides — these always win over the loaded theme. -# Values must be colour variable names from disp.sh (e.g. $Blue, $On_IBlack) -# or raw ANSI escape sequences (e.g. \e[0;34m). -# -# Clock segment -#PROMPT_COLOR_TIME_FG=$Blue -#PROMPT_COLOR_TIME_BG=$On_IBlack -# -# Main bar background -#PROMPT_COLOR_BAR_BG=$On_Blue -# -# Exit-code segment — success -#PROMPT_COLOR_OK_FG=$White -#PROMPT_COLOR_OK_MARK=$Green -# -# Exit-code segment — failure -#PROMPT_COLOR_ERR_BG=$On_Red -#PROMPT_COLOR_ERR_FG=$White -#PROMPT_COLOR_ERR_MARK=$BYellow -# -# User / host -#PROMPT_COLOR_ROOT_FG=$Red -#PROMPT_COLOR_USER_FG=$Green -# -# Working directory -#PROMPT_COLOR_DIR_FG=$ICyan - -# ============================================================================== -[pwd] -# genpwd: Default password length. -#GENPWD_DEFAULT_LENGTH=16 - -# genpwd: Maximum occurrences of any single character. -#GENPWD_DEFAULT_OCCURS=2 - -# genpwd: Number of passwords generated per invocation. -#GENPWD_DEFAULT_COUNT=1 - -# genpwd: Include symbols (1=yes, 0=no). -#GENPWD_DEFAULT_SYMBOLS=1 - -# genpwd: Include uppercase letters (1=yes, 0=no). -#GENPWD_DEFAULT_UPPERCASE=1 - -# genpwd: Include lowercase letters (1=yes, 0=no). -#GENPWD_DEFAULT_LOWERCASE=1 - -# genpwd: Include digits (1=yes, 0=no). -#GENPWD_DEFAULT_NUMBERS=1 - -# pwdscore: Show verbose breakdown by default (1=yes, 0=no). -#PWDSCORE_DEFAULT_VERBOSE=0 - -# ============================================================================== -[rain] -# rain: Falling speed — integer/100 gives seconds (5 → 0.05 s). -# Values < 1 are used as raw seconds. -#RAIN_DEFAULT_SPEED=5 - -# rain: Colour theme. Supported: white (default), green, blue, red, yellow, cyan -#RAIN_DEFAULT_COLOR=white - -# matrix: Falling speed. -#MATRIX_DEFAULT_SPEED=3.5 - -# matrix: Colour theme. Supported: green (default), blue, red, yellow, cyan, white -#MATRIX_DEFAULT_COLOR=green - -# matrix: Character set. Supported: binary (default), kana, ascii -#MATRIX_DEFAULT_CHARSET=binary - -# ============================================================================== -[ssh] -# ssr: Default SSH options prepended to every ssr call. -# Examples: -# SSH_DEFAULT_OPT=-Y # X11 forwarding -# SSH_DEFAULT_OPT=-Y -o StrictHostKeyChecking=accept-new -# SSH_DEFAULT_OPT= # no default options -#SSH_DEFAULT_OPT=-Y - -# ============================================================================== -[updates] -# Git branch used for update checks and profile_upgrade. -# Changing this causes profile_upgrade to automatically switch the local -# checkout to the new branch on the next run and display a warning. -#UPDT_DEFAULT_BRANCH=master - -# ============================================================================== -[general] -# General-purpose section — set any environment variable you need globally. -# Good place for compilation flags, personal PATH additions, etc. -#CFLAGS=-O2 -pipe -march=native -#CXXFLAGS=$CFLAGS -#MAKEFLAGS=-j4 -#PKGSOURCES=/usr/local/src - -# ============================================================================== -[aliases] -# Command aliases loaded for interactive shells only. -# 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. -# -# ls -ll=ls -laFh --color=auto -la=ls -Ah --color=auto -l=ls -CF --color=auto -ls=ls --color=auto -# -# grep -grep=grep --color=auto -egrep=egrep --color=auto -fgrep=fgrep --color=auto -# -# disk usage -df=df -H -du=du -ch -# -# make shortcuts -#mk=make -#mkin=make install - -# End of profile.conf.example +# profile.conf — example / reference configuration +# Copy this file to the profile installation directory as "profile.conf" +# and uncomment / edit the keys you want to change. +# +# Format: +# [section_name] — starts a section +# key = value — sets a key (whitespace around = is optional) +# # comment — line comment +# +# All keys are optional. Sensible defaults apply when unset. +# Values must not contain backticks or $(…) — those are stripped for security. +# ------------------------------------------------------------------------------ + +# ============================================================================== +[system] +# Bash history settings +HISTSIZE=50000 +HISTFILESIZE=100000 +HISTIGNORE="&:[bf]g:exit" + +# Default pager +PAGER=less + +# Terminal colour capability +TERM=xterm-256color + +# ============================================================================== +[compress] +# taz: Default archive format (-f/--format). +# Supported: lz (default), xz, bz2, gz, lzo, tar, zip, zst +#TAZ_DEFAULT_FORMAT=lz + +# taz: Number of compression threads (0 = auto-detect CPU count). +#TAZ_DEFAULT_THREADS=0 + +# taz: Compression level 1 (fast/large) … 9 (slow/small). +#TAZ_DEFAULT_LEVEL=6 + +# utaz: Delete source archive after successful extraction (0=no, 1=yes). +#UTAZ_DEFAULT_DELETE=0 + +# utaz: Subdirectory creation policy. +# auto — create one only when the archive has multiple top-level entries +# always — always extract into a new subdirectory +# never — always flatten into the current directory +#UTAZ_DEFAULT_DIR_MODE=auto + +# ============================================================================== +[debug] +# (no configurable keys yet) + +# ============================================================================== +[disp] +# Uncomment to disable ANSI colours in profile's own output messages. +#NO_COLOR=1 + +# ============================================================================== +[filefct] +# expandlist: Separator between items (default: space). Use \n for newline. +#EXPANDLIST_DEFAULT_SEPARATOR=" " + +# clean: Recurse into subdirectories by default (0=no, 1=yes). +#CLEAN_DEFAULT_RECURSIVE=0 + +# rmspc: Replacement character for spaces in filenames (default: underscore). +#RMSPC_DEFAULT_CHAR=_ + +# findbig: Number of results to display (default: 10). +#FINDBIG_DEFAULT_LIMIT=10 + +# ============================================================================== +[fun] +# busy: Hex pattern searched in /dev/urandom hexdump. +#BUSY_DEFAULT_PATTERN=ca fe + +# busy: Delay between matched lines in milliseconds (0 = no delay). +#BUSY_DEFAULT_DELAY=0 + +# ============================================================================== +[info] +# meteo: Default city when no argument is given. Leave unset to require an +# explicit city argument every time. +#METEO_DEFAULT_CITY=Paris + +# ============================================================================== +[lang] +# 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" +# creates setfr, setus, setes. +#SET_LOCALE=fr:fr_FR.UTF-8,us:en_US.UTF-8 + +# ============================================================================== +[net] +# dwl: Force a specific download tool (curl, wget, fetch). +# Unset = auto-detect (curl preferred, then wget, then fetch). +#DWL_PREFERRED_TOOL=curl + +# myextip: API endpoint for external IP lookup. +# Alternatives: https://ipinfo.io/json, https://ip-api.com/json/ +#MYEXTIP_DEFAULT_URL=https://ip-api.com/json/ + +# ============================================================================== +[packages] +# pkgs: Case-insensitive search by default (0=no, 1=yes). +#PKGS_DEFAULT_IGNORE_CASE=0 + +# ============================================================================== +[processes] +# ppu: ps output columns (comma-separated ps field names). +#PPU_DEFAULT_FORMAT=pid,user,%cpu,%mem,start,time,command + +# ku: Signal sent when killing a user's processes (without SIG prefix). +#KU_DEFAULT_SIGNAL=TERM + +# ============================================================================== +[prompt] +# Name of the prompt theme to load, or an explicit path to a .theme file. +# Built-in themes: default, dark, light, solarized, solarized-light, +# monokai, monochrome, abyss, plasma, adwaita +# Solarized variants require a terminal with 24-bit true-colour support. +#PROMPT_THEME=default + +# Directory searched for bare theme names. Defaults to profile.d/themes/. +#PROMPT_THEME_DIR=/path/to/my/themes + +# Individual colour overrides — these always win over the loaded theme. +# Values must be colour variable names from disp.sh (e.g. $Blue, $On_IBlack) +# or raw ANSI escape sequences (e.g. \e[0;34m). +# +# Clock segment +#PROMPT_COLOR_TIME_FG=$Blue +#PROMPT_COLOR_TIME_BG=$On_IBlack +# +# Main bar background +#PROMPT_COLOR_BAR_BG=$On_Blue +# +# Exit-code segment — success +#PROMPT_COLOR_OK_FG=$White +#PROMPT_COLOR_OK_MARK=$Green +# +# Exit-code segment — failure +#PROMPT_COLOR_ERR_BG=$On_Red +#PROMPT_COLOR_ERR_FG=$White +#PROMPT_COLOR_ERR_MARK=$BYellow +# +# User / host +#PROMPT_COLOR_ROOT_FG=$Red +#PROMPT_COLOR_USER_FG=$Green +# +# Working directory +#PROMPT_COLOR_DIR_FG=$ICyan + +# ============================================================================== +[pwd] +# genpwd: Default password length. +#GENPWD_DEFAULT_LENGTH=16 + +# genpwd: Maximum occurrences of any single character. +#GENPWD_DEFAULT_OCCURS=2 + +# genpwd: Number of passwords generated per invocation. +#GENPWD_DEFAULT_COUNT=1 + +# genpwd: Include symbols (1=yes, 0=no). +#GENPWD_DEFAULT_SYMBOLS=1 + +# genpwd: Include uppercase letters (1=yes, 0=no). +#GENPWD_DEFAULT_UPPERCASE=1 + +# genpwd: Include lowercase letters (1=yes, 0=no). +#GENPWD_DEFAULT_LOWERCASE=1 + +# genpwd: Include digits (1=yes, 0=no). +#GENPWD_DEFAULT_NUMBERS=1 + +# pwdscore: Show verbose breakdown by default (1=yes, 0=no). +#PWDSCORE_DEFAULT_VERBOSE=0 + +# ============================================================================== +[rain] +# rain: Falling speed — integer/100 gives seconds (5 → 0.05 s). +# Values < 1 are used as raw seconds. +#RAIN_DEFAULT_SPEED=5 + +# rain: Colour theme. Supported: white (default), green, blue, red, yellow, cyan +#RAIN_DEFAULT_COLOR=white + +# matrix: Falling speed. +#MATRIX_DEFAULT_SPEED=3.5 + +# matrix: Colour theme. Supported: green (default), blue, red, yellow, cyan, white +#MATRIX_DEFAULT_COLOR=green + +# matrix: Character set. Supported: binary (default), kana, ascii +#MATRIX_DEFAULT_CHARSET=binary + +# ============================================================================== +[ssh] +# ssr: Default SSH options prepended to every ssr call. +# Examples: +# SSH_DEFAULT_OPT=-Y # X11 forwarding +# SSH_DEFAULT_OPT=-Y -o StrictHostKeyChecking=accept-new +# SSH_DEFAULT_OPT= # no default options +#SSH_DEFAULT_OPT=-Y + +# ============================================================================== +[updates] +# Git branch used for update checks and profile_upgrade. +# Changing this causes profile_upgrade to automatically switch the local +# checkout to the new branch on the next run and display a warning. +#UPDT_DEFAULT_BRANCH=master + +# ============================================================================== +[general] +# General-purpose section — set any environment variable you need globally. +# Good place for compilation flags, personal PATH additions, etc. +#CFLAGS=-O2 -pipe -march=native +#CXXFLAGS=$CFLAGS +#MAKEFLAGS=-j4 +#PKGSOURCES=/usr/local/src + +# ============================================================================== +[aliases] +# Command aliases loaded for interactive shells only. +# 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. +# +# ls +ll=ls -laFh --color=auto +la=ls -Ah --color=auto +l=ls -CF --color=auto +ls=ls --color=auto +# +# grep +grep=grep --color=auto +egrep=egrep --color=auto +fgrep=fgrep --color=auto +# +# disk usage +df=df -H +du=du -ch +# +# make shortcuts +#mk=make +#mkin=make install + +# End of profile.conf.example diff --git a/doc/todo.md b/doc/todo.md index 84959c6..dcafe5b 100755 --- a/doc/todo.md +++ b/doc/todo.md @@ -1,121 +1,121 @@ -# profile — to-do list - -Items marked **[easy]**, **[medium]**, or **[hard]** give a rough effort hint. -Items marked **[breaking]** would change existing behaviour and require a -version-bump. - ---- - -## Shell / compatibility - -- [ ] **ZSH compatibility layer** — most functions work already; the remaining - 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 - ZSH users. **[hard]** -- [ ] **Bash completion** — add a `profile.d/completion/` directory and write - `_profile_upgrade`, `_taz`, `_utaz`, `_meteo`, etc. completions so that - `` works on all public functions. **[medium]** -- [ ] **`shellcheck` clean pass** — run `shellcheck -x profile.sh profile.d/*.sh` - and address every remaining warning (currently a handful of SC2034 and SC2086 - items). Integrate as a pre-commit hook. **[easy]** - ---- - -## Prompt & theming - -- [ ] **Git branch in prompt** — show the current branch name (and dirty - indicator) in the PS1 bar when inside a Git repository. Should be - gated behind a `[prompt]` config key so it can be disabled. **[medium]** -- [ ] **Virtual-env / conda indicator** — detect `$VIRTUAL_ENV` / `$CONDA_DEFAULT_ENV` - and display the name in the prompt bar. **[easy]** -- [ ] **True-colour terminal auto-detection** — query `$COLORTERM` and - `$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]** -- [ ] **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 - Solarized themes. **[easy]** _(per theme)_ -- [ ] **Theme preview command** — add a `theme_preview` (or `profile_theme`) - function that renders a colour swatch and a sample prompt line for the - currently loaded theme, so users can evaluate themes without reloading - the session. **[medium]** -- [ ] **`load_theme` — DEFAULTCOL rebuild** — after overriding `DEFAULTFG` and - `DEFAULTBG`, automatically recompute `DEFAULTCOL` from the new values instead - of requiring the theme file to set it explicitly. **[easy]** - ---- - -## Module improvements - -### compress -- [ ] **`taz` progress bar** — show a `pv` / `dd`-based progress indicator when - compressing large trees, gated behind a `-p` flag. **[medium]** -- [ ] **`utaz` integrity check** — run `tar -tOf` / `unzip -t` / `7z t` before - extracting and abort if the archive is corrupt. **[easy]** - -### filefct -- [ ] **`findbig` / `findzero` / `finddead` — `fd` integration** — optionally - use `fd` instead of `find` when available for faster traversal. **[easy]** -- [ ] **`file_stats` — human-readable totals** — add `--human` flag to emit - sizes in K/M/G instead of bytes. **[easy]** - -### info -- [ ] **`showinfo` fallback** — when neither `neofetch` nor `fastfetch` is - installed, print a minimal sysinfo block (hostname, OS, kernel, uptime, - CPU, RAM) using pure Bash + `/proc`. **[medium]** - -### net -- [ ] **`dwl` resume support** — pass `-C -` to curl / `--continue-at -` to - wget for interrupted downloads; gate behind a `-r` flag. **[easy]** -- [ ] **`myextip` multiple providers** — fall back to a secondary URL - (configurable via `MYEXTIP_FALLBACK_URL`) when the primary times out. - **[easy]** - -### packages -- [ ] **Additional backends** — add support for `pacman` (Arch), `apk` (Alpine), - `xbps-query` (Void), and `brew` (macOS). **[medium]** - -### processes -- [ ] **`ku` dry-run flag** — add `-n` / `--dry-run` to print what would be - killed without acting. **[easy]** - -### pwd -- [ ] **`genpwd` passphrase mode** — add `-w` / `--words N` to generate - word-based passphrases (diceware-style) from `/usr/share/dict/words`. - **[medium]** - -### ssh -- [ ] **SSH agent management** — add `ssh_agent_start` / `ssh_agent_stop` helpers - that start a persistent `ssh-agent`, add configured keys, and survive - re-login via a socket stored in `~/.ssh/agent.env`. **[medium]** -- [ ] **`rmhost` glob support** — allow `rmhost '*.example.com'` to remove all - matching entries in one call. **[easy]** - -### updates -- [ ] **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 - than `UPDT_CHECK_INTERVAL` hours ago (configurable, default 24). **[medium]** -- [ ] **Changelog display** — after a successful `profile_upgrade`, fetch and - display `CHANGELOG.md` entries newer than the previously installed version. - **[medium]** - ---- - -## Infrastructure - -- [ ] **Test suite** — add a `test/` directory with `bats` (Bash Automated - Testing System) unit tests for pure functions (`expandlist`, `genpwd`, - `pwdscore`, `isipv4`, `isipv6`, `parse_conf`, `load_theme`, …). Target for - CI. **[hard]** -- [ ] **CI pipeline** — Gitea Actions (or similar) job that runs `shellcheck` - and the `bats` suite on every push. **[medium]** -- [ ] **`profile_status` function** — print a diagnostic summary: installed - version, active theme, loaded modules, detected Bash version, interactive / - login shell flags, and `profile.conf` path. **[easy]** -- [ ] **`profile_uninstall` function** — remove the `source` line from - `~/.bashrc` / `~/.profile` and optionally delete the install directory, - with a dry-run mode. **[medium]** -- [ ] **`disp` syslog integration** — add a `DISP_SYSLOG=1` config key that - additionally pipes E/W messages to `logger`. **[easy]** -- [ ] **XDG base-dir support** — honour `$XDG_CONFIG_HOME` as an alternative - location for `profile.conf` so users can keep `~` tidy. **[medium]** - **[breaking]** +# profile — to-do list + +Items marked **[easy]**, **[medium]**, or **[hard]** give a rough effort hint. +Items marked **[breaking]** would change existing behaviour and require a +version-bump. + +--- + +## Shell / compatibility + +- [ ] **ZSH compatibility layer** — most functions work already; the remaining + 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 + ZSH users. **[hard]** +- [ ] **Bash completion** — add a `profile.d/completion/` directory and write + `_profile_upgrade`, `_taz`, `_utaz`, `_meteo`, etc. completions so that + `` works on all public functions. **[medium]** +- [ ] **`shellcheck` clean pass** — run `shellcheck -x profile.sh profile.d/*.sh` + and address every remaining warning (currently a handful of SC2034 and SC2086 + items). Integrate as a pre-commit hook. **[easy]** + +--- + +## Prompt & theming + +- [ ] **Git branch in prompt** — show the current branch name (and dirty + indicator) in the PS1 bar when inside a Git repository. Should be + gated behind a `[prompt]` config key so it can be disabled. **[medium]** +- [ ] **Virtual-env / conda indicator** — detect `$VIRTUAL_ENV` / `$CONDA_DEFAULT_ENV` + and display the name in the prompt bar. **[easy]** +- [ ] **True-colour terminal auto-detection** — query `$COLORTERM` and + `$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]** +- [ ] **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 + Solarized themes. **[easy]** _(per theme)_ +- [ ] **Theme preview command** — add a `theme_preview` (or `profile_theme`) + function that renders a colour swatch and a sample prompt line for the + currently loaded theme, so users can evaluate themes without reloading + the session. **[medium]** +- [ ] **`load_theme` — DEFAULTCOL rebuild** — after overriding `DEFAULTFG` and + `DEFAULTBG`, automatically recompute `DEFAULTCOL` from the new values instead + of requiring the theme file to set it explicitly. **[easy]** + +--- + +## Module improvements + +### compress +- [ ] **`taz` progress bar** — show a `pv` / `dd`-based progress indicator when + compressing large trees, gated behind a `-p` flag. **[medium]** +- [ ] **`utaz` integrity check** — run `tar -tOf` / `unzip -t` / `7z t` before + extracting and abort if the archive is corrupt. **[easy]** + +### filefct +- [ ] **`findbig` / `findzero` / `finddead` — `fd` integration** — optionally + use `fd` instead of `find` when available for faster traversal. **[easy]** +- [ ] **`file_stats` — human-readable totals** — add `--human` flag to emit + sizes in K/M/G instead of bytes. **[easy]** + +### info +- [ ] **`showinfo` fallback** — when neither `neofetch` nor `fastfetch` is + installed, print a minimal sysinfo block (hostname, OS, kernel, uptime, + CPU, RAM) using pure Bash + `/proc`. **[medium]** + +### net +- [ ] **`dwl` resume support** — pass `-C -` to curl / `--continue-at -` to + wget for interrupted downloads; gate behind a `-r` flag. **[easy]** +- [ ] **`myextip` multiple providers** — fall back to a secondary URL + (configurable via `MYEXTIP_FALLBACK_URL`) when the primary times out. + **[easy]** + +### packages +- [ ] **Additional backends** — add support for `pacman` (Arch), `apk` (Alpine), + `xbps-query` (Void), and `brew` (macOS). **[medium]** + +### processes +- [ ] **`ku` dry-run flag** — add `-n` / `--dry-run` to print what would be + killed without acting. **[easy]** + +### pwd +- [ ] **`genpwd` passphrase mode** — add `-w` / `--words N` to generate + word-based passphrases (diceware-style) from `/usr/share/dict/words`. + **[medium]** + +### ssh +- [ ] **SSH agent management** — add `ssh_agent_start` / `ssh_agent_stop` helpers + that start a persistent `ssh-agent`, add configured keys, and survive + re-login via a socket stored in `~/.ssh/agent.env`. **[medium]** +- [ ] **`rmhost` glob support** — allow `rmhost '*.example.com'` to remove all + matching entries in one call. **[easy]** + +### updates +- [ ] **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 + than `UPDT_CHECK_INTERVAL` hours ago (configurable, default 24). **[medium]** +- [ ] **Changelog display** — after a successful `profile_upgrade`, fetch and + display `CHANGELOG.md` entries newer than the previously installed version. + **[medium]** + +--- + +## Infrastructure + +- [ ] **Test suite** — add a `test/` directory with `bats` (Bash Automated + Testing System) unit tests for pure functions (`expandlist`, `genpwd`, + `pwdscore`, `isipv4`, `isipv6`, `parse_conf`, `load_theme`, …). Target for + CI. **[hard]** +- [ ] **CI pipeline** — Gitea Actions (or similar) job that runs `shellcheck` + and the `bats` suite on every push. **[medium]** +- [ ] **`profile_status` function** — print a diagnostic summary: installed + version, active theme, loaded modules, detected Bash version, interactive / + login shell flags, and `profile.conf` path. **[easy]** +- [ ] **`profile_uninstall` function** — remove the `source` line from + `~/.bashrc` / `~/.profile` and optionally delete the install directory, + with a dry-run mode. **[medium]** +- [ ] **`disp` syslog integration** — add a `DISP_SYSLOG=1` config key that + additionally pipes E/W messages to `logger`. **[easy]** +- [ ] **XDG base-dir support** — honour `$XDG_CONFIG_HOME` as an alternative + location for `profile.conf` so users can keep `~` tidy. **[medium]** + **[breaking]** diff --git a/profile.d/themes/abyss.theme b/profile.d/themes/abyss.theme index 04f7597..5cfe42c 100755 --- a/profile.d/themes/abyss.theme +++ b/profile.d/themes/abyss.theme @@ -1,42 +1,42 @@ -# Abyss prompt theme — deep ocean navy, electric teal, golden accents -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Inspired by the VS Code "Abyss" theme: deep navy/black backdrop, electric -# teal highlights, golden-yellow accents, cool electric blue for identifiers. -# Palette overrides shift the cooler hues to their high-intensity (electric) -# equivalents — blue becomes IBlue, green shifts toward teal (ICyan). -# ------------------------------------------------------------------------------ - -# Palette overrides — shift colours toward cool electric hues -Blue="\e[0;94m" # electric blue (IBlue — abyss identifier colour) -Green="\e[0;96m" # teal (ICyan — abyss string colour) -Yellow="\e[0;93m" # bright gold (IYellow — abyss constant colour) - -PROMPT_COLOR_TIME_FG="$ICyan" # electric teal clock -PROMPT_COLOR_TIME_BG="$On_Black" # deep black background -PROMPT_COLOR_BAR_BG="$On_Blue" # deep blue bar - -PROMPT_COLOR_OK_FG="$ICyan" # teal on success -PROMPT_COLOR_OK_MARK="$IGreen" # bright teal-green checkmark - -PROMPT_COLOR_ERR_BG="$On_Red" # red background on failure -PROMPT_COLOR_ERR_FG="$IWhite" # bright white text -PROMPT_COLOR_ERR_MARK="$IYellow" # golden X - -PROMPT_COLOR_ROOT_FG="$IRed" # red for root -PROMPT_COLOR_USER_FG="$IBlue" # electric blue for user -PROMPT_COLOR_DIR_FG="$ICyan" # teal path +# Abyss prompt theme — deep ocean navy, electric teal, golden accents +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Inspired by the VS Code "Abyss" theme: deep navy/black backdrop, electric +# teal highlights, golden-yellow accents, cool electric blue for identifiers. +# Palette overrides shift the cooler hues to their high-intensity (electric) +# equivalents — blue becomes IBlue, green shifts toward teal (ICyan). +# ------------------------------------------------------------------------------ + +# Palette overrides — shift colours toward cool electric hues +Blue="\e[0;94m" # electric blue (IBlue — abyss identifier colour) +Green="\e[0;96m" # teal (ICyan — abyss string colour) +Yellow="\e[0;93m" # bright gold (IYellow — abyss constant colour) + +PROMPT_COLOR_TIME_FG="$ICyan" # electric teal clock +PROMPT_COLOR_TIME_BG="$On_Black" # deep black background +PROMPT_COLOR_BAR_BG="$On_Blue" # deep blue bar + +PROMPT_COLOR_OK_FG="$ICyan" # teal on success +PROMPT_COLOR_OK_MARK="$IGreen" # bright teal-green checkmark + +PROMPT_COLOR_ERR_BG="$On_Red" # red background on failure +PROMPT_COLOR_ERR_FG="$IWhite" # bright white text +PROMPT_COLOR_ERR_MARK="$IYellow" # golden X + +PROMPT_COLOR_ROOT_FG="$IRed" # red for root +PROMPT_COLOR_USER_FG="$IBlue" # electric blue for user +PROMPT_COLOR_DIR_FG="$ICyan" # teal path diff --git a/profile.d/themes/adwaita.theme b/profile.d/themes/adwaita.theme index c1dd379..d9f428d 100755 --- a/profile.d/themes/adwaita.theme +++ b/profile.d/themes/adwaita.theme @@ -1,42 +1,42 @@ -# Adwaita prompt theme — clean GNOME defaults, blue accent, green/red status -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Follows the GNOME HIG colour intent: a single calm blue accent (#3584e4), -# pleasant green for success (#33d17a), clear red for errors (#e01b24). -# No intense saturation, no heavy remapping — legibility over spectacle. -# Palette overrides gently shift Blue and Green to their IBlue/IGreen -# variants to better match Adwaita's brighter, flatter tones. -# ------------------------------------------------------------------------------ - -# Palette overrides — align to Adwaita's brighter accent tones -Blue="\e[0;94m" # IBlue → closer to Adwaita blue (#3584e4) -Green="\e[0;92m" # IGreen → closer to Adwaita green (#33d17a) - -PROMPT_COLOR_TIME_FG="$Cyan" # calm cyan clock text -PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background -PROMPT_COLOR_BAR_BG="$On_Blue" # blue main bar (Adwaita accent) - -PROMPT_COLOR_OK_FG="$White" # clean white on success -PROMPT_COLOR_OK_MARK="$Green" # Adwaita green checkmark - -PROMPT_COLOR_ERR_BG="$On_Red" # Adwaita red on failure -PROMPT_COLOR_ERR_FG="$White" # white text -PROMPT_COLOR_ERR_MARK="$Yellow" # yellow X (warning intent) - -PROMPT_COLOR_ROOT_FG="$Red" # Adwaita red for root -PROMPT_COLOR_USER_FG="$IBlue" # Adwaita blue for user -PROMPT_COLOR_DIR_FG="$IGreen" # Adwaita green for path +# Adwaita prompt theme — clean GNOME defaults, blue accent, green/red status +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Follows the GNOME HIG colour intent: a single calm blue accent (#3584e4), +# pleasant green for success (#33d17a), clear red for errors (#e01b24). +# No intense saturation, no heavy remapping — legibility over spectacle. +# Palette overrides gently shift Blue and Green to their IBlue/IGreen +# variants to better match Adwaita's brighter, flatter tones. +# ------------------------------------------------------------------------------ + +# Palette overrides — align to Adwaita's brighter accent tones +Blue="\e[0;94m" # IBlue → closer to Adwaita blue (#3584e4) +Green="\e[0;92m" # IGreen → closer to Adwaita green (#33d17a) + +PROMPT_COLOR_TIME_FG="$Cyan" # calm cyan clock text +PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey clock background +PROMPT_COLOR_BAR_BG="$On_Blue" # blue main bar (Adwaita accent) + +PROMPT_COLOR_OK_FG="$White" # clean white on success +PROMPT_COLOR_OK_MARK="$Green" # Adwaita green checkmark + +PROMPT_COLOR_ERR_BG="$On_Red" # Adwaita red on failure +PROMPT_COLOR_ERR_FG="$White" # white text +PROMPT_COLOR_ERR_MARK="$Yellow" # yellow X (warning intent) + +PROMPT_COLOR_ROOT_FG="$Red" # Adwaita red for root +PROMPT_COLOR_USER_FG="$IBlue" # Adwaita blue for user +PROMPT_COLOR_DIR_FG="$IGreen" # Adwaita green for path diff --git a/profile.d/themes/dark.theme b/profile.d/themes/dark.theme index 7499e8e..c96b036 100755 --- a/profile.d/themes/dark.theme +++ b/profile.d/themes/dark.theme @@ -1,32 +1,32 @@ -# Dark prompt theme — dark grey bar, cyan user, magenta path -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ - -PROMPT_COLOR_TIME_FG="$ICyan" # Clock text -PROMPT_COLOR_TIME_BG="$On_Black" # Clock background (black) -PROMPT_COLOR_BAR_BG="$On_IBlack" # Main bar background (dark grey) - -PROMPT_COLOR_OK_FG="$IGreen" # Exit-code text 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_FG="$BIWhite" # Exit-code text on failure -PROMPT_COLOR_ERR_MARK="$BIYellow" # X mark colour on failure - -PROMPT_COLOR_ROOT_FG="$BIRed" # Username colour when root -PROMPT_COLOR_USER_FG="$ICyan" # Username@host colour for normal users -PROMPT_COLOR_DIR_FG="$IPurple" # Working directory colour +# Dark prompt theme — dark grey bar, cyan user, magenta path +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ + +PROMPT_COLOR_TIME_FG="$ICyan" # Clock text +PROMPT_COLOR_TIME_BG="$On_Black" # Clock background (black) +PROMPT_COLOR_BAR_BG="$On_IBlack" # Main bar background (dark grey) + +PROMPT_COLOR_OK_FG="$IGreen" # Exit-code text 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_FG="$BIWhite" # Exit-code text on failure +PROMPT_COLOR_ERR_MARK="$BIYellow" # X mark colour on failure + +PROMPT_COLOR_ROOT_FG="$BIRed" # Username colour when root +PROMPT_COLOR_USER_FG="$ICyan" # Username@host colour for normal users +PROMPT_COLOR_DIR_FG="$IPurple" # Working directory colour diff --git a/profile.d/themes/default.theme b/profile.d/themes/default.theme index 89dd5f7..3fbafed 100755 --- a/profile.d/themes/default.theme +++ b/profile.d/themes/default.theme @@ -1,32 +1,32 @@ -# Default prompt theme — blue bar, green user, cyan path -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ - -PROMPT_COLOR_TIME_FG="$Blue" # Clock text -PROMPT_COLOR_TIME_BG="$On_IBlack" # Clock background (dark grey) -PROMPT_COLOR_BAR_BG="$On_Blue" # Main bar background - -PROMPT_COLOR_OK_FG="$White" # Exit-code text 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_FG="$White" # Exit-code text on failure -PROMPT_COLOR_ERR_MARK="$BYellow" # X mark colour on failure - -PROMPT_COLOR_ROOT_FG="$Red" # Username colour when root -PROMPT_COLOR_USER_FG="$Green" # Username@host colour for normal users -PROMPT_COLOR_DIR_FG="$ICyan" # Working directory colour +# Default prompt theme — blue bar, green user, cyan path +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ + +PROMPT_COLOR_TIME_FG="$Blue" # Clock text +PROMPT_COLOR_TIME_BG="$On_IBlack" # Clock background (dark grey) +PROMPT_COLOR_BAR_BG="$On_Blue" # Main bar background + +PROMPT_COLOR_OK_FG="$White" # Exit-code text 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_FG="$White" # Exit-code text on failure +PROMPT_COLOR_ERR_MARK="$BYellow" # X mark colour on failure + +PROMPT_COLOR_ROOT_FG="$Red" # Username colour when root +PROMPT_COLOR_USER_FG="$Green" # Username@host colour for normal users +PROMPT_COLOR_DIR_FG="$ICyan" # Working directory colour diff --git a/profile.d/themes/light.theme b/profile.d/themes/light.theme index 61da5d9..17199ca 100755 --- a/profile.d/themes/light.theme +++ b/profile.d/themes/light.theme @@ -1,35 +1,35 @@ -# Light prompt theme — white bar, blue user, purple path -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Opposite of dark.theme: backgrounds flip to bright whites, foregrounds -# 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_BG="$On_IWhite" # Clock background (On_Black → On_IWhite) -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_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_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_ROOT_FG="$Red" # Username when root (BIRed → Red) -PROMPT_COLOR_USER_FG="$Blue" # Username@host normal user (ICyan → Blue) -PROMPT_COLOR_DIR_FG="$Purple" # Working directory (IPurple → Purple) +# Light prompt theme — white bar, blue user, purple path +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Opposite of dark.theme: backgrounds flip to bright whites, foregrounds +# 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_BG="$On_IWhite" # Clock background (On_Black → On_IWhite) +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_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_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_ROOT_FG="$Red" # Username when root (BIRed → Red) +PROMPT_COLOR_USER_FG="$Blue" # Username@host normal user (ICyan → Blue) +PROMPT_COLOR_DIR_FG="$Purple" # Working directory (IPurple → Purple) diff --git a/profile.d/themes/monochrome.theme b/profile.d/themes/monochrome.theme index f9f65ce..f36d2d4 100755 --- a/profile.d/themes/monochrome.theme +++ b/profile.d/themes/monochrome.theme @@ -1,64 +1,64 @@ -# Monochrome prompt theme — strict greyscale, no hue at all -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# All hues are silenced — colour variables are remapped to greyscale ANSI -# codes so that ls, man, grep, etc. also lose their colour cues. Contrast -# is achieved entirely through brightness: dark grey / light grey / white. -# Error state uses an inverted (white background, black text) bar so it -# remains visually distinct without relying on red. -# ------------------------------------------------------------------------------ - -# Palette overrides — replace every hue with a grey equivalent -Red="\e[0;37m" # light grey -Green="\e[0;97m" # bright white (success intent kept as brightest) -Yellow="\e[0;90m" # dark grey -Blue="\e[0;90m" # dark grey -Purple="\e[0;37m" # light grey -Cyan="\e[0;37m" # light grey -BRed="\e[1;37m" # bold light grey -BGreen="\e[1;97m" # bold bright white -BYellow="\e[1;90m" # bold dark grey -BBlue="\e[1;90m" # bold dark grey -BPurple="\e[1;37m" # bold light grey -BCyan="\e[1;37m" # bold light grey -IRed="\e[0;97m" # bright white -IGreen="\e[0;97m" # bright white -IYellow="\e[0;90m" # dark grey -IBlue="\e[0;90m" # dark grey -IPurple="\e[0;37m" # light grey -ICyan="\e[0;37m" # light grey -BIRed="\e[1;97m" # bold bright white -BIGreen="\e[1;97m" # bold bright white -BIYellow="\e[1;90m" # bold dark grey -BIBlue="\e[1;90m" # bold dark grey -BIPurple="\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_BG="$On_IBlack" # dark grey clock background -PROMPT_COLOR_BAR_BG="$On_IBlack" # dark grey main bar - -PROMPT_COLOR_OK_FG="$IWhite" # bright white on success -PROMPT_COLOR_OK_MARK="$BIWhite" # bold bright white checkmark - -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_MARK="$BBlack" # bold black X - -PROMPT_COLOR_ROOT_FG="$BIWhite" # bold bright white for root warning -PROMPT_COLOR_USER_FG="$IWhite" # bright white for normal user -PROMPT_COLOR_DIR_FG="$White" # standard white for path +# Monochrome prompt theme — strict greyscale, no hue at all +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# All hues are silenced — colour variables are remapped to greyscale ANSI +# codes so that ls, man, grep, etc. also lose their colour cues. Contrast +# is achieved entirely through brightness: dark grey / light grey / white. +# Error state uses an inverted (white background, black text) bar so it +# remains visually distinct without relying on red. +# ------------------------------------------------------------------------------ + +# Palette overrides — replace every hue with a grey equivalent +Red="\e[0;37m" # light grey +Green="\e[0;97m" # bright white (success intent kept as brightest) +Yellow="\e[0;90m" # dark grey +Blue="\e[0;90m" # dark grey +Purple="\e[0;37m" # light grey +Cyan="\e[0;37m" # light grey +BRed="\e[1;37m" # bold light grey +BGreen="\e[1;97m" # bold bright white +BYellow="\e[1;90m" # bold dark grey +BBlue="\e[1;90m" # bold dark grey +BPurple="\e[1;37m" # bold light grey +BCyan="\e[1;37m" # bold light grey +IRed="\e[0;97m" # bright white +IGreen="\e[0;97m" # bright white +IYellow="\e[0;90m" # dark grey +IBlue="\e[0;90m" # dark grey +IPurple="\e[0;37m" # light grey +ICyan="\e[0;37m" # light grey +BIRed="\e[1;97m" # bold bright white +BIGreen="\e[1;97m" # bold bright white +BIYellow="\e[1;90m" # bold dark grey +BIBlue="\e[1;90m" # bold dark grey +BIPurple="\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_BG="$On_IBlack" # dark grey clock background +PROMPT_COLOR_BAR_BG="$On_IBlack" # dark grey main bar + +PROMPT_COLOR_OK_FG="$IWhite" # bright white on success +PROMPT_COLOR_OK_MARK="$BIWhite" # bold bright white checkmark + +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_MARK="$BBlack" # bold black X + +PROMPT_COLOR_ROOT_FG="$BIWhite" # bold bright white for root warning +PROMPT_COLOR_USER_FG="$IWhite" # bright white for normal user +PROMPT_COLOR_DIR_FG="$White" # standard white for path diff --git a/profile.d/themes/monokai.theme b/profile.d/themes/monokai.theme index af9e1a2..7719bbf 100755 --- a/profile.d/themes/monokai.theme +++ b/profile.d/themes/monokai.theme @@ -1,45 +1,45 @@ -# Monokai prompt theme — high-saturation, vivid hues on near-black -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Monokai's signature: lime green, orange-yellow, hot pink/red, bright violet, -# electric cyan — all on a near-black (#272822) background. -# Palette overrides remap the dim ANSI regulars to their vivid high-intensity -# equivalents so that ls, grep colour output, etc. also look more "Monokai". -# ------------------------------------------------------------------------------ - -# Palette overrides — boost regular colours to Monokai-vivid equivalents -Red="\e[0;91m" # hot pink/red (#F92672) -Green="\e[0;92m" # lime green (#A6E22E) -Yellow="\e[0;93m" # orange-yellow (#E6DB74 / #FD971F) -Blue="\e[0;94m" # electric blue (#66D9E8 → shift blue) -Purple="\e[0;95m" # bright violet (#AE81FF) -Cyan="\e[0;96m" # electric cyan (#66D9E8) - -PROMPT_COLOR_TIME_FG="$IYellow" # orange clock text -PROMPT_COLOR_TIME_BG="$On_IBlack" # near-black Monokai background -PROMPT_COLOR_BAR_BG="$On_IBlack" # flat dark bar - -PROMPT_COLOR_OK_FG="$IGreen" # lime green on success -PROMPT_COLOR_OK_MARK="$IGreen" # lime green checkmark - -PROMPT_COLOR_ERR_BG="$On_IBlack" # keep dark — use colour for contrast -PROMPT_COLOR_ERR_FG="$IRed" # hot pink on failure -PROMPT_COLOR_ERR_MARK="$IRed" # hot pink X - -PROMPT_COLOR_ROOT_FG="$IRed" # hot pink for root -PROMPT_COLOR_USER_FG="$IYellow" # orange-yellow for user -PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan for path +# Monokai prompt theme — high-saturation, vivid hues on near-black +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Monokai's signature: lime green, orange-yellow, hot pink/red, bright violet, +# electric cyan — all on a near-black (#272822) background. +# Palette overrides remap the dim ANSI regulars to their vivid high-intensity +# equivalents so that ls, grep colour output, etc. also look more "Monokai". +# ------------------------------------------------------------------------------ + +# Palette overrides — boost regular colours to Monokai-vivid equivalents +Red="\e[0;91m" # hot pink/red (#F92672) +Green="\e[0;92m" # lime green (#A6E22E) +Yellow="\e[0;93m" # orange-yellow (#E6DB74 / #FD971F) +Blue="\e[0;94m" # electric blue (#66D9E8 → shift blue) +Purple="\e[0;95m" # bright violet (#AE81FF) +Cyan="\e[0;96m" # electric cyan (#66D9E8) + +PROMPT_COLOR_TIME_FG="$IYellow" # orange clock text +PROMPT_COLOR_TIME_BG="$On_IBlack" # near-black Monokai background +PROMPT_COLOR_BAR_BG="$On_IBlack" # flat dark bar + +PROMPT_COLOR_OK_FG="$IGreen" # lime green on success +PROMPT_COLOR_OK_MARK="$IGreen" # lime green checkmark + +PROMPT_COLOR_ERR_BG="$On_IBlack" # keep dark — use colour for contrast +PROMPT_COLOR_ERR_FG="$IRed" # hot pink on failure +PROMPT_COLOR_ERR_MARK="$IRed" # hot pink X + +PROMPT_COLOR_ROOT_FG="$IRed" # hot pink for root +PROMPT_COLOR_USER_FG="$IYellow" # orange-yellow for user +PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan for path diff --git a/profile.d/themes/plasma.theme b/profile.d/themes/plasma.theme index 633843e..568a456 100755 --- a/profile.d/themes/plasma.theme +++ b/profile.d/themes/plasma.theme @@ -1,42 +1,42 @@ -# Plasma prompt theme — vivid KDE Plasma purples and electric cyan -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Captures the charged, vivid energy of KDE Plasma: dominant bright magenta/ -# purple, electric cyan highlights, all on a dark background. Palette overrides -# boost Blue, Purple, and Cyan to their high-intensity equivalents so that -# shell colour output reflects the same vivid palette. -# ------------------------------------------------------------------------------ - -# Palette overrides — vivid charged hues -Blue="\e[0;94m" # electric blue (IBlue) -Purple="\e[0;95m" # vivid magenta (IPurple — Plasma's signature colour) -Cyan="\e[0;96m" # electric cyan (ICyan) - -PROMPT_COLOR_TIME_FG="$IPurple" # vivid purple clock text -PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey background -PROMPT_COLOR_BAR_BG="$On_Purple" # bright magenta bar - -PROMPT_COLOR_OK_FG="$ICyan" # electric cyan on success -PROMPT_COLOR_OK_MARK="$IGreen" # green checkmark - -PROMPT_COLOR_ERR_BG="$On_Red" # red bar on failure -PROMPT_COLOR_ERR_FG="$IWhite" # bright white text -PROMPT_COLOR_ERR_MARK="$IYellow" # yellow X - -PROMPT_COLOR_ROOT_FG="$IRed" # red for root -PROMPT_COLOR_USER_FG="$BIPurple" # bold vivid purple for user -PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan path +# Plasma prompt theme — vivid KDE Plasma purples and electric cyan +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Captures the charged, vivid energy of KDE Plasma: dominant bright magenta/ +# purple, electric cyan highlights, all on a dark background. Palette overrides +# boost Blue, Purple, and Cyan to their high-intensity equivalents so that +# shell colour output reflects the same vivid palette. +# ------------------------------------------------------------------------------ + +# Palette overrides — vivid charged hues +Blue="\e[0;94m" # electric blue (IBlue) +Purple="\e[0;95m" # vivid magenta (IPurple — Plasma's signature colour) +Cyan="\e[0;96m" # electric cyan (ICyan) + +PROMPT_COLOR_TIME_FG="$IPurple" # vivid purple clock text +PROMPT_COLOR_TIME_BG="$On_IBlack" # dark grey background +PROMPT_COLOR_BAR_BG="$On_Purple" # bright magenta bar + +PROMPT_COLOR_OK_FG="$ICyan" # electric cyan on success +PROMPT_COLOR_OK_MARK="$IGreen" # green checkmark + +PROMPT_COLOR_ERR_BG="$On_Red" # red bar on failure +PROMPT_COLOR_ERR_FG="$IWhite" # bright white text +PROMPT_COLOR_ERR_MARK="$IYellow" # yellow X + +PROMPT_COLOR_ROOT_FG="$IRed" # red for root +PROMPT_COLOR_USER_FG="$BIPurple" # bold vivid purple for user +PROMPT_COLOR_DIR_FG="$ICyan" # electric cyan path diff --git a/profile.d/themes/solarized-light.theme b/profile.d/themes/solarized-light.theme index 419244f..55edcc7 100755 --- a/profile.d/themes/solarized-light.theme +++ b/profile.d/themes/solarized-light.theme @@ -1,127 +1,127 @@ -# Solarized Light prompt theme — exact 24-bit / true-colour palette -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Requires a terminal with true-colour / 24-bit support. -# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' -# If you see solid red text, your terminal supports this theme. -# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) -# -# Solarized Light base tones (inverted vs Dark): -# Base3 #fdf6e3 →253 246 227 (main background — lightest) -# Base2 #eee8d5 →238 232 213 (background highlights) -# Base1 #93a1a1 →147 161 161 (comments / secondary content) -# Base0 #839496 →131 148 150 (body text — secondary) -# Base00 #657b83 →101 123 131 (body text — main on light bg) -# Base01 #586e75 → 88 110 117 (emphasis) -# Base02 #073642 → 7 54 66 (darkest — used for strong contrast) -# -# Accent colours are identical to Solarized Dark: -# Yellow #b58900 →181 137 0 -# Orange #cb4b16 →203 75 22 -# Red #dc322f →220 50 47 -# Magenta #d33682 →211 54 130 -# Violet #6c71c4 →108 113 196 -# Blue #268bd2 → 38 139 210 -# Cyan #2aa198 → 42 161 152 -# Green #859900 →133 153 0 -# ------------------------------------------------------------------------------ - -# ---- Foreground palette overrides ------------------------------------------- -# The accent fg colours are identical to Dark — only the base/neutral roles flip. -# Regular -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 -Green="\e[38;2;133;153;0m" # Green -Yellow="\e[38;2;181;137;0m" # Yellow — primary accent -Blue="\e[38;2;38;139;210m" # Blue -Purple="\e[38;2;211;54;130m" # Magenta -Cyan="\e[38;2;42;161;152m" # Cyan -White="\e[38;2;101;123;131m" # Base00 — main body text on light bg - -# Bold -BBlack="\e[1;38;2;238;232;213m" # Base2 bold -BRed="\e[1;38;2;220;50;47m" # Red bold -BGreen="\e[1;38;2;133;153;0m" # Green bold -BYellow="\e[1;38;2;181;137;0m" # Yellow bold -BBlue="\e[1;38;2;38;139;210m" # Blue bold -BPurple="\e[1;38;2;211;54;130m" # Magenta bold -BCyan="\e[1;38;2;42;161;152m" # Cyan bold -BWhite="\e[1;38;2;88;110;117m" # Base01 bold — emphasis text - -# High intensity (emphasis / I* family) -IBlack="\e[38;2;147;161;161m" # Base1 — secondary/comments -IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" -IGreen="\e[38;2;133;153;0m" # Green (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" -IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) -ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) -IWhite="\e[38;2;88;110;117m" # Base01 — emphasis - -# Bold high intensity -BIBlack="\e[1;38;2;147;161;161m" # Base1 bold -BIRed="\e[1;38;2;203;75;22m" # Orange bold -BIGreen="\e[1;38;2;133;153;0m" # Green bold -BIYellow="\e[1;38;2;181;137;0m" # Yellow bold -BIBlue="\e[1;38;2;108;113;196m" # Violet bold -BIPurple="\e[1;38;2;211;54;130m" # Magenta bold -BICyan="\e[1;38;2;42;161;152m" # Cyan bold -BIWhite="\e[1;38;2;88;110;117m" # Base01 bold - -# ---- Background palette overrides ------------------------------------------- -# Light bases flip: On_Black → Base3 (lightest), On_IBlack → Base2 (highlights) -On_Black="\e[48;2;253;246;227m" # Base3 — main light background -On_Red="\e[48;2;220;50;47m" # Red -On_Green="\e[48;2;133;153;0m" # Green -On_Yellow="\e[48;2;181;137;0m" # Yellow -On_Blue="\e[48;2;38;139;210m" # Blue -On_Purple="\e[48;2;211;54;130m" # Magenta -On_Cyan="\e[48;2;42;161;152m" # Cyan -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_IRed="\e[48;2;203;75;22m" # Orange -On_IGreen="\e[48;2;133;153;0m" # Green -On_IYellow="\e[48;2;181;137;0m" # Yellow -On_IBlue="\e[48;2;108;113;196m" # Violet -On_IPurple="\e[48;2;211;54;130m" # Magenta -On_ICyan="\e[48;2;42;161;152m" # Cyan -On_IWhite="\e[48;2;88;110;117m" # Base01 - -# ---- Special codes ---------------------------------------------------------- -DEFAULTFG="\e[38;2;101;123;131m" # Base00 — default foreground on light bg -DEFAULTBG="\e[48;2;253;246;227m" # Base3 — default background -RESETCOL="\e[0m" - -# ---- Prompt colour slots ---------------------------------------------------- -# All specified as direct ANSI sequences to avoid ordering dependencies -# with the palette overrides above. - -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_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_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_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_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_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory +# Solarized Light prompt theme — exact 24-bit / true-colour palette +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Requires a terminal with true-colour / 24-bit support. +# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' +# If you see solid red text, your terminal supports this theme. +# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) +# +# Solarized Light base tones (inverted vs Dark): +# Base3 #fdf6e3 →253 246 227 (main background — lightest) +# Base2 #eee8d5 →238 232 213 (background highlights) +# Base1 #93a1a1 →147 161 161 (comments / secondary content) +# Base0 #839496 →131 148 150 (body text — secondary) +# Base00 #657b83 →101 123 131 (body text — main on light bg) +# Base01 #586e75 → 88 110 117 (emphasis) +# Base02 #073642 → 7 54 66 (darkest — used for strong contrast) +# +# Accent colours are identical to Solarized Dark: +# Yellow #b58900 →181 137 0 +# Orange #cb4b16 →203 75 22 +# Red #dc322f →220 50 47 +# Magenta #d33682 →211 54 130 +# Violet #6c71c4 →108 113 196 +# Blue #268bd2 → 38 139 210 +# Cyan #2aa198 → 42 161 152 +# Green #859900 →133 153 0 +# ------------------------------------------------------------------------------ + +# ---- Foreground palette overrides ------------------------------------------- +# The accent fg colours are identical to Dark — only the base/neutral roles flip. +# Regular +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 +Green="\e[38;2;133;153;0m" # Green +Yellow="\e[38;2;181;137;0m" # Yellow — primary accent +Blue="\e[38;2;38;139;210m" # Blue +Purple="\e[38;2;211;54;130m" # Magenta +Cyan="\e[38;2;42;161;152m" # Cyan +White="\e[38;2;101;123;131m" # Base00 — main body text on light bg + +# Bold +BBlack="\e[1;38;2;238;232;213m" # Base2 bold +BRed="\e[1;38;2;220;50;47m" # Red bold +BGreen="\e[1;38;2;133;153;0m" # Green bold +BYellow="\e[1;38;2;181;137;0m" # Yellow bold +BBlue="\e[1;38;2;38;139;210m" # Blue bold +BPurple="\e[1;38;2;211;54;130m" # Magenta bold +BCyan="\e[1;38;2;42;161;152m" # Cyan bold +BWhite="\e[1;38;2;88;110;117m" # Base01 bold — emphasis text + +# High intensity (emphasis / I* family) +IBlack="\e[38;2;147;161;161m" # Base1 — secondary/comments +IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" +IGreen="\e[38;2;133;153;0m" # Green (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" +IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) +ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) +IWhite="\e[38;2;88;110;117m" # Base01 — emphasis + +# Bold high intensity +BIBlack="\e[1;38;2;147;161;161m" # Base1 bold +BIRed="\e[1;38;2;203;75;22m" # Orange bold +BIGreen="\e[1;38;2;133;153;0m" # Green bold +BIYellow="\e[1;38;2;181;137;0m" # Yellow bold +BIBlue="\e[1;38;2;108;113;196m" # Violet bold +BIPurple="\e[1;38;2;211;54;130m" # Magenta bold +BICyan="\e[1;38;2;42;161;152m" # Cyan bold +BIWhite="\e[1;38;2;88;110;117m" # Base01 bold + +# ---- Background palette overrides ------------------------------------------- +# Light bases flip: On_Black → Base3 (lightest), On_IBlack → Base2 (highlights) +On_Black="\e[48;2;253;246;227m" # Base3 — main light background +On_Red="\e[48;2;220;50;47m" # Red +On_Green="\e[48;2;133;153;0m" # Green +On_Yellow="\e[48;2;181;137;0m" # Yellow +On_Blue="\e[48;2;38;139;210m" # Blue +On_Purple="\e[48;2;211;54;130m" # Magenta +On_Cyan="\e[48;2;42;161;152m" # Cyan +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_IRed="\e[48;2;203;75;22m" # Orange +On_IGreen="\e[48;2;133;153;0m" # Green +On_IYellow="\e[48;2;181;137;0m" # Yellow +On_IBlue="\e[48;2;108;113;196m" # Violet +On_IPurple="\e[48;2;211;54;130m" # Magenta +On_ICyan="\e[48;2;42;161;152m" # Cyan +On_IWhite="\e[48;2;88;110;117m" # Base01 + +# ---- Special codes ---------------------------------------------------------- +DEFAULTFG="\e[38;2;101;123;131m" # Base00 — default foreground on light bg +DEFAULTBG="\e[48;2;253;246;227m" # Base3 — default background +RESETCOL="\e[0m" + +# ---- Prompt colour slots ---------------------------------------------------- +# All specified as direct ANSI sequences to avoid ordering dependencies +# with the palette overrides above. + +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_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_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_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_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_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory diff --git a/profile.d/themes/solarized.theme b/profile.d/themes/solarized.theme index f67dc4a..412b263 100755 --- a/profile.d/themes/solarized.theme +++ b/profile.d/themes/solarized.theme @@ -1,122 +1,122 @@ -# Solarized Dark prompt theme — exact 24-bit / true-colour palette -# ------------------------------------------------------------------------------ -# Theme files are NOT executed as shell scripts. load_theme() parses them -# line by line. Only the following value forms are accepted: -# -# KEY="$ColorVarName" — reference to a colour variable from disp.sh -# KEY="${ColorVarName}" — same with braces -# KEY="\e[...m" — raw ANSI escape sequence (single block) -# -# Accepted keys: -# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) -# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette -# from disp.sh for the whole shell session) -# -# Any unknown key, unsafe value, or shell construct will be ignored with a -# warning — theme files cannot execute code. -# ------------------------------------------------------------------------------ -# Requires a terminal with true-colour / 24-bit support. -# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' -# If you see solid red text, your terminal supports this theme. -# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) -# -# Solarized Dark exact hex → RGB mapping used below: -# Base03 #002b36 → 0 43 54 (darkest background) -# Base02 #073642 → 7 54 66 (background highlights) -# Base01 #586e75 → 88 110 117 (comments / secondary content) -# Base00 #657b83 →101 123 131 (body text — dark background) -# Base0 #839496 →131 148 150 (body text — main) -# Base1 #93a1a1 →147 161 161 (optional emphasis) -# Yellow #b58900 →181 137 0 -# Orange #cb4b16 →203 75 22 -# Red #dc322f →220 50 47 -# Magenta #d33682 →211 54 130 -# Violet #6c71c4 →108 113 196 -# Blue #268bd2 → 38 139 210 -# Cyan #2aa198 → 42 161 152 -# Green #859900 →133 153 0 -# ------------------------------------------------------------------------------ - -# ---- Foreground palette overrides ------------------------------------------- -# Regular -Black="\e[38;2;0;43;54m" # Base03 — darkest content fg -Red="\e[38;2;220;50;47m" # Red -Green="\e[38;2;133;153;0m" # Green -Yellow="\e[38;2;181;137;0m" # Yellow — primary accent -Blue="\e[38;2;38;139;210m" # Blue -Purple="\e[38;2;211;54;130m" # Magenta -Cyan="\e[38;2;42;161;152m" # Cyan -White="\e[38;2;131;148;150m" # Base0 — body text - -# Bold -BBlack="\e[1;38;2;7;54;66m" # Base02 bold -BRed="\e[1;38;2;220;50;47m" # Red bold -BGreen="\e[1;38;2;133;153;0m" # Green bold -BYellow="\e[1;38;2;181;137;0m" # Yellow bold -BBlue="\e[1;38;2;38;139;210m" # Blue bold -BPurple="\e[1;38;2;211;54;130m" # Magenta bold -BCyan="\e[1;38;2;42;161;152m" # Cyan bold -BWhite="\e[1;38;2;147;161;161m" # Base1 bold - -# High intensity (brighter / emphasis roles in Solarized) -IBlack="\e[38;2;88;110;117m" # Base01 — secondary/comments -IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" -IGreen="\e[38;2;133;153;0m" # Green (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" -IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) -ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) -IWhite="\e[38;2;147;161;161m" # Base1 — optional emphasis - -# Bold high intensity -BIBlack="\e[1;38;2;88;110;117m" # Base01 bold -BIRed="\e[1;38;2;203;75;22m" # Orange bold -BIGreen="\e[1;38;2;133;153;0m" # Green bold -BIYellow="\e[1;38;2;181;137;0m" # Yellow bold -BIBlue="\e[1;38;2;108;113;196m" # Violet bold -BIPurple="\e[1;38;2;211;54;130m" # Magenta bold -BICyan="\e[1;38;2;42;161;152m" # Cyan bold -BIWhite="\e[1;38;2;147;161;161m" # Base1 bold - -# ---- Background palette overrides ------------------------------------------- -On_Black="\e[48;2;0;43;54m" # Base03 -On_Red="\e[48;2;220;50;47m" # Red -On_Green="\e[48;2;133;153;0m" # Green -On_Yellow="\e[48;2;181;137;0m" # Yellow -On_Blue="\e[48;2;38;139;210m" # Blue -On_Purple="\e[48;2;211;54;130m" # Magenta -On_Cyan="\e[48;2;42;161;152m" # Cyan -On_White="\e[48;2;131;148;150m" # Base0 - -On_IBlack="\e[48;2;7;54;66m" # Base02 — background highlights -On_IRed="\e[48;2;203;75;22m" # Orange -On_IGreen="\e[48;2;133;153;0m" # Green -On_IYellow="\e[48;2;181;137;0m" # Yellow -On_IBlue="\e[48;2;108;113;196m" # Violet -On_IPurple="\e[48;2;211;54;130m" # Magenta -On_ICyan="\e[48;2;42;161;152m" # Cyan -On_IWhite="\e[48;2;147;161;161m" # Base1 - -# ---- Special codes ---------------------------------------------------------- -DEFAULTFG="\e[38;2;131;148;150m" # Base0 — default foreground -DEFAULTBG="\e[48;2;0;43;54m" # Base03 — default background -RESETCOL="\e[0m" - -# ---- Prompt colour slots ---------------------------------------------------- -# All specified as direct ANSI sequences to avoid ordering dependencies -# with the palette overrides above. - -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_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_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_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_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_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory +# Solarized Dark prompt theme — exact 24-bit / true-colour palette +# ------------------------------------------------------------------------------ +# Theme files are NOT executed as shell scripts. load_theme() parses them +# line by line. Only the following value forms are accepted: +# +# KEY="$ColorVarName" — reference to a colour variable from disp.sh +# KEY="${ColorVarName}" — same with braces +# KEY="\e[...m" — raw ANSI escape sequence (single block) +# +# Accepted keys: +# PROMPT_COLOR_* — prompt slot colours (see profile.conf [prompt]) +# Standard colour vars — Black, Blue, On_IBlack, … (overrides the palette +# from disp.sh for the whole shell session) +# +# Any unknown key, unsafe value, or shell construct will be ignored with a +# warning — theme files cannot execute code. +# ------------------------------------------------------------------------------ +# Requires a terminal with true-colour / 24-bit support. +# Check with: printf '\e[38;2;220;50;47mred\e[0m\n' +# If you see solid red text, your terminal supports this theme. +# (konsole, iTerm2, kitty, alacritty, Windows Terminal all do) +# +# Solarized Dark exact hex → RGB mapping used below: +# Base03 #002b36 → 0 43 54 (darkest background) +# Base02 #073642 → 7 54 66 (background highlights) +# Base01 #586e75 → 88 110 117 (comments / secondary content) +# Base00 #657b83 →101 123 131 (body text — dark background) +# Base0 #839496 →131 148 150 (body text — main) +# Base1 #93a1a1 →147 161 161 (optional emphasis) +# Yellow #b58900 →181 137 0 +# Orange #cb4b16 →203 75 22 +# Red #dc322f →220 50 47 +# Magenta #d33682 →211 54 130 +# Violet #6c71c4 →108 113 196 +# Blue #268bd2 → 38 139 210 +# Cyan #2aa198 → 42 161 152 +# Green #859900 →133 153 0 +# ------------------------------------------------------------------------------ + +# ---- Foreground palette overrides ------------------------------------------- +# Regular +Black="\e[38;2;0;43;54m" # Base03 — darkest content fg +Red="\e[38;2;220;50;47m" # Red +Green="\e[38;2;133;153;0m" # Green +Yellow="\e[38;2;181;137;0m" # Yellow — primary accent +Blue="\e[38;2;38;139;210m" # Blue +Purple="\e[38;2;211;54;130m" # Magenta +Cyan="\e[38;2;42;161;152m" # Cyan +White="\e[38;2;131;148;150m" # Base0 — body text + +# Bold +BBlack="\e[1;38;2;7;54;66m" # Base02 bold +BRed="\e[1;38;2;220;50;47m" # Red bold +BGreen="\e[1;38;2;133;153;0m" # Green bold +BYellow="\e[1;38;2;181;137;0m" # Yellow bold +BBlue="\e[1;38;2;38;139;210m" # Blue bold +BPurple="\e[1;38;2;211;54;130m" # Magenta bold +BCyan="\e[1;38;2;42;161;152m" # Cyan bold +BWhite="\e[1;38;2;147;161;161m" # Base1 bold + +# High intensity (brighter / emphasis roles in Solarized) +IBlack="\e[38;2;88;110;117m" # Base01 — secondary/comments +IRed="\e[38;2;203;75;22m" # Orange — Solarized's "bright red" +IGreen="\e[38;2;133;153;0m" # Green (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" +IPurple="\e[38;2;211;54;130m" # Magenta (no brighter variant) +ICyan="\e[38;2;42;161;152m" # Cyan (no brighter variant) +IWhite="\e[38;2;147;161;161m" # Base1 — optional emphasis + +# Bold high intensity +BIBlack="\e[1;38;2;88;110;117m" # Base01 bold +BIRed="\e[1;38;2;203;75;22m" # Orange bold +BIGreen="\e[1;38;2;133;153;0m" # Green bold +BIYellow="\e[1;38;2;181;137;0m" # Yellow bold +BIBlue="\e[1;38;2;108;113;196m" # Violet bold +BIPurple="\e[1;38;2;211;54;130m" # Magenta bold +BICyan="\e[1;38;2;42;161;152m" # Cyan bold +BIWhite="\e[1;38;2;147;161;161m" # Base1 bold + +# ---- Background palette overrides ------------------------------------------- +On_Black="\e[48;2;0;43;54m" # Base03 +On_Red="\e[48;2;220;50;47m" # Red +On_Green="\e[48;2;133;153;0m" # Green +On_Yellow="\e[48;2;181;137;0m" # Yellow +On_Blue="\e[48;2;38;139;210m" # Blue +On_Purple="\e[48;2;211;54;130m" # Magenta +On_Cyan="\e[48;2;42;161;152m" # Cyan +On_White="\e[48;2;131;148;150m" # Base0 + +On_IBlack="\e[48;2;7;54;66m" # Base02 — background highlights +On_IRed="\e[48;2;203;75;22m" # Orange +On_IGreen="\e[48;2;133;153;0m" # Green +On_IYellow="\e[48;2;181;137;0m" # Yellow +On_IBlue="\e[48;2;108;113;196m" # Violet +On_IPurple="\e[48;2;211;54;130m" # Magenta +On_ICyan="\e[48;2;42;161;152m" # Cyan +On_IWhite="\e[48;2;147;161;161m" # Base1 + +# ---- Special codes ---------------------------------------------------------- +DEFAULTFG="\e[38;2;131;148;150m" # Base0 — default foreground +DEFAULTBG="\e[48;2;0;43;54m" # Base03 — default background +RESETCOL="\e[0m" + +# ---- Prompt colour slots ---------------------------------------------------- +# All specified as direct ANSI sequences to avoid ordering dependencies +# with the palette overrides above. + +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_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_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_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_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_DIR_FG="\e[38;2;38;139;210m" # Blue — working directory