diff --git a/.github/workflows/pr-examples-tests.yml b/.github/workflows/pr-examples-tests.yml index 7cd046f..d1d4fbd 100644 --- a/.github/workflows/pr-examples-tests.yml +++ b/.github/workflows/pr-examples-tests.yml @@ -24,7 +24,7 @@ jobs: - tanaab steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Install Bun uses: oven-sh/setup-bun@v2 with: diff --git a/.github/workflows/pr-linter.yml b/.github/workflows/pr-linter.yml index eb1a388..9032523 100644 --- a/.github/workflows/pr-linter.yml +++ b/.github/workflows/pr-linter.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Install Bun uses: oven-sh/setup-bun@v2 with: diff --git a/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index a32b27a..15efb78 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -18,7 +18,7 @@ jobs: - macos-26 steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Install Bun uses: oven-sh/setup-bun@v2 with: diff --git a/.github/workflows/release-tests.yml b/.github/workflows/release-tests.yml index 5e0a635..e417368 100644 --- a/.github/workflows/release-tests.yml +++ b/.github/workflows/release-tests.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 - name: Install Bun diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f56c878..e81192d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-24.04 steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 - name: Install Bun diff --git a/.taplo.toml b/.taplo.toml new file mode 100644 index 0000000..4d7ac72 --- /dev/null +++ b/.taplo.toml @@ -0,0 +1 @@ +exclude = ["dotfiles/warp/.warp/settings.toml"] diff --git a/ADVANCED.md b/ADVANCED.md index aef2b5e..d5098ec 100644 --- a/ADVANCED.md +++ b/ADVANCED.md @@ -33,10 +33,19 @@ Agentbox keeps its formula-backed Tailscale runtime in control. - [`hyperdrive`](./dotfiles/hyperdrive): Hyperdrive application configuration. - [`lando`](./dotfiles/lando): Lando configuration. - [`ssh`](./dotfiles/ssh): SSH configuration and public-key material. -- [`theme`](./dotfiles/theme): Tanaab light and dark theme assets. -- [`vim`](./dotfiles/vim): Vim wrapper and customization files. The Janus runtime remains an - external dependency expected at `~/.vim/janus/vim`. -- [`zsh`](./dotfiles/zsh): shell and prompt configuration. +- [`theme`](./dotfiles/theme): low-level portable Tanaab color palette for application-specific + theme assets. +- [`vim`](./dotfiles/vim): self-contained Vim configuration with native packages and a + terminal-driven Tanaab theme. +- [`vscode`](./dotfiles/vscode): cleaned Visual Studio Code user settings and the local + `tanaabased.theme` extension with Tanaab and Tanaab Solarized dark and light variants. +- [`warp`](./dotfiles/warp): file-backed Warp terminal settings and Tanaab and Tanaab Solarized + dark and light themes. +- [`zsh`](./dotfiles/zsh): framework-free Zsh environment, history, completion, and fallback prompt. + +The Vim profile uses native runtime packages and maps its `tanaab` colorscheme onto the terminal's +ANSI palette, allowing it to follow the active Tanaab Warp theme without a separate Vim theme +selection or external runtime. ### Codex Plugin And Skills @@ -248,6 +257,12 @@ The Codex configuration under `dotfiles/ai` uses three layers: notifications, marketplace paths, plugin cache paths, and other machine-specific values. - `~/.codex/config.toml` is generated from the shared and local inputs; do not edit it directly. +Custom Codex TUI syntax themes live under `dotfiles/ai/.codex/themes/`. Tanaab Solarized Dark is the +default and preserves ANSI syntax colors from the active terminal palette while supplying its own +Warp-matched diff backgrounds. When using Tanaab Dark, Tanaab Light, or Tanaab Solarized Light, +switch `[tui].theme` to `ansi` so Codex follows the active Warp palette without applying those +dark-specific fills. + Local configuration may add settings alongside shared tables, but it may not override an exact key owned by the shared file. diff --git a/AGENTS.md b/AGENTS.md index 04d74c5..53c43c0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,6 +45,8 @@ This is directional guidance, not an expansion of the current public contract: - `Brewfile`: Homebrew package and application inventory, including the canonical `tailscale-app` desktop cask used outside Agentbox hosts. - `dotfiles/*`: top-level GNU Stow packages applied to `$HOME`. +- `dotfiles/theme/colors.json`: lowest-level portable Tanaab color palette and source of truth for + application-specific theme assets. - `.codex-plugin/`, `.mcp.json`, `assets/`, `bin/`, `lib/`, `skills/`, and `utils/`: `piroplugin` package inputs and local Codex tooling. - `README.md`: primary setup and usage entrypoint; `ADVANCED.md`: installed components, complete @@ -137,6 +139,8 @@ This is directional guidance, not an expansion of the current public contract: `bun run codex:validate`, `bun run codex:check`, and `bun run codex:sync`. - Treat `dotfiles/ai` as a separate Stow-owned surface. Use `bun run ai:sync` for home-directory restow work, not for plugin cache refreshes. +- Keep `dotfiles/ai/.agents/plugins/marketplace.json` plugin entries sorted first by category, with + `Pirobased` before `Tanaab-based`, and then alphabetically by plugin name within each category. - Treat `$piro-me-readiness` as read-only verification of this checkout and macOS user profile. It must not become setup, token management, environment management, GitHub or monday automation, release, Leia, or general machine administration. @@ -159,7 +163,7 @@ This is directional guidance, not an expansion of the current public contract: `skills/me-readiness/SKILL.md`. - Keep readiness capability-based: Homebrew write access, every Brewfile formula, required core commands, complete repo-owned dotfiles, generated Codex config, `piroplugin`, and GitHub identity - are hard requirements. Brewfile casks, Janus, 1Password, Tailscale, and monday are warnings. + are hard requirements. Brewfile casks, 1Password, Tailscale, and monday are warnings. - Update the owning source first, then readiness only when the prerequisite is stable, repo-owned, read-only, and machine-verifiable: - Brew packages belong in `Brewfile`; discover formulas and casks from that file instead of diff --git a/Brewfile b/Brewfile index 293be5d..6f6c691 100644 --- a/Brewfile +++ b/Brewfile @@ -18,5 +18,6 @@ brew "jq" brew "node@24" brew "python@3.14" brew "stow" +brew "vim" brew "zsh" brew "oven-sh/bun/bun" diff --git a/CHANGELOG.md b/CHANGELOG.md index 02d6540..8702d78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,12 @@ ## {{ UNRELEASED_VERSION }} - [{{ UNRELEASED_DATE }}]({{ UNRELEASED_LINK }}) +- Added a `warp` dotpkg with file-backed settings and Tanaab and Tanaab Solarized dark and light + themes. [#32](https://github.com/pirog/me/pull/32) - Added published `/llms.txt` metadata and an advanced configuration reference. +- Removed Oh My Zsh and Powerlevel10k from the personal shell profile. [#32](https://github.com/pirog/me/pull/32) - Removed public `--me` and `PIROME_ME` source selection from `boot.sh`. +- Replaced the external Janus Vim runtime with Homebrew Vim and a self-contained terminal-native + Tanaab profile. [#32](https://github.com/pirog/me/pull/32) - Updated `boot.sh` to resolve explicit, source-relative, existing, or SSH-cloned `@pirog/me` payloads. - Updated detected Agentbox hosts to skip desktop 1Password and Tailscale casks and use daemon-aware readiness. - Updated portable Codex defaults to use `gpt-5.6`. diff --git a/TASKS.md b/TASKS.md index 0db2003..9f1b790 100644 --- a/TASKS.md +++ b/TASKS.md @@ -1,40 +1,46 @@ # FINAL THINGS - @pirog/me - - themes - - codex - - warp - remove OHMYZSH? - warp settings in dotfile? - - vscode? - - vim settings? - - TUI theme? - - - add agentbox plugin to marketplace? - - - remote management and authorized keys? - - review sudo stuff? do we really need it? always run as admin? - - ips for pirobook and tanaabbook? - - shouldnt i just run @pirog/me? + - blog like pirog skill +- @tanaabased/canon - issue MGMT STUFF ASAP? - milestone creation - issue creation|triage|etc - labels|fields|etc? - - blog like pirog skill - - repo setup skills + + - repo setup/standardization skills - normal settings - branch protection - add tanabot 2 repo w write access - suggest 3 good tags skill - verify repo / repo audit + - skill to autotag repos + + - org standardizer? + - list of repo tags + + - fixes + - release skill should always be against main unless explicitly said otherwise + - js skills should work for ts as well? + + - longer term + - "keeper of the faith" + - some kind of tanaab-coach/advisor skill? + - a brand enforcer skill (better as separate agent now?) + - adoption of schema|error|cli frameworks? + - organizatinal model for leia tests eg inputs|defaults|feature-x? + - commit behavior? + - if you have a list of things to do then commit one per list item + - message syntax and formatting? - @tanaabased/agentbox - verify - openclaw update|not? - OPENCLAW_MDNS_HOSTNAME - end of flow should be more concise with link to run full command? + - get/save token value - add to codex via phone? @@ -142,6 +148,7 @@ - markdown files for agents? - https://github.com/okineadev/vitepress-plugin-llms - accent colors + - move pirog/me themes over here and add symlinks in dot/packages? - ELEMENTS - form page and lock down presentation? @@ -188,28 +195,6 @@ - warning if keys exist? - make into bun cli as well? -- @tanaabased/canon - - some kind of tanaab-coach/advisor skill? - - a brand enforcer skill (better as agent now?) - - vscode theme and shiki and warp styles? - - issue manager|author? - - work on issue skill? - - milestone creator w/ monday syncher? - - milestone form idea - - repo standardization? - - THEME stuff for fun? - - release skill should always be against main unless explicitly said otherwise - - skill to autotag repos - - list of repo tags - - js skills should work for ts as well? - - adoption of schema|error|cli frameworks? - - organizatinal model for leia tests eg inputs|defaults|feature-x? - - leia handling of ${} envvar brackets? - - maybe should just add support in @lando/leia? - - commit behavior? - - if you have a list of things to do then commit one per list item - - message syntax and formatting? - - @tanaabased/website - rebase on THEME - get blog rolling diff --git a/bun.lock b/bun.lock index 9fe3af3..85fe68f 100644 --- a/bun.lock +++ b/bun.lock @@ -7,11 +7,11 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@lando/leia": "^1.0.0-beta.4", - "eslint": "^10.4.1", + "eslint": "^10.7.0", "eslint-config-prettier": "^10.1.1", - "globals": "^17.6.0", + "globals": "^17.7.0", "mocha": "^11.7.6", - "prettier": "^3.8.3", + "prettier": "^3.9.5", "shellcheck": "^4.1.0", }, }, @@ -239,7 +239,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + "eslint": ["eslint@10.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ=="], "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], @@ -319,7 +319,7 @@ "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], - "globals": ["globals@17.6.0", "", {}, "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA=="], + "globals": ["globals@17.7.0", "", {}, "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -485,7 +485,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="], + "prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="], "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], diff --git a/dotfiles/ai/.agents/plugins/marketplace.json b/dotfiles/ai/.agents/plugins/marketplace.json index 05b57c2..c164415 100644 --- a/dotfiles/ai/.agents/plugins/marketplace.json +++ b/dotfiles/ai/.agents/plugins/marketplace.json @@ -5,10 +5,22 @@ }, "plugins": [ { - "name": "tanaab", + "name": "piroplugin", "source": { "source": "local", - "path": "./.codex/plugins/tanaab" + "path": "./.codex/plugins/piroplugin" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Pirobased" + }, + { + "name": "agentbox", + "source": { + "source": "local", + "path": "./.codex/plugins/agentbox" }, "policy": { "installation": "AVAILABLE", @@ -17,16 +29,16 @@ "category": "Tanaab-based" }, { - "name": "piroplugin", + "name": "tanaab", "source": { "source": "local", - "path": "./.codex/plugins/piroplugin" + "path": "./.codex/plugins/tanaab" }, "policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" }, - "category": "Pirobased" + "category": "Tanaab-based" } ] } diff --git a/dotfiles/ai/.codex/config.shared.toml b/dotfiles/ai/.codex/config.shared.toml index 53eefee..ec0e692 100644 --- a/dotfiles/ai/.codex/config.shared.toml +++ b/dotfiles/ai/.codex/config.shared.toml @@ -14,6 +14,11 @@ fast_mode = true [memories] disable_on_external_context = true +[tui] +# Use `ansi` with Tanaab Dark, Tanaab Light, or Tanaab Solarized Light. +# theme = "ansi" +theme = "tanaab-solarized-dark" + [desktop] appearanceTheme = "system" appearanceLightCodeThemeId = "codex" diff --git a/dotfiles/ai/.codex/themes/tanaab-solarized-dark.tmTheme b/dotfiles/ai/.codex/themes/tanaab-solarized-dark.tmTheme new file mode 100644 index 0000000..af24ab1 --- /dev/null +++ b/dotfiles/ai/.codex/themes/tanaab-solarized-dark.tmTheme @@ -0,0 +1,367 @@ + + + + + + author + @pirog + name + Tanaab Solarized Dark + colorSpaceName + sRGB + settings + + + settings + + background + #00000001 + foreground + #00000001 + gutter + #00000001 + gutterForeground + #00000001 + + + + name + Comments + scope + comment, punctuation.definition.comment + settings + + foreground + #02000000 + + + + name + Keywords + scope + keyword + settings + + foreground + #05000000 + + + + name + Functions + scope + entity.name.function, meta.require, support.function.any-method + settings + + foreground + #04000000 + + + + name + Labels + scope + entity.name.label, variable.parameter + settings + + foreground + #06000000 + + + + name + Classes + scope + support.class, entity.name.class, entity.name.type.class, entity.name + settings + + foreground + #03000000 + + + + name + Methods + scope + keyword.other.special-method + settings + + foreground + #04000000 + + + + name + Storage + scope + storage + settings + + foreground + #05000000 + + + + name + Support + scope + support.function + settings + + foreground + #06000000 + + + + name + Strings, Inherited Class + scope + string, constant.other.symbol, entity.other.inherited-class + settings + + foreground + #02000000 + + + + name + Numbers and Constants + scope + constant.numeric, constant + settings + + foreground + #03000000 + + + + name + Tags + scope + entity.name.tag + settings + + foreground + #01000000 + + + + name + Attributes + scope + entity.other.attribute-name + settings + + foreground + #03000000 + + + + name + Attribute IDs + scope + entity.other.attribute-name.id, punctuation.definition.entity + settings + + foreground + #04000000 + + + + name + Selectors + scope + meta.selector + settings + + foreground + #05000000 + + + + name + Headings + scope + markup.heading punctuation.definition.heading, entity.name.section, markup.heading - text.html.markdown, meta.mapping.key string.quoted.double + settings + + fontStyle + + foreground + #04000000 + + + + name + Units + scope + keyword.other.unit + settings + + foreground + #03000000 + + + + name + Bold + scope + markup.bold, punctuation.definition.bold + settings + + fontStyle + bold + foreground + #03000000 + + + + name + Italic + scope + markup.italic, punctuation.definition.italic + settings + + fontStyle + italic + foreground + #05000000 + + + + name + Inline Code + scope + markup.raw.inline + settings + + foreground + #02000000 + + + + name + Link Text + scope + string.other.link, punctuation.definition.string.end.markdown, punctuation.definition.string.begin.markdown + settings + + foreground + #01000000 + + + + name + Link URLs + scope + meta.link + settings + + foreground + #03000000 + + + + name + Quotes + scope + markup.quote + settings + + foreground + #03000000 + + + + name + Inserted + scope + markup.inserted + settings + + background + #1f4e53 + foreground + #02000000 + + + + name + Deleted + scope + markup.deleted + settings + + background + #383a4f + foreground + #01000000 + + + + name + Changed + scope + markup.changed + settings + + foreground + #05000000 + + + + name + Colors and Regular Expressions + scope + constant.other.color, string.regexp, constant.character.escape + settings + + foreground + #06000000 + + + + name + Embedded + scope + punctuation.section.embedded, variable.interpolation + settings + + foreground + #05000000 + + + + name + Illegal + scope + invalid.illegal + settings + + background + #01000000 + + + + name + Broken + scope + invalid.broken + settings + + background + #03000000 + + + + uuid + 8A318B8E-4D29-4A14-BFCE-8E37C59E3439 + + diff --git a/dotfiles/theme/colors.json b/dotfiles/theme/colors.json new file mode 100644 index 0000000..f7df5bf --- /dev/null +++ b/dotfiles/theme/colors.json @@ -0,0 +1,259 @@ +{ + "name": "Tanaab", + "schemaVersion": 2, + "defaultMode": "dark", + "modes": { + "dark": { + "brand": { + "primary": "#00c88a", + "primaryLight": "#33d3a1", + "primaryDark": "#008f64", + "secondary": "#db2777", + "secondaryLight": "#e25292", + "secondaryDark": "#9c1c55", + "accent": "#ffb000", + "accentLight": "#ffc333", + "accentDark": "#b67e00" + }, + "ui": { + "background": "#0a1210", + "foreground": "#e6f0eb", + "foregroundMuted": "#adc1b8", + "foregroundSubtle": "#748a81", + "surface": "#101a18", + "surfaceRaised": "#16221f", + "border": "#31433d", + "selection": "#064a37", + "selectionInactive": "#263a34", + "focus": "#00c88a", + "cursor": "#748a81", + "link": "#00c88a", + "linkHover": "#e25292" + }, + "status": { + "info": "#5ab0ff", + "success": "#33d3a1", + "warning": "#ffb000", + "error": "#ff667d" + }, + "syntax": { + "plain": "#bcd9df", + "comment": "#8f9fa4", + "punctuation": "#8f9fa4", + "structural": "#ddebe8", + "variable": "#bcd9df", + "constant": "#bcd9df", + "boolean": "#ffc333", + "number": "#8f9fa4", + "string": "#38d7d0", + "structuredString": "#bcd9df", + "keyword": "#e25292", + "operator": "#8f9fa4", + "valueDeclaration": "#33d3a1", + "controlFlow": "#33d3a1", + "callableDeclaration": "#e25292", + "typeDeclaration": "#e25292", + "moduleConstruction": "#e25292", + "callable": "#82a3b3", + "type": "#82a3b3", + "property": "#ddebe8", + "tag": "#82a3b3", + "attribute": "#33d3a1", + "regexp": "#38d7d0", + "parameter": "#ffc333", + "escape": "#ffc333", + "important": "#ffc333", + "markup": { + "headingPrimary": "#ffc333", + "headingSecondary": "#00c88a", + "listMarker": "#38d7d0", + "quote": "#8f9fa4", + "link": "#38d7d0", + "code": { + "foreground": "#ddebe8", + "background": "#0a1210" + }, + "inserted": "#33d3a1", + "deleted": "#ff667d", + "changed": "#ffc333" + }, + "invalid": "#ff667d" + }, + "diff": { + "added": { + "foreground": "#33d3a1", + "background": "#12372c" + }, + "removed": { + "foreground": "#ff667d", + "background": "#3a1821" + }, + "modified": { + "foreground": "#ffc333", + "background": "#392c10" + } + }, + "terminal": { + "normal": { + "black": "#31433d", + "red": "#ff667d", + "green": "#00c88a", + "yellow": "#ffb000", + "blue": "#5ab0ff", + "magenta": "#e03a83", + "cyan": "#38d7d0", + "white": "#adc1b8" + }, + "bright": { + "black": "#748a81", + "red": "#ff8c9c", + "green": "#33d3a1", + "yellow": "#ffc333", + "blue": "#83c6ff", + "magenta": "#e25292", + "cyan": "#68e4df", + "white": "#e6f0eb" + } + } + }, + "light": { + "brand": { + "primary": "#db2777", + "primaryLight": "#e25292", + "primaryDark": "#9c1c55", + "secondary": "#00c88a", + "secondaryLight": "#33d3a1", + "secondaryDark": "#008f64", + "accent": "#ffb000", + "accentLight": "#ffc333", + "accentDark": "#b67e00" + }, + "ui": { + "background": "#f6fbf9", + "foreground": "#102018", + "foregroundMuted": "#52675e", + "foregroundSubtle": "#5f746a", + "surface": "#edf5f1", + "surfaceRaised": "#ffffff", + "border": "#b8cbc2", + "selection": "#f0c2d6", + "selectionInactive": "#e4d9de", + "focus": "#9c1c55", + "cursor": "#70857b", + "link": "#9c1c55", + "linkHover": "#b51f66" + }, + "status": { + "info": "#0069b8", + "success": "#007a56", + "warning": "#8a5f00", + "error": "#b4233c" + }, + "syntax": { + "plain": "#273238", + "comment": "#597788", + "punctuation": "#536269", + "structural": "#536269", + "variable": "#273238", + "constant": "#273238", + "boolean": "#8a5f00", + "number": "#597788", + "string": "#38d7d0", + "structuredString": "#273238", + "keyword": "#33d3a1", + "operator": "#536269", + "valueDeclaration": "#e25292", + "controlFlow": "#e25292", + "callableDeclaration": "#33d3a1", + "typeDeclaration": "#33d3a1", + "moduleConstruction": "#33d3a1", + "callable": "#517d94", + "type": "#517d94", + "property": "#536269", + "tag": "#517d94", + "attribute": "#e25292", + "regexp": "#38d7d0", + "parameter": "#ffc333", + "escape": "#ffc333", + "important": "#8a5f00", + "markup": { + "headingPrimary": "#ffc333", + "headingSecondary": "#db2777", + "listMarker": "#38d7d0", + "quote": "#597788", + "link": "#087a82", + "code": { + "foreground": "#536269", + "background": "#bcd9df" + }, + "inserted": "#33d3a1", + "deleted": "#ff667d", + "changed": "#ffc333" + }, + "invalid": "#ff667d" + }, + "diff": { + "added": { + "foreground": "#007a56", + "background": "#d6f2e8" + }, + "removed": { + "foreground": "#b4233c", + "background": "#f8dfe4" + }, + "modified": { + "foreground": "#8a5f00", + "background": "#f6e9c8" + } + }, + "terminal": { + "normal": { + "black": "#102018", + "red": "#ff667d", + "green": "#00c88a", + "yellow": "#ffb000", + "blue": "#5ab0ff", + "magenta": "#e03a83", + "cyan": "#38d7d0", + "white": "#52675e" + }, + "bright": { + "black": "#70857b", + "red": "#ff8c9c", + "green": "#33d3a1", + "yellow": "#ffc333", + "blue": "#83c6ff", + "magenta": "#e25292", + "cyan": "#68e4df", + "white": "#5f746a" + } + } + } + }, + "variants": { + "slate": { + "base": { + "base03": "#273238", + "base02": "#283944", + "base01": "#536269", + "base00": "#597788", + "base0": "#8f9fa4", + "base1": "#bcd9df", + "base2": "#ddebe8", + "base3": "#ecf9f6" + } + }, + "solarized": { + "base": { + "base03": "#002d45", + "base02": "#003851", + "base01": "#437086", + "base00": "#517d94", + "base0": "#7196a8", + "base1": "#82a3b3", + "base2": "#ddebe8", + "base3": "#ecf9f6" + } + } + } +} diff --git a/dotfiles/theme/tanaab-dark-theme.json b/dotfiles/theme/tanaab-dark-theme.json deleted file mode 100644 index 67366ad..0000000 --- a/dotfiles/theme/tanaab-dark-theme.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "variant": "dark", - "codeThemeId": "codex", - "theme": { - "accent": "#00C88A", - "contrast": 68, - "fonts": { - "code": null, - "ui": null - }, - "ink": "#E6F0EB", - "opaqueWindows": true, - "semanticColors": { - "diffAdded": "#33D4A1", - "diffRemoved": "#DB2777", - "skill": "#00C88A" - }, - "surface": "#0A1210" - } -} diff --git a/dotfiles/theme/tanaab-light-theme.json b/dotfiles/theme/tanaab-light-theme.json deleted file mode 100644 index 4f583f5..0000000 --- a/dotfiles/theme/tanaab-light-theme.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "variant": "light", - "codeThemeId": "codex", - "theme": { - "accent": "#DB2777", - "contrast": 44, - "fonts": { - "code": null, - "ui": null - }, - "ink": "#102018", - "opaqueWindows": true, - "semanticColors": { - "diffAdded": "#00C88A", - "diffRemoved": "#DB2777", - "skill": "#DB2777" - }, - "surface": "#F6FBF9" - } -} diff --git a/dotfiles/vim/.vim/autoload/tanaab/ui.vim b/dotfiles/vim/.vim/autoload/tanaab/ui.vim new file mode 100644 index 0000000..222578a --- /dev/null +++ b/dotfiles/vim/.vim/autoload/tanaab/ui.vim @@ -0,0 +1,128 @@ +function! s:center(text, width) abort + let l:remaining = max([0, a:width - strdisplaywidth(a:text)]) + let l:left = l:remaining / 2 + return repeat(' ', l:left) . a:text . repeat(' ', l:remaining - l:left) +endfunction + +function! s:box_line(margin, text, width) abort + return a:margin . '│' . s:center(a:text, a:width) . '│' +endfunction + +function! s:pad(text, width) abort + return a:text . repeat(' ', max([0, a:width - strdisplaywidth(a:text)])) +endfunction + +function! s:status(label, ready) abort + return (a:ready ? '● ' : '○ ') . a:label +endfunction + +function! tanaab#ui#welcome(force) abort + if a:force + enew + elseif argc() > 0 || line('$') != 1 || getline(1) !=# '' || !empty(bufname()) + return + endif + + let l:version = printf('%d.%d', v:version / 100, v:version % 100) + let l:box_width = 62 + let l:margin_width = max([2, (winwidth(0) - l:box_width - 2) / 2]) + let l:margin = repeat(' ', l:margin_width) + let l:top = l:margin . '┌' . repeat('─', l:box_width) . '┐' + let l:divider = l:margin . '├' . repeat('─', l:box_width) . '┤' + let l:bottom = l:margin . '└' . repeat('─', l:box_width) . '┘' + let l:controls = l:margin . ' ' + let l:system_column_width = 15 + let l:systems = [ + \ s:status('comment', !empty(maparg('gc', 'n'))), + \ s:status('editorconfig', exists('g:loaded_EditorConfig')), + \ s:status('matchit', exists('g:loaded_matchit')), + \ s:status('nohlsearch', exists('g:loaded_nohlsearch')), + \ s:status('netrw', exists(':Lexplore') == 2), + \ s:status('fuzzy find', &wildoptions =~# 'fuzzy'), + \ s:status('recovery', &backup && &swapfile && &undofile), + \ ] + let l:online = len(filter(copy(l:systems), 'v:val =~# ''^●''')) + let l:lines = [ + \ '', + \ l:top, + \ s:box_line(l:margin, '', l:box_width), + \ s:box_line(l:margin, 'T A N A A B', l:box_width), + \ s:box_line(l:margin, '', l:box_width), + \ s:box_line(l:margin, 'M A N E U V E R I N G', l:box_width), + \ s:box_line(l:margin, 'S Y S T E M S', l:box_width), + \ s:box_line(l:margin, 'L L C', l:box_width), + \ s:box_line(l:margin, '', l:box_width), + \ l:divider, + \ s:box_line(l:margin, 'TANAAB-BASED · TERMINAL-NATIVE · VIM', l:box_width), + \ l:bottom, + \ '', + \ '', + \ l:margin . s:center( + \ printf('NATIVE SYSTEMS · %d/%d ONLINE', l:online, len(l:systems)), + \ l:box_width + 2, + \ ), + \ l:controls . s:pad(l:systems[0], l:system_column_width) + \ . s:pad(l:systems[1], l:system_column_width) + \ . s:pad(l:systems[2], l:system_column_width) + \ . s:pad(l:systems[3], l:system_column_width), + \ l:controls . s:pad(l:systems[4], l:system_column_width) + \ . s:pad(l:systems[5], l:system_column_width) + \ . s:pad(l:systems[6], l:system_column_width) + \ . s:pad('', l:system_column_width), + \ '', + \ '', + \ l:controls . ',f find a file gc toggle a comment', + \ l:controls . ',n open the file browser [b previous buffer', + \ l:controls . ',b switch buffers ]b next buffer', + \ '', + \ '', + \ l:margin . s:center('Press Enter to start editing · q to close', l:box_width + 2), + \ '', + \ l:margin . s:center( + \ printf('Vim %s · colors inherited from the active terminal palette', l:version), + \ l:box_width + 2, + \ ), + \ ] + + setlocal modifiable + silent keepjumps %delete _ + call setline(1, l:lines) + silent file Tanaab + setlocal buftype=nofile + setlocal bufhidden=wipe + setlocal nobuflisted + setlocal noswapfile + setlocal nomodified + setlocal nonumber + setlocal norelativenumber + setlocal nolist + setlocal nowrap + setlocal nospell + setlocal colorcolumn= + setlocal signcolumn=no + setlocal nomodifiable + + syntax clear + syntax match TanaabWelcomeFrame /[┌┐└┘├┤│─]/ + syntax match TanaabWelcomeLogo /T A N A A B\|M A N E U V E R I N G\|S Y S T E M S\|L L C/ + syntax match TanaabWelcomeMuted /NATIVE SYSTEMS\|[0-9]\+\/[0-9]\+ ONLINE\|Vim [0-9.]\+.*$/ + syntax match TanaabWelcomeGreen /TANAAB-BASED/ + syntax match TanaabWelcomePink /TERMINAL-NATIVE/ + syntax match TanaabWelcomeYellow /VIM/ + syntax match TanaabWelcomeOnline /●/ + syntax match TanaabWelcomeOffline /○/ + syntax match TanaabWelcomeKey /,f\|,n\|,b\|gc\|\[b\|]b/ + + nnoremap :enew + nnoremap q :bwipeout! +endfunction + +function! tanaab#ui#trim_trailing_whitespace() abort + if &binary || !&modifiable + return + endif + + let l:view = winsaveview() + keeppatterns silent! %s/\s\+$//e + call winrestview(l:view) +endfunction diff --git a/dotfiles/vim/.vim/colors/tanaab.vim b/dotfiles/vim/.vim/colors/tanaab.vim new file mode 100644 index 0000000..8cfc9de --- /dev/null +++ b/dotfiles/vim/.vim/colors/tanaab.vim @@ -0,0 +1,111 @@ +" Tanaab terminal colors +" Semantic Vim colors mapped onto the active terminal's 16 ANSI slots. + +highlight clear +if exists('syntax_on') + syntax reset +endif + +let g:colors_name = 'tanaab' + +" Editor chrome. +highlight Normal cterm=NONE ctermfg=NONE ctermbg=NONE +highlight NormalFloat cterm=NONE ctermfg=7 ctermbg=0 +highlight Cursor cterm=reverse ctermfg=NONE ctermbg=NONE +if &background ==# 'dark' + highlight CursorLine term=NONE cterm=NONE ctermfg=NONE ctermbg=0 gui=NONE guifg=NONE guibg=NONE + highlight CursorColumn term=NONE cterm=NONE ctermfg=NONE ctermbg=0 gui=NONE guifg=NONE guibg=NONE + highlight ColorColumn term=NONE cterm=NONE ctermfg=NONE ctermbg=0 gui=NONE guifg=NONE guibg=NONE +else + highlight CursorLine term=NONE cterm=NONE ctermfg=NONE ctermbg=NONE gui=NONE guifg=NONE guibg=NONE + highlight CursorColumn term=NONE cterm=NONE ctermfg=NONE ctermbg=NONE gui=NONE guifg=NONE guibg=NONE + highlight ColorColumn term=NONE cterm=NONE ctermfg=NONE ctermbg=NONE gui=NONE guifg=NONE guibg=NONE +endif +highlight LineNr cterm=NONE ctermfg=8 ctermbg=NONE +highlight CursorLineNr cterm=bold ctermfg=2 ctermbg=NONE +highlight SignColumn cterm=NONE ctermfg=8 ctermbg=NONE +highlight VertSplit cterm=NONE ctermfg=8 ctermbg=NONE +highlight WinSeparator cterm=NONE ctermfg=8 ctermbg=NONE +highlight Folded cterm=NONE ctermfg=8 ctermbg=NONE +highlight FoldColumn cterm=NONE ctermfg=8 ctermbg=NONE +highlight NonText cterm=NONE ctermfg=8 ctermbg=NONE +highlight SpecialKey cterm=NONE ctermfg=8 ctermbg=NONE +highlight EndOfBuffer cterm=NONE ctermfg=8 ctermbg=NONE +highlight Directory cterm=bold ctermfg=4 ctermbg=NONE +highlight Title cterm=bold ctermfg=2 ctermbg=NONE +highlight Question cterm=bold ctermfg=2 ctermbg=NONE +highlight MoreMsg cterm=bold ctermfg=2 ctermbg=NONE +highlight WarningMsg cterm=bold ctermfg=3 ctermbg=NONE +highlight ErrorMsg cterm=bold ctermfg=15 ctermbg=1 + +" Selection, search, and completion. +highlight Visual cterm=reverse ctermfg=NONE ctermbg=NONE +highlight Search cterm=bold ctermfg=0 ctermbg=11 +highlight IncSearch cterm=bold ctermfg=0 ctermbg=13 +highlight MatchParen cterm=bold,underline ctermfg=14 ctermbg=NONE +highlight Pmenu cterm=NONE ctermfg=7 ctermbg=0 +highlight PmenuSel cterm=bold ctermfg=0 ctermbg=10 +highlight PmenuSbar cterm=NONE ctermfg=NONE ctermbg=8 +highlight PmenuThumb cterm=NONE ctermfg=NONE ctermbg=7 +highlight WildMenu cterm=bold ctermfg=0 ctermbg=10 + +" Diff and diagnostics. +highlight Added cterm=NONE ctermfg=10 ctermbg=NONE +highlight Changed cterm=NONE ctermfg=12 ctermbg=NONE +highlight Removed cterm=NONE ctermfg=9 ctermbg=NONE +highlight DiffAdd cterm=NONE ctermfg=10 ctermbg=0 +highlight DiffChange cterm=NONE ctermfg=12 ctermbg=0 +highlight DiffDelete cterm=NONE ctermfg=9 ctermbg=0 +highlight DiffText cterm=bold ctermfg=0 ctermbg=12 +highlight Error cterm=bold ctermfg=15 ctermbg=1 +highlight Todo cterm=bold ctermfg=0 ctermbg=11 + +" Syntax semantics. +highlight Comment cterm=italic ctermfg=8 ctermbg=NONE +highlight Constant cterm=NONE ctermfg=13 ctermbg=NONE +highlight String cterm=NONE ctermfg=6 ctermbg=NONE +highlight Character cterm=NONE ctermfg=14 ctermbg=NONE +highlight Number cterm=NONE ctermfg=13 ctermbg=NONE +highlight Boolean cterm=bold ctermfg=13 ctermbg=NONE +highlight Float cterm=NONE ctermfg=13 ctermbg=NONE +highlight Identifier cterm=NONE ctermfg=4 ctermbg=NONE +highlight Function cterm=bold ctermfg=2 ctermbg=NONE +highlight Statement cterm=bold ctermfg=5 ctermbg=NONE +highlight PreProc cterm=NONE ctermfg=3 ctermbg=NONE +highlight Type cterm=bold ctermfg=4 ctermbg=NONE +highlight Special cterm=NONE ctermfg=6 ctermbg=NONE +highlight Underlined cterm=underline ctermfg=4 ctermbg=NONE +highlight Ignore cterm=NONE ctermfg=8 ctermbg=NONE + +" Tanaab UI accents. +highlight StatusLine cterm=reverse ctermfg=NONE ctermbg=NONE +highlight StatusLineNC cterm=NONE ctermfg=8 ctermbg=NONE +highlight TanaabStatusGreen cterm=bold ctermfg=2 ctermbg=NONE +highlight TanaabStatusPink cterm=bold ctermfg=5 ctermbg=NONE +highlight TanaabWelcomeFrame cterm=NONE ctermfg=8 ctermbg=NONE +highlight TanaabWelcomeLogo cterm=bold ctermfg=NONE ctermbg=NONE +highlight TanaabWelcomeGreen cterm=bold ctermfg=2 ctermbg=NONE +highlight TanaabWelcomePink cterm=bold ctermfg=5 ctermbg=NONE +highlight TanaabWelcomeYellow cterm=bold ctermfg=3 ctermbg=NONE +highlight TanaabWelcomeOnline cterm=bold ctermfg=2 ctermbg=NONE +highlight TanaabWelcomeOffline cterm=bold ctermfg=1 ctermbg=NONE +highlight TanaabWelcomeMuted cterm=NONE ctermfg=8 ctermbg=NONE +highlight TanaabWelcomeKey cterm=bold ctermfg=4 ctermbg=NONE + +highlight! link Conditional Statement +highlight! link Repeat Statement +highlight! link Label Statement +highlight! link Operator Statement +highlight! link Keyword Statement +highlight! link Exception Statement +highlight! link Include PreProc +highlight! link Define PreProc +highlight! link Macro PreProc +highlight! link PreCondit PreProc +highlight! link StorageClass Type +highlight! link Structure Type +highlight! link Typedef Type +highlight! link Tag Special +highlight! link Delimiter Special +highlight! link SpecialComment Special +highlight! link Debug Special diff --git a/dotfiles/vim/.vim/plugin/tanaab.vim b/dotfiles/vim/.vim/plugin/tanaab.vim new file mode 100644 index 0000000..503e782 --- /dev/null +++ b/dotfiles/vim/.vim/plugin/tanaab.vim @@ -0,0 +1,15 @@ +if exists('g:loaded_tanaab_profile') + finish +endif +let g:loaded_tanaab_profile = 1 + +command! TanaabWelcome call tanaab#ui#welcome(1) + +augroup tanaab_profile + autocmd! + autocmd VimEnter * call tanaab#ui#welcome(0) + autocmd FileType c,cpp,css,dockerfile,go,html,java,javascript,javascriptreact,json,jsonc,lua,python,ruby,rust,scss,sh,toml,typescript,typescriptreact,vim,vue,yaml,zsh let b:tanaab_trim_trailing_whitespace = 1 + autocmd BufWritePre * if get(b:, 'tanaab_trim_trailing_whitespace', 0) | call tanaab#ui#trim_trailing_whitespace() | endif + autocmd FileType make setlocal noexpandtab + autocmd FileType gitcommit setlocal textwidth=72 colorcolumn=73 +augroup END diff --git a/dotfiles/vim/.vimrc b/dotfiles/vim/.vimrc index fae3f05..16dbea9 100644 --- a/dotfiles/vim/.vimrc +++ b/dotfiles/vim/.vimrc @@ -1,52 +1,124 @@ -"" -"" Janus setup -"" - -" Define paths -let s:janus_vim_path = expand("~/.vim/janus/vim") -let g:janus_path = escape(s:janus_vim_path, ' ') -let g:janus_vim_path = escape(s:janus_vim_path, ' ') -let g:janus_custom_path = expand("~/.janus") - -let s:janus_core_file = s:janus_vim_path . "/core/before/plugin/janus.vim" -let s:janus_plugins_file = s:janus_vim_path . "/core/plugins.vim" - -for s:janus_required_file in [s:janus_core_file, s:janus_plugins_file] - if !filereadable(s:janus_required_file) - echohl ErrorMsg - echom "Janus runtime file is missing: " . s:janus_required_file - echom "Restore Janus at ~/.vim/janus/vim before launching Vim." - echohl None - finish - endif -endfor +" Tanaab Vim +" A self-contained, terminal-native profile that inherits its palette from Warp. -" Source janus's core -exe 'source ' . fnameescape(s:janus_core_file) +if &compatible + set nocompatible +endif -" You should note that groups will be processed by Pathogen in reverse -" order they were added. -call janus#add_group("tools") -call janus#add_group("langs") -call janus#add_group("colors") +let mapleader = ',' +let maplocalleader = ',' -"" -"" Customisations -"" +filetype plugin indent on +syntax enable -if filereadable(expand("~/.vimrc.before")) - source ~/.vimrc.before -endif +" Use Vim's maintained optional packages instead of a third-party plugin manager. +packadd comment +packadd editorconfig +packadd matchit +packadd nohlsearch + +" General editing behavior. +set autoread +set autowrite +set backspace=indent,eol,start +set hidden +set history=1000 +set nojoinspaces +set nrformats-=octal +set shortmess+=I +set showcmd +set noshowmode +set updatetime=300 +set timeoutlen=500 + +" Search and command completion. +set hlsearch +set ignorecase +set incsearch +set smartcase +set path+=** +set wildmenu +set wildmode=longest:full,full +set wildoptions=pum,fuzzy +set wildignore+=*/.git/*,*/node_modules/*,*/vendor/*,*/dist/* + +" Layout and navigation. +set number +set cursorline +set scrolloff=3 +set sidescrolloff=5 +set signcolumn=yes +set splitbelow +set splitright +set laststatus=2 + +" Two-space soft tabs remain the default; filetype plugins and EditorConfig may override them. +set expandtab +set shiftround +set shiftwidth=2 +set softtabstop=2 +set tabstop=2 + +" Make whitespace and the preferred line length visible without forcing hard wrapping. +set list +set listchars=tab:»·,trail:·,nbsp:· +set wrap +set linebreak +set breakindent +set textwidth=0 +set wrapmargin=0 +set colorcolumn=80 + +" Keep recovery data out of project directories. +let s:state_root = empty($XDG_STATE_HOME) + \ ? expand('~/.local/state/vim') + \ : expand($XDG_STATE_HOME . '/vim') +let s:backup_dir = s:state_root . '/backup' +let s:swap_dir = s:state_root . '/swap' +let s:undo_dir = s:state_root . '/undo' + +for s:state_dir in [s:backup_dir, s:swap_dir, s:undo_dir] + if !isdirectory(s:state_dir) + call mkdir(s:state_dir, 'p', 0700) + endif +endfor + +let &backupdir = s:backup_dir . '//' +let &directory = s:swap_dir . '//' +let &undodir = s:undo_dir . '//' +set backup +set swapfile +set undofile +set writebackup +" Netrw is the built-in file browser. +let g:netrw_banner = 0 +let g:netrw_browse_split = 0 +let g:netrw_liststyle = 3 +let g:netrw_winsize = 30 +let g:netrw_altv = 1 +let g:netrw_list_hide = '\.git/$' -" Disable plugins prior to loading pathogen -exe 'source ' . fnameescape(s:janus_plugins_file) +" The Tanaab colorscheme uses ANSI indexes so Warp remains the RGB source of truth. +set notermguicolors +colorscheme tanaab -"" -"" Pathogen setup -"" +let &statusline = '%#TanaabStatusGreen# tanaab %#StatusLine# %f %m%r%h%w%=%#TanaabStatusPink# %y %#StatusLine# %l:%c %p%% ' -" Load all groups, custom dir, and janus core -call janus#load_pathogen() +" File, buffer, and window navigation. +nnoremap n :Lexplore +nnoremap f :find +nnoremap b :buffer +nnoremap [b :bprevious +nnoremap ]b :bnext +nnoremap h +nnoremap j +nnoremap k +nnoremap l -" .vimrc.after is loaded after the plugins have loaded +" Common profile actions. +nnoremap w :write +nnoremap q :quit +nnoremap / :nohlsearch +nnoremap e :edit $MYVIMRC +nnoremap r :source $MYVIMRC diff --git a/dotfiles/vim/.vimrc.after b/dotfiles/vim/.vimrc.after deleted file mode 100644 index 697fe5c..0000000 --- a/dotfiles/vim/.vimrc.after +++ /dev/null @@ -1,81 +0,0 @@ -" Art -" Only show from core hyperdrive, not others -if expand(':p') != expand("~/.hyperdrive.local/vimrc.after") - echo " " - echo " _ _ _ _ " - echo " | | | | | | (_) " - echo " | |__| |_ _ _ __ ___ _ __ __| |_ __ ___ _____ " - echo " | __ | | | | '_ \\ / _ \\ '__/ _` | '__| \\ \\ / / _ \\ " - echo " | | | | |_| | |_) | __/ | | (_| | | | |\\ V / __/ " - echo " |_| |_|\\__, | .__/ \\___|_| \\__,_|_| |_| \\_/ \\___| " - echo " __/ | | " - echo " |___/|_| " - echo " ================================================ VIM " - echo " " -endif - -" Basics -set backspace=2 " Backspace deletes like most programs in insert mode -set nobackup -set nowritebackup -set noswapfile " http://robots.thoughtbot.com/post/18739402579/global-gitignore#comment-458413287 -set history=50 -set ruler " show the cursor position all the time -set showcmd " display incomplete commands -set incsearch " do incremental searching -set laststatus=2 " Always display the status line -set autowrite " Automatically :write before running commands -set noshowmode -let NERDTreeShowHidden=1 -let g:NERDTreeIgnore=['^.git$'] - -" Automatically remove trailing whitespaces -autocmd BufWritePre * :%s/\s\+$//e - -" Colorscheme -syntax enable -set background=dark -let g:solarized_termcolors=16 -let g:solarized_termtrans=1 -colorscheme solarized - -" Softtabs, 2 spaces -set tabstop=2 -set shiftwidth=2 -set shiftround -set expandtab - -" Display extra whitespace -set list listchars=tab:»·,trail:·,nbsp:· - -" Use one space, not two, after punctuation. -set nojoinspaces - -" Make it obvious where 80 characters is and dont autowrap -set wrap -set linebreak -set textwidth=0 -set wrapmargin=0 -set colorcolumn=80 - -"" -"" Customizations -"" - -" Load our custom after vimrc -if expand(':p') != expand("~/.hyperdrive.local/vimrc.after") - if filereadable(expand("~/.hyperdrive.local/vimrc.after")) - echo "Detected custom vimrc.after in ~/.hyperdrive.local, loading it..." - source ~/.hyperdrive.local/vimrc.after - endif -endif - -"" -"" Reporting -"" -if expand(':p') != expand("~/.hyperdrive.local/vimrc.after") - echo "Here is some helpful information about your Hyperdrive Vim config" - version - echo "Getting ready to launch you into hyperpace..." -endif - diff --git a/dotfiles/vim/.vimrc.before b/dotfiles/vim/.vimrc.before deleted file mode 100644 index 4a1258b..0000000 --- a/dotfiles/vim/.vimrc.before +++ /dev/null @@ -1,25 +0,0 @@ -" Basics -let mapleader="," -let g:disable_markdown_autostyle=1 -let g:lightline={'colorscheme': 'solarized'} - -"" -"" Customisations -"" - -" Add our custom hyperdrive dir as a janus group -let s:hyperdrive_local_path = expand("~/.hyperdrive.local") -if isdirectory(s:hyperdrive_local_path) - call janus#add_group("vim", s:hyperdrive_local_path) -endif - -" The bundled Janus tlib plugin defines a command incompatible with Vim 9.1. -call janus#disable_plugin("tlib", "The bundled version is incompatible with Vim 9.1 command completion.") - -" Load our custom before vimrc -if expand(':p') != s:hyperdrive_local_path . "/vimrc.before" - if filereadable(s:hyperdrive_local_path . "/vimrc.before") - echo "Detected custom vimrc.before in ~/.hyperdrive.local, loading it..." - source ~/.hyperdrive.local/vimrc.before - endif -endif diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/.vscodeignore b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/.vscodeignore new file mode 100644 index 0000000..9bedab3 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/.vscodeignore @@ -0,0 +1,5 @@ +.gitignore +.vscode/** +AGENTS.md +node_modules/** +*.vsix diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/AGENTS.md b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/AGENTS.md new file mode 100644 index 0000000..c5b1adf --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/AGENTS.md @@ -0,0 +1,317 @@ +# Tanaab-based VS Code Theme Guidance + +## Scope + +This file governs the `tanaabased.theme` Visual Studio Code extension. Keep extension-specific +theme mapping, generation, metadata, packaging, and visual-review policy here rather than in the +repository root guidance. + +## Canonical Color Source + +- Treat [`dotfiles/theme/colors.json`](../../../../theme/colors.json) as the canonical palette while + this extension remains in `me`. +- Do not source colors from the separate `@tanaabased/theme` checkout during this proof of concept. +- Every RGB color used by a theme must trace to the canonical palette. Alpha variants of canonical + colors are allowed for overlays and selection states. +- Do not invent replacement chromatic colors to improve one application in isolation. Update the + canonical palette first when a shared color role is genuinely missing. +- Treat theme implementation as a feedback loop. When VS Code reveals a reusable missing role such + as a divider, guide, control border, syntax role, or interaction state, add it to `colors.json` + before using it throughout the extension. +- Prefer shared semantic additions under `ui`, `status`, `syntax`, `diff`, or `terminal`. Add a + VS Code-specific palette section only when a useful color concept is genuinely application-only + and cannot be expressed as a shared role without distorting the portable contract. +- Preserve the `schemaVersion: 2` separation between portable syntax roles and mode-level diff + roles. Syntax markup owns inserted, deleted, and changed token colors; `modes..diff` owns + workbench diff foregrounds and backgrounds. Keep opacity application-specific by deriving alpha + variants from canonical RGB values rather than adding translucent colors to the portable syntax + contract. + +## Reference Hierarchy + +Use these references in order when choosing or reviewing mappings: + +1. `dotfiles/theme/colors.json` for all color values and dark, light, and Solarized roles. +2. The JavaScript and Vue images under `scratchpad/` for the intended relationships between syntax + roles. Treat their saturation density as a starting point, not a requirement; Solarized variants + should be substantially quieter. +3. The four files under `dotfiles/warp/.warp/themes/` for background, foreground, cursor, accent, + and exact integrated-terminal ANSI mappings. +4. VS Code's built-in Solarized Dark theme for UX guidance around surface-separated explorer, + activity bar, tabs, editor, search, terminal, and panel regions. +5. A live Visual Studio Code review for application-specific interaction states and layout chrome. + +Do not copy a reference mechanically when it conflicts with a more authoritative role. The +scratchpad is visual guidance, while `colors.json` remains the color API. + +## Theme Contract + +Maintain these four contributed themes and keep their manifest labels, file names, `type`, and +`uiTheme` values aligned: + +- `Tanaab Dark`: the Slate neutral ramp with dark-mode chromatic, diff, and terminal ANSI roles. +- `Tanaab Light`: the Slate neutral ramp in reverse for workbench surfaces and text, with + `modes.light` chromatic, diff, and terminal roles. +- `Tanaab Solarized Dark`: the Solarized neutral ramp with dark-mode chromatic roles. +- `Tanaab Solarized Light`: the Solarized neutral ramp with light-mode chromatic roles. + +The brand primary and secondary roles intentionally rotate by mode: + +- Dark mode uses green as primary and pink as secondary. +- Light mode uses pink as primary and green as secondary. + +Use the active mode's primary for a small number of important interactive cues. Lexical syntax roles +rotate the green and pink landmarks with the mode: dark uses green for value declarations and +control flow with pink for callable, type, module, and construction keywords; light reverses those +two role groups. Universal semantic colors such as inserted, deleted, diagnostic, and source-control +states do not rotate with the brand priority. + +Treat one shared syntax role model as the target across all four variants, with theme-specific +background and workbench surface ramps providing the mode distinction. The dark variants inherit +`themes/tanaab-dark-workbench-base.json`, which inherits +`themes/tanaab-syntax-color-theme.json`; the light variants inherit +`themes/tanaab-light-workbench-base.json`, which inherits +`themes/tanaab-syntax-light-color-theme.json`. The light syntax layer adds only the overrides needed +for light-background contrast and the intentional green-pink role rotation over the shared syntax +file. Keep each workbench base limited to the colors that are identical across its Slate and +Solarized variants, and keep each contributed theme limited to variant-specific overrides. VS Code +theme files do not provide palette variables, so do not duplicate identical mode-level workbench +colors in both final variants. + +Each theme must continue to cover: + +- Workbench and editor UI colors. +- TextMate token scopes. +- Semantic token colors where semantic highlighting is enabled. The two dark variants intentionally + disable semantic highlighting so TextMate scopes remain authoritative for the cyan declaration + versus pink control-flow distinction; do not re-enable it without preserving that lexical split. +- Diff, merge, diagnostics, and source-control states. +- Integrated-terminal normal and bright ANSI colors. + +Preserve the canonical ANSI slot assignments. In particular, do not swap green and magenta to +change a shell executable color because that also changes diff and other semantic terminal output. + +Keep the two dark variants structurally aligned. They should map the same VS Code UI roles to the +same relative neutral-ramp positions and differ primarily in their neutral family: + +- `Tanaab Solarized Dark` uses `variants.solarized.base`, with editor and terminal background + anchored to the Warp Solarized Dark background `#002d45` and raised surfaces at `#003851`. +- `Tanaab Dark` uses `variants.slate.base`, with editor and terminal background anchored to the + accepted dark-gray reference at `#273238` and raised surfaces at `#283944`. + +Both retain the canonical dark brand, status, diff, and chromatic ANSI colors. The Slate background +and first raised surface also anchor the separate Warp `Tanaab Dark` background and ANSI black slot +so the two applications share the same dark neutral foundation. + +## Visual Direction + +The target is calm, restrained, and mostly monochrome, with a few vivid Tanaab moments. Prefer +neutral hierarchy first and chromatic emphasis second. + +- Build most of the workbench from the active mode's background, surface, raised surface, + foreground, muted foreground, subtle foreground, and border ramp. +- Use subtle surface changes instead of borders to separate large regions whenever possible. +- When a border is needed, derive a low-opacity variant from the canonical border color. Avoid + bright outlines around panels, groups, tabs, controls, and widgets. +- Follow the useful structural direction of VS Code's built-in Solarized Dark theme: distinguish the + explorer, activity bar, tab strip, editor, search, terminal, status, and widget regions with + adjacent neutral surfaces and restrained selection fills. Do not copy its color values or syntax + mappings. +- Keep the tab strip and individual tabs effectively borderless. Use active and inactive background + differences and text contrast instead of a box or bright top edge around the selected file. +- Keep rulers, indentation guides, whitespace markers, inactive selections, and similar structural + aids visible but quiet. Active guides may gain modest contrast but should not become a focal + point. +- Reserve saturated primary and secondary colors for small, meaningful states such as an active tab + indicator, progress, a badge, a link, or a selected action. Avoid large saturated surfaces during + ordinary editing; debugging or error states may be stronger when their semantics require it. +- Use the saturated mode primary for compact affirmative controls and trust cues such as primary + buttons, extension install buttons, the selected Activity Bar indicator, and verified-publisher + icons. A nearby hover state may use the canonical lighter primary. Keep these treatments compact + so they balance, rather than compete with, secondary-pink notification badges. +- In light mode, preserve the rotated brand relationship: use the canonical bright pink for compact + actions, links, selected Activity Bar indicators, and verified-publisher icons, while green is + reserved for notification and count badges. Use a dark badge foreground so the bright green + remains legible. +- Keep source-control decorations semantically distinct without making every changed file a focal + point. Untracked files may use the mode primary; modified files should use a subdued or + translucent accent. Use canonical RGB values with an alpha channel for workbench overlays and + decorations when opacity improves hierarchy. +- Treat yellow/gold as an accent, not a default syntax foreground. Use it selectively for function + parameter declarations, escapes, warnings, modified states, and narrow markup or attribute roles. +- Treat cyan as a secondary accent suited to programming-language strings, regular expressions, + sparse structured cues, and informational detail. Keep routine properties, object keys, braces, + and square brackets on the shared light neutral so cyan supports the primary green/pink + relationship rather than competing with it. +- Keep punctuation, operators, brackets, and delimiters neutral unless an active interaction needs + emphasis. +- Do not rainbow-color bracket-pair depths. Render all normal bracket depths with the same light + neutral and reserve error red for unexpected brackets. In the two dark variants, do not add a + background fill or border to the currently matched pair; the bracket glyphs provide enough cue. +- Keep focus visible without relying on a hard saturated rectangle. Prefer muted borders, subtle + fills, or a localized primary indicator appropriate to the control. +- In Solarized variants, use a translucent mode-primary overlay for selections, matching words, and + similar editor interactions. Bracket matches remain fill- and border-free. Do not use the opaque + dark-mode selection fill as a Solarized interaction color. + +For syntax, preserve the scratchpad's role hierarchy without reproducing its color density. Across +both dark variants, keep variables, properties, function names, types, constants, punctuation, and +most identifiers on the shared neutral syntax ramp. Use chromatic roles as small lexical landmarks: + +- Green for value declaration and storage words such as `const`, `let`, and `var`, plus structural + control flow such as conditionals, loops, `return`, and `try` or `catch`. +- Pink for callable and type declaration words such as `function` and `class`, declaration modifiers + such as `async`, `static`, and `extends`, and module or construction markers such as `import`, + `export`, `from`, and `new`. +- Subdued blue-gray for callable names, calls, constructors, types, and classes. Keep this role close + to the neutral ramp so it separates identifiers without becoming a third primary accent. +- Shared muted neutral for generic assignment, comparison, logical, arithmetic, and arrow operators. +- Cyan for strings and regular expressions in programming languages, while keeping JSON, YAML, and + TOML strings neutral. +- Yellow for booleans, function parameter declarations, escapes, and `!important` style + declarations rather than routine markup attributes, properties, numbers, or flags such as + `!default`. +- Muted neutral for numeric literals so they remain legible without competing with semantic + landmarks. +- Muted neutral italics for comments. + +Keep JavaScript documentation blocks monochrome. Prose remains muted neutral italics; JSDoc tags +such as `@param` and `@returns` use the light neutral in bold; types, parameter names, and default +annotations use the same light neutral without introducing another hue. + +A source file should read primarily as text with intentional color landmarks, not as an even +distribution of colors. + +In the light syntax layer, reverse the dark lexical green and pink landmarks: value declarations and +structural control flow use pink, while callable or type declarations, module or construction +keywords use green. Apply the same priority rotation to sparse Markdown heading landmarks, but +preserve universal semantic colors such as green inserted markup. + +For Vue single-file components, let embedded JavaScript or TypeScript inherit the shared programming +roles. Treat component and SFC wrapper tag names like subdued callable names, render them at 50% +opacity so prose or values remain dominant, and style their angle-bracket punctuation like structural +brackets. Directive and ordinary attribute names plus their shorthand markers use the active mode +primary, while `v-if` or `v-for` follow ordinary structural control flow. Keep interpolation +delimiters subdued like brackets while their expressions inherit +programming roles. In embedded styles, keep property names on the neutral property ramp, use the +active mode primary for selectors, keep structural braces or function parentheses subdued, and +reserve yellow for `!important` while `!default` follows the ordinary keyword role. + +For shell scripts, map grammar-specific scopes back to the shared programming roles. Structural +control flow such as `if`, `then`, `for`, `do`, `case`, and `return` follows the control-flow role. +Function declaration names follow the callable declaration role, while commands, builtins, and +function calls retain the subdued callable color. Value declarations such as `local` and `declare` +follow JavaScript value-declaration keywords; variables remain neutral, positional parameters use +yellow, strings and patterns use cyan, and numbers use the muted numeric neutral. Keep grouping, +test, subshell, and parameter-expansion punctuation subdued like JavaScript brackets. Apply the +normal dark/light green and pink priority rotation to these roles. + +## Syntax Development Workflow + +Treat `themes/tanaab-syntax-color-theme.json` as the shared, generic-first TextMate syntax layer. +The dark workbench base inherits it directly. The light syntax layer inherits the shared layer, and +the light workbench base inherits the light syntax layer. Workbench themes must not carry duplicate +`tokenColors` arrays. Keep semantic highlighting disabled while these TextMate scopes are +authoritative. + +Group selectors by semantic role rather than by language or by the color they happen to share. Add +grammar-specific selectors such as shell scopes to the existing value-declaration, control-flow, +callable, property, or punctuation rule when their meaning matches. Do not retain a language-named +rule that produces the same settings as an existing generic rule. Preserve explicit neutral +variable and constant rules when they override a broader parent scope, such as strings around shell +arguments or expansions; matching the default foreground does not by itself make a rule redundant. + +Develop syntax as a role-first, fixture-driven loop rather than completing independent language +themes and attempting to merge them afterward: + +1. Describe the intended semantic role, such as a parameter declaration, structural control-flow + keyword, module keyword, property, string, or documentation tag. +2. Use **Developer: Inspect Editor Tokens and Scopes** in VS Code to identify the actual TextMate + scopes emitted for a representative token. +3. Add or adjust the broadest appropriate generic scope in the shared syntax file. +4. Check that rule against at least one contrasting fixture before considering it stable. +5. Add a language-qualified selector only when a grammar reuses or omits generic scopes in a way + that would make the broad rule incorrect elsewhere. + +Use this fixture progression to broaden coverage without creating a section for every language: + +1. JavaScript and TypeScript for declarations, parameters, control flow, modules, strings, + comments, and JSDoc. +2. Vue for HTML templates, embedded JavaScript, attributes, and component CSS. +3. Standalone HTML and CSS for markup and styling scopes outside Vue embedding. +4. Shell for commands, variables, quoting, substitutions, and control flow from a substantially + different grammar. +5. JSON, YAML, and TOML for structured-data keys, values, punctuation, and neutral strings. +6. Markdown for headings, prose, lists, links, quotes, and fenced code. + +Classify each mismatch before editing: + +- Same role and standard scope: change the shared generic rule. +- Same role but a different grammar scope: broaden the shared rule's selector list. +- Same scope with a genuinely different meaning: add a narrow, named language exception. +- A contrast problem caused by the workbench background: adjust or override the affected variant; + do not fork the semantic role. + +Every language-specific exception must be named for its intent and supported by a fixture that +demonstrates why a generic rule is insufficient. Periodically remove redundant exceptions when a +broader rule now covers them. A new language should look coherent before it receives any dedicated +rules; that is the primary test that the generic layer is working. + +Markdown may use stronger structural landmarks because headings and list markers are sparse. In +Solarized Dark, use bright accent yellow for complete level-one headings, primary green for complete +level-two through level-six headings, and a small cyan cue for list markers. Bold and italic text +should inherit its surrounding foreground rather than introducing another chromatic role. Use cyan +for links. Render inline backtick code as neutral text on an obviously darker neutral surface. Give +fenced code the same darker surface while allowing its contents to inherit embedded language +syntax. Markdown tables may use that same darker token surface. A pure color theme cannot create a +full-width source-editor region behind a fenced block or table; that requires active editor +decorations, so keep the proof-of-concept extension declarative. + +Keep JSON and YAML keys on one neutral property role regardless of nesting. In TOML, treat bracketed +table and array-table headers as structural: their names, dots, and brackets share the subdued +bracket color. Use yellow for booleans and a muted neutral for numbers across structured data. The +bundled JSON grammar groups `true`, `false`, and `null` under one literal scope, so keep that JSON +literal family together rather than pretending the theme can distinguish their text. + +For Solarized variants, use the complete Solarized neutral ramp from `variants.solarized.base` for +backgrounds, surfaces, dividers, and neutral workbench text. Do not use the background ramp to fork +the shared syntax palette. Keep the canonical terminal roles rather than introducing a separate +chromatic palette. + +## Generation Direction + +- Keep the four theme JSON files explicit and hand-reviewable while the mappings are still being + refined. +- Do not introduce a generator until the mapping rules are stable or the task explicitly requests + one. +- When a generator is introduced, keep it deterministic, commit its generated theme files, and make + drift between inputs and outputs detectable through a narrow validation command. +- A generator should own theme color mappings only. It must not rewrite extension identity, + descriptive metadata, documentation, support information, or artwork. + +## Extension Metadata + +- Preserve the extension ID `tanaabased.theme`, formed from publisher `tanaabased` and name `theme`. +- Keep version `0.0.1` during the proof of concept unless a task explicitly changes the versioning + policy. +- Treat `package.json`, `README.md`, `CHANGELOG.md`, `SUPPORT.md`, `LICENSE`, and `images/icon.png` as + Marketplace-facing surfaces. +- VS Code supports one Marketplace icon rather than light and dark icon variants. Keep it as a PNG + of at least 128×128 pixels; the current source is 256×256. + +## Validation + +For theme or manifest changes, run the narrowest applicable checks: + +- Parse `package.json` and every syntax, workbench-base, and contributed theme file as JSON. +- Verify every manifest theme path exists and its label and light/dark type match the theme file. +- Resolve every include chain and verify each contributed theme still produces its complete expected + workbench and TextMate configuration. +- Verify theme color literals trace to `dotfiles/theme/colors.json`, allowing alpha suffixes. +- Run Prettier on the touched JSON and Markdown files and run `git diff --check`. +- Restow the `vscode` package when new files are added so file-level Stow links are created. +- Use **Developer: Reload Window** before evaluating manifest, icon, or theme changes in VS Code. + +Visual review remains required before treating color mapping changes as settled. Check all four +variants in representative source, Markdown, JSON or YAML, diff, terminal, sidebar, panel, and +notification views. diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/CHANGELOG.md b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/CHANGELOG.md new file mode 100644 index 0000000..1fe7ca2 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## 0.0.1 + +- Add Tanaab Dark and Tanaab Light. +- Add Tanaab Solarized Dark and Tanaab Solarized Light. +- Cover the Visual Studio Code workbench, syntax highlighting, semantic tokens, diffs, source + control, and integrated terminal. diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/LICENSE b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/LICENSE new file mode 100644 index 0000000..cfe8000 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Tanaab Maneuvering Systems LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/README.md b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/README.md new file mode 100644 index 0000000..5315f85 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/README.md @@ -0,0 +1,28 @@ +# Tanaab-based themes for Visual Studio Code + +Tanaab is a complete Visual Studio Code color theme family built around the Tanaab green, pink, +gold, blue, and cyan palette. + +## Themes + +- Tanaab Dark +- Tanaab Light +- Tanaab Solarized Dark +- Tanaab Solarized Light + +Each variant styles the complete Visual Studio Code workbench, TextMate syntax scopes, semantic +tokens, diffs, source-control decorations, and the integrated terminal. + +## Development + +This extension is currently a proof of concept maintained inside the +[`pirog/me`](https://github.com/pirog/me) dotfile package. Its colors are authored directly from +`dotfiles/theme/colors.json`; there is intentionally no generated theme layer while the visual +language is still being refined. + +After the `vscode` dotfile package is stowed, choose **Preferences: Color Theme** from the Command +Palette and select one of the four Tanaab variants. + +## License + +MIT © Tanaab Maneuvering Systems LLC diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/SUPPORT.md b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/SUPPORT.md new file mode 100644 index 0000000..8070a61 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/SUPPORT.md @@ -0,0 +1,8 @@ +# Support + +The Tanaab Visual Studio Code themes are currently an unpublished proof of concept. + +Report problems and visual inconsistencies through the +[`tanaabased/theme` issue tracker](https://github.com/tanaabased/theme/issues/new/choose). Include +the theme variant, Visual Studio Code version, language mode, and a screenshot when the problem is +visual. diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/images/icon.png b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/images/icon.png new file mode 100644 index 0000000..b7b7a65 Binary files /dev/null and b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/images/icon.png differ diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/package.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/package.json new file mode 100644 index 0000000..d30c599 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/package.json @@ -0,0 +1,59 @@ +{ + "name": "theme", + "displayName": "Tanaab-based themes", + "description": "Full Tanaab-based color themes for Visual Studio Code.", + "icon": "images/icon.png", + "version": "0.0.1", + "publisher": "tanaabased", + "author": "Mike Pirog @pirog", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/tanaabased/theme.git" + }, + "bugs": { + "url": "https://github.com/tanaabased/theme/issues/new/choose" + }, + "homepage": "https://github.com/tanaabased/theme", + "engines": { + "vscode": "^1.85.0" + }, + "categories": [ + "Themes" + ], + "keywords": [ + "tanaab", + "theme", + "color-theme", + "dark-theme", + "light-theme", + "solarized" + ], + "extensionKind": [ + "ui" + ], + "contributes": { + "themes": [ + { + "label": "Tanaab Dark", + "uiTheme": "vs-dark", + "path": "./themes/tanaab-dark-color-theme.json" + }, + { + "label": "Tanaab Light", + "uiTheme": "vs", + "path": "./themes/tanaab-light-color-theme.json" + }, + { + "label": "Tanaab Solarized Dark", + "uiTheme": "vs-dark", + "path": "./themes/tanaab-solarized-dark-color-theme.json" + }, + { + "label": "Tanaab Solarized Light", + "uiTheme": "vs", + "path": "./themes/tanaab-solarized-light-color-theme.json" + } + ] + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-color-theme.json new file mode 100644 index 0000000..c6b0d47 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-color-theme.json @@ -0,0 +1,126 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Dark", + "type": "dark", + "include": "./tanaab-dark-workbench-base.json", + "semanticHighlighting": false, + "colors": { + "focusBorder": "#59778866", + "foreground": "#bcd9df", + "descriptionForeground": "#bcd9df", + "disabledForeground": "#597788", + "textBlockQuote.background": "#283944", + "textBlockQuote.border": "#53626966", + "button.foreground": "#273238", + "button.secondaryBackground": "#536269", + "button.secondaryHoverBackground": "#597788", + "checkbox.background": "#283944", + "checkbox.border": "#53626980", + "dropdown.background": "#283944", + "dropdown.border": "#53626980", + "input.background": "#283944", + "input.border": "#53626980", + "input.placeholderForeground": "#8f9fa4", + "inputValidation.infoBackground": "#283944", + "pickerGroup.border": "#53626933", + "pickerGroup.foreground": "#8f9fa4", + "quickInput.background": "#283944", + "quickInputList.focusBackground": "#273238", + "quickInputList.focusIconForeground": "#bcd9df", + "quickInputTitle.background": "#273238", + "scrollbar.shadow": "#273238", + "scrollbarSlider.background": "#53626966", + "scrollbarSlider.hoverBackground": "#59778873", + "scrollbarSlider.activeBackground": "#59778899", + "titleBar.activeBackground": "#273238", + "titleBar.inactiveBackground": "#273238", + "titleBar.inactiveForeground": "#8f9fa4", + "titleBar.border": "#53626933", + "activityBar.background": "#273238", + "activityBar.inactiveForeground": "#8f9fa4", + "activityBar.border": "#53626933", + "sideBar.background": "#283944", + "sideBar.foreground": "#bcd9df", + "sideBar.border": "#53626933", + "sideBarSectionHeader.background": "#273238", + "sideBarSectionHeader.border": "#53626933", + "list.activeSelectionBackground": "#273238", + "list.inactiveSelectionBackground": "#53626933", + "list.hoverBackground": "#273238", + "list.focusOutline": "#59778866", + "tree.indentGuidesStroke": "#5362694d", + "editorGroup.border": "#53626900", + "editorGroup.focusedEmptyBorder": "#59778866", + "editorGroupHeader.tabsBackground": "#283944", + "editorGroupHeader.tabsBorder": "#53626900", + "tab.activeBackground": "#273238", + "tab.activeBorderTop": "#53626900", + "tab.inactiveBackground": "#283944", + "tab.inactiveForeground": "#8f9fa4", + "tab.border": "#53626900", + "tab.unfocusedActiveBorderTop": "#53626900", + "editor.background": "#273238", + "editor.foreground": "#bcd9df", + "editor.findMatchForeground": "#bcd9df", + "editor.findMatchHighlightForeground": "#ffffff", + "editorCursor.foreground": "#8f9fa4", + "editorLineNumber.foreground": "#597788", + "editorLineNumber.activeForeground": "#bcd9df", + "editor.findRangeHighlightBackground": "#283944", + "editor.hoverHighlightBackground": "#283944", + "editor.lineHighlightBackground": "#283944", + "editor.lineHighlightBorder": "#283944", + "editorWhitespace.foreground": "#536269", + "editorIndentGuide.background1": "#53626940", + "editorIndentGuide.activeBackground1": "#59778866", + "editorRuler.foreground": "#53626933", + "editorBracketPairGuide.background1": "#53626933", + "editorBracketPairGuide.background2": "#53626933", + "editorBracketPairGuide.background3": "#53626933", + "editorBracketPairGuide.background4": "#53626933", + "editorBracketPairGuide.background5": "#53626933", + "editorBracketPairGuide.background6": "#53626933", + "editorBracketPairGuide.activeBackground1": "#59778866", + "editorBracketPairGuide.activeBackground2": "#59778866", + "editorBracketPairGuide.activeBackground3": "#59778866", + "editorBracketPairGuide.activeBackground4": "#59778866", + "editorBracketPairGuide.activeBackground5": "#59778866", + "editorBracketPairGuide.activeBackground6": "#59778866", + "editorWidget.background": "#283944", + "editorWidget.border": "#53626966", + "editorHoverWidget.background": "#283944", + "editorHoverWidget.border": "#53626966", + "editorSuggestWidget.background": "#283944", + "editorSuggestWidget.border": "#53626966", + "peekView.border": "#53626966", + "peekViewEditor.background": "#273238", + "peekViewResult.background": "#283944", + "peekViewTitle.background": "#273238", + "panel.background": "#283944", + "panel.border": "#53626933", + "panelTitle.inactiveForeground": "#8f9fa4", + "statusBar.background": "#283944", + "statusBar.foreground": "#bcd9df", + "statusBar.border": "#5362694d", + "statusBar.noFolderBackground": "#283944", + "statusBarItem.hoverBackground": "#273238", + "terminal.background": "#273238", + "terminal.foreground": "#bcd9df", + "terminalCursor.background": "#273238", + "terminalCursor.foreground": "#8f9fa4", + "terminal.ansiBlack": "#31433d", + "gitDecoration.ignoredResourceForeground": "#597788", + "extensionButton.prominentForeground": "#273238", + "diffEditor.diagonalFill": "#536269", + "merge.border": "#536269", + "notifications.background": "#283944", + "notifications.border": "#53626966", + "commandCenter.background": "#283944", + "commandCenter.border": "#53626966", + "commandCenter.activeBackground": "#273238", + "commandCenter.activeBorder": "#59778866", + "keybindingLabel.background": "#283944", + "keybindingLabel.border": "#53626966", + "keybindingLabel.bottomBorder": "#273238" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-workbench-base.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-workbench-base.json new file mode 100644 index 0000000..e44c271 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-dark-workbench-base.json @@ -0,0 +1,120 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "tanaab-dark-workbench-base", + "include": "./tanaab-syntax-color-theme.json", + "semanticHighlighting": false, + "colors": { + "errorForeground": "#ff667d", + "textLink.foreground": "#00c88a", + "textLink.activeForeground": "#e25292", + "textCodeBlock.background": "#0a1210", + "textPreformat.foreground": "#38d7d0", + "button.background": "#00c88a", + "button.hoverBackground": "#33d3a1", + "button.secondaryForeground": "#ecf9f6", + "checkbox.foreground": "#00c88a", + "dropdown.foreground": "#ddebe8", + "input.foreground": "#ddebe8", + "inputOption.activeBackground": "#00c88a26", + "inputOption.activeBorder": "#008f64", + "inputValidation.errorBackground": "#3a1821", + "inputValidation.errorBorder": "#ff667d", + "inputValidation.infoBorder": "#5ab0ff", + "inputValidation.warningBackground": "#392c10", + "inputValidation.warningBorder": "#ffb000", + "badge.background": "#db2777", + "badge.foreground": "#ffffff", + "progressBar.background": "#00c88a", + "quickInput.foreground": "#ddebe8", + "quickInputList.focusForeground": "#ddebe8", + "titleBar.activeForeground": "#ddebe8", + "activityBar.foreground": "#ddebe8", + "activityBar.activeBorder": "#00c88a", + "activityBar.activeFocusBorder": "#00c88a", + "activityBarBadge.background": "#db2777", + "activityBarBadge.foreground": "#ffffff", + "sideBarTitle.foreground": "#ddebe8", + "sideBarSectionHeader.foreground": "#ddebe8", + "list.activeSelectionForeground": "#ecf9f6", + "list.inactiveSelectionForeground": "#ddebe8", + "list.hoverForeground": "#ecf9f6", + "list.highlightForeground": "#e25292", + "editorGroup.dropBackground": "#00c88a26", + "tab.activeForeground": "#ddebe8", + "editor.selectionBackground": "#00c88a40", + "editor.inactiveSelectionBackground": "#00c88a20", + "editor.selectionHighlightBackground": "#00c88a26", + "editor.wordHighlightBackground": "#00c88a20", + "editor.wordHighlightStrongBackground": "#00c88a33", + "editor.findMatchBackground": "#db2777", + "editor.findMatchHighlightBackground": "#db277766", + "editorLink.activeForeground": "#00c88a", + "editorBracketMatch.background": "#27323800", + "editorBracketMatch.border": "#27323800", + "editorBracketMatch.foreground": "#ddebe8", + "editorBracketHighlight.foreground1": "#ddebe866", + "editorBracketHighlight.foreground2": "#ddebe866", + "editorBracketHighlight.foreground3": "#ddebe866", + "editorBracketHighlight.foreground4": "#ddebe866", + "editorBracketHighlight.foreground5": "#ddebe866", + "editorBracketHighlight.foreground6": "#ddebe866", + "editorBracketHighlight.unexpectedBracket.foreground": "#ff667d", + "editorError.foreground": "#ff667d", + "editorWarning.foreground": "#ffb000", + "editorInfo.foreground": "#5ab0ff", + "editorHint.foreground": "#38d7d0", + "editorGutter.addedBackground": "#33d3a1", + "editorGutter.deletedBackground": "#ff667d", + "editorGutter.modifiedBackground": "#ffc333", + "editorWidget.foreground": "#ddebe8", + "editorSuggestWidget.foreground": "#ddebe8", + "editorSuggestWidget.highlightForeground": "#e25292", + "editorSuggestWidget.selectedBackground": "#00c88a26", + "peekViewEditor.matchHighlightBackground": "#392c10", + "peekViewResult.matchHighlightBackground": "#392c10", + "peekViewResult.selectionBackground": "#00c88a26", + "panelTitle.activeBorder": "#008f64", + "panelTitle.activeForeground": "#ddebe8", + "statusBar.debuggingBackground": "#b67e00", + "statusBar.debuggingForeground": "#ffffff", + "statusBarItem.remoteBackground": "#9c1c55", + "statusBarItem.remoteForeground": "#ffffff", + "terminal.selectionBackground": "#00c88a33", + "terminal.ansiRed": "#ff667d", + "terminal.ansiGreen": "#00c88a", + "terminal.ansiYellow": "#ffb000", + "terminal.ansiBlue": "#5ab0ff", + "terminal.ansiMagenta": "#e03a83", + "terminal.ansiCyan": "#38d7d0", + "terminal.ansiWhite": "#adc1b8", + "terminal.ansiBrightBlack": "#748a81", + "terminal.ansiBrightRed": "#ff8c9c", + "terminal.ansiBrightGreen": "#33d3a1", + "terminal.ansiBrightYellow": "#ffc333", + "terminal.ansiBrightBlue": "#83c6ff", + "terminal.ansiBrightMagenta": "#e25292", + "terminal.ansiBrightCyan": "#68e4df", + "terminal.ansiBrightWhite": "#e6f0eb", + "gitDecoration.addedResourceForeground": "#33d3a1", + "gitDecoration.modifiedResourceForeground": "#ffb000b3", + "gitDecoration.deletedResourceForeground": "#ff667d", + "gitDecoration.renamedResourceForeground": "#38d7d0", + "gitDecoration.untrackedResourceForeground": "#00c88a", + "gitDecoration.conflictingResourceForeground": "#e25292", + "extensionButton.prominentBackground": "#00c88a", + "extensionButton.prominentHoverBackground": "#33d3a1", + "extensionIcon.verifiedForeground": "#00c88a", + "diffEditor.insertedTextBackground": "#12372c", + "diffEditor.removedTextBackground": "#3a1821", + "diffEditor.insertedLineBackground": "#12372c99", + "diffEditor.removedLineBackground": "#3a182199", + "merge.currentHeaderBackground": "#12372c", + "merge.currentContentBackground": "#12372c99", + "merge.incomingHeaderBackground": "#392c10", + "merge.incomingContentBackground": "#392c1099", + "notifications.foreground": "#ddebe8", + "notificationLink.foreground": "#00c88a", + "commandCenter.foreground": "#ddebe8", + "keybindingLabel.foreground": "#ddebe8" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-color-theme.json new file mode 100644 index 0000000..83bbe36 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-color-theme.json @@ -0,0 +1,121 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Light", + "type": "light", + "include": "./tanaab-light-workbench-base.json", + "semanticHighlighting": false, + "colors": { + "focusBorder": "#59778866", + "foreground": "#273238", + "descriptionForeground": "#536269", + "disabledForeground": "#597788", + "textBlockQuote.border": "#bcd9df66", + "button.secondaryBackground": "#bcd9df", + "button.secondaryForeground": "#273238", + "button.secondaryHoverBackground": "#e4d9de", + "checkbox.background": "#ffffff", + "checkbox.border": "#bcd9df80", + "dropdown.background": "#ffffff", + "dropdown.border": "#bcd9df80", + "dropdown.foreground": "#273238", + "input.background": "#ffffff", + "input.border": "#bcd9df80", + "input.foreground": "#273238", + "input.placeholderForeground": "#597788", + "badge.foreground": "#273238", + "pickerGroup.border": "#bcd9df33", + "pickerGroup.foreground": "#597788", + "quickInput.background": "#ffffff", + "quickInput.foreground": "#273238", + "quickInputList.focusBackground": "#e4d9de", + "quickInputList.focusForeground": "#273238", + "quickInputList.focusIconForeground": "#536269", + "scrollbar.shadow": "#bcd9df", + "scrollbarSlider.background": "#bcd9df66", + "scrollbarSlider.hoverBackground": "#8f9fa473", + "scrollbarSlider.activeBackground": "#8f9fa499", + "titleBar.activeForeground": "#273238", + "titleBar.inactiveForeground": "#597788", + "titleBar.border": "#bcd9df33", + "activityBar.foreground": "#273238", + "activityBar.inactiveForeground": "#597788", + "activityBar.border": "#bcd9df33", + "activityBarBadge.foreground": "#273238", + "sideBar.foreground": "#536269", + "sideBar.border": "#bcd9df33", + "sideBarTitle.foreground": "#273238", + "sideBarSectionHeader.background": "#ffffff", + "sideBarSectionHeader.foreground": "#273238", + "sideBarSectionHeader.border": "#bcd9df33", + "list.activeSelectionBackground": "#ffffff", + "list.activeSelectionForeground": "#273238", + "list.inactiveSelectionBackground": "#e4d9de99", + "list.inactiveSelectionForeground": "#273238", + "list.hoverBackground": "#ffffff", + "list.hoverForeground": "#273238", + "list.focusOutline": "#59778866", + "tree.indentGuidesStroke": "#bcd9df4d", + "editorGroup.border": "#bcd9df00", + "editorGroup.focusedEmptyBorder": "#59778866", + "editorGroupHeader.tabsBorder": "#bcd9df00", + "tab.activeForeground": "#273238", + "tab.activeBorderTop": "#bcd9df00", + "tab.inactiveForeground": "#597788", + "tab.border": "#bcd9df00", + "tab.unfocusedActiveBorderTop": "#bcd9df00", + "editor.foreground": "#273238", + "editorCursor.foreground": "#8f9fa4", + "editorLineNumber.foreground": "#597788", + "editorLineNumber.activeForeground": "#536269", + "editor.inactiveSelectionBackground": "#e4d9de", + "editorWhitespace.foreground": "#bcd9df", + "editorIndentGuide.background1": "#bcd9df40", + "editorIndentGuide.activeBackground1": "#59778866", + "editorRuler.foreground": "#bcd9df33", + "editorBracketMatch.background": "#27323800", + "editorBracketMatch.border": "#27323800", + "editorBracketPairGuide.background1": "#bcd9df33", + "editorBracketPairGuide.background2": "#bcd9df33", + "editorBracketPairGuide.background3": "#bcd9df33", + "editorBracketPairGuide.background4": "#bcd9df33", + "editorBracketPairGuide.background5": "#bcd9df33", + "editorBracketPairGuide.background6": "#bcd9df33", + "editorBracketPairGuide.activeBackground1": "#59778866", + "editorBracketPairGuide.activeBackground2": "#59778866", + "editorBracketPairGuide.activeBackground3": "#59778866", + "editorBracketPairGuide.activeBackground4": "#59778866", + "editorBracketPairGuide.activeBackground5": "#59778866", + "editorBracketPairGuide.activeBackground6": "#59778866", + "editorWidget.background": "#ffffff", + "editorWidget.border": "#bcd9df66", + "editorWidget.foreground": "#273238", + "editorHoverWidget.background": "#ffffff", + "editorHoverWidget.border": "#bcd9df66", + "editorSuggestWidget.background": "#ffffff", + "editorSuggestWidget.border": "#bcd9df66", + "editorSuggestWidget.foreground": "#273238", + "peekView.border": "#bcd9df66", + "peekViewTitle.background": "#ffffff", + "panel.border": "#bcd9df33", + "panelTitle.activeForeground": "#273238", + "panelTitle.inactiveForeground": "#597788", + "statusBar.foreground": "#536269", + "statusBar.border": "#bcd9df4d", + "statusBarItem.hoverBackground": "#ffffff", + "terminal.foreground": "#273238", + "terminalCursor.foreground": "#8f9fa4", + "gitDecoration.ignoredResourceForeground": "#597788", + "diffEditor.diagonalFill": "#bcd9df", + "merge.border": "#bcd9df", + "notifications.background": "#ffffff", + "notifications.border": "#bcd9df66", + "notifications.foreground": "#273238", + "commandCenter.background": "#ffffff", + "commandCenter.border": "#bcd9df66", + "commandCenter.foreground": "#273238", + "commandCenter.activeBorder": "#59778866", + "keybindingLabel.border": "#bcd9df66", + "keybindingLabel.bottomBorder": "#8f9fa4", + "keybindingLabel.foreground": "#273238" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-workbench-base.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-workbench-base.json new file mode 100644 index 0000000..f51ab19 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-light-workbench-base.json @@ -0,0 +1,123 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "tanaab-light-workbench-base", + "include": "./tanaab-syntax-light-color-theme.json", + "semanticHighlighting": false, + "colors": { + "errorForeground": "#b4233c", + "textLink.foreground": "#db2777", + "textLink.activeForeground": "#e25292", + "textBlockQuote.background": "#ddebe8", + "textCodeBlock.background": "#bcd9df", + "textPreformat.foreground": "#087a82", + "button.background": "#db2777", + "button.foreground": "#ffffff", + "button.hoverBackground": "#e25292", + "checkbox.foreground": "#9c1c55", + "inputOption.activeBackground": "#f0c2d6", + "inputOption.activeBorder": "#9c1c55", + "inputValidation.errorBackground": "#f8dfe4", + "inputValidation.errorBorder": "#b4233c", + "inputValidation.infoBackground": "#ddebe8", + "inputValidation.infoBorder": "#0069b8", + "inputValidation.warningBackground": "#f6e9c8", + "inputValidation.warningBorder": "#8a5f00", + "badge.background": "#00c88a", + "progressBar.background": "#db2777", + "quickInputTitle.background": "#ddebe8", + "titleBar.activeBackground": "#ddebe8", + "titleBar.inactiveBackground": "#ddebe8", + "activityBar.background": "#ddebe8", + "activityBar.activeBorder": "#9c1c55", + "activityBarBadge.background": "#00c88a", + "sideBar.background": "#ddebe8", + "list.highlightForeground": "#9c1c55", + "editorGroup.dropBackground": "#f0c2d699", + "editorGroupHeader.tabsBackground": "#ddebe8", + "tab.activeBackground": "#ecf9f6", + "tab.inactiveBackground": "#ddebe8", + "editor.background": "#ecf9f6", + "editor.selectionBackground": "#f0c2d6", + "editor.selectionHighlightBackground": "#f0c2d699", + "editor.wordHighlightBackground": "#d6f2e899", + "editor.wordHighlightStrongBackground": "#f0c2d699", + "editor.findMatchBackground": "#ffc333", + "editor.findMatchHighlightBackground": "#f6e9c8", + "editor.findRangeHighlightBackground": "#ddebe8", + "editor.hoverHighlightBackground": "#ddebe8", + "editor.lineHighlightBackground": "#ddebe8", + "editor.lineHighlightBorder": "#ddebe8", + "editorLink.activeForeground": "#db2777", + "editorBracketHighlight.foreground1": "#53626966", + "editorBracketHighlight.foreground2": "#53626966", + "editorBracketHighlight.foreground3": "#53626966", + "editorBracketHighlight.foreground4": "#53626966", + "editorBracketHighlight.foreground5": "#53626966", + "editorBracketHighlight.foreground6": "#53626966", + "editorBracketHighlight.unexpectedBracket.foreground": "#b4233c", + "editorError.foreground": "#b4233c", + "editorWarning.foreground": "#8a5f00", + "editorInfo.foreground": "#0069b8", + "editorHint.foreground": "#087a82", + "editorGutter.addedBackground": "#007a56", + "editorGutter.deletedBackground": "#b4233c", + "editorGutter.modifiedBackground": "#8a5f00", + "editorSuggestWidget.highlightForeground": "#9c1c55", + "editorSuggestWidget.selectedBackground": "#f0c2d6", + "peekViewEditor.background": "#ecf9f6", + "peekViewEditor.matchHighlightBackground": "#f6e9c8", + "peekViewResult.background": "#ddebe8", + "peekViewResult.matchHighlightBackground": "#f6e9c8", + "peekViewResult.selectionBackground": "#f0c2d6", + "panel.background": "#ddebe8", + "panelTitle.activeBorder": "#9c1c55", + "statusBar.background": "#ddebe8", + "statusBar.noFolderBackground": "#ddebe8", + "statusBar.debuggingBackground": "#8a5f00", + "statusBar.debuggingForeground": "#ffffff", + "statusBarItem.remoteBackground": "#007a56", + "statusBarItem.remoteForeground": "#ffffff", + "terminal.background": "#ecf9f6", + "terminalCursor.background": "#ecf9f6", + "terminal.selectionBackground": "#f0c2d6", + "terminal.ansiBlack": "#102018", + "terminal.ansiRed": "#ff667d", + "terminal.ansiGreen": "#00c88a", + "terminal.ansiYellow": "#ffb000", + "terminal.ansiBlue": "#5ab0ff", + "terminal.ansiMagenta": "#e03a83", + "terminal.ansiCyan": "#38d7d0", + "terminal.ansiWhite": "#52675e", + "terminal.ansiBrightBlack": "#70857b", + "terminal.ansiBrightRed": "#ff8c9c", + "terminal.ansiBrightGreen": "#33d3a1", + "terminal.ansiBrightYellow": "#ffc333", + "terminal.ansiBrightBlue": "#83c6ff", + "terminal.ansiBrightMagenta": "#e25292", + "terminal.ansiBrightCyan": "#68e4df", + "terminal.ansiBrightWhite": "#5f746a", + "gitDecoration.addedResourceForeground": "#33d3a1", + "gitDecoration.modifiedResourceForeground": "#ffb000b3", + "gitDecoration.deletedResourceForeground": "#ff667d", + "gitDecoration.renamedResourceForeground": "#38d7d0", + "gitDecoration.untrackedResourceForeground": "#00c88a", + "gitDecoration.conflictingResourceForeground": "#e25292", + "diffEditor.insertedTextBackground": "#d6f2e8", + "diffEditor.removedTextBackground": "#f8dfe4", + "diffEditor.insertedLineBackground": "#d6f2e899", + "diffEditor.removedLineBackground": "#f8dfe499", + "merge.currentHeaderBackground": "#d6f2e8", + "merge.currentContentBackground": "#d6f2e899", + "merge.incomingHeaderBackground": "#f6e9c8", + "merge.incomingContentBackground": "#f6e9c899", + "notificationLink.foreground": "#db2777", + "commandCenter.activeBackground": "#f0c2d6", + "keybindingLabel.background": "#ddebe8", + "activityBar.activeFocusBorder": "#9c1c55", + "extensionButton.prominentForeground": "#ffffff", + "extensionButton.prominentBackground": "#db2777", + "extensionButton.prominentHoverBackground": "#e25292", + "extensionIcon.verifiedForeground": "#db2777", + "editorBracketMatch.foreground": "#536269" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-dark-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-dark-color-theme.json new file mode 100644 index 0000000..31892c1 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-dark-color-theme.json @@ -0,0 +1,126 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Solarized Dark", + "type": "dark", + "include": "./tanaab-dark-workbench-base.json", + "semanticHighlighting": false, + "colors": { + "focusBorder": "#517d9466", + "foreground": "#adc1b8", + "descriptionForeground": "#82a3b3", + "disabledForeground": "#517d94", + "textBlockQuote.background": "#003851", + "textBlockQuote.border": "#43708666", + "button.foreground": "#002d45", + "button.secondaryBackground": "#437086", + "button.secondaryHoverBackground": "#517d94", + "checkbox.background": "#003851", + "checkbox.border": "#43708680", + "dropdown.background": "#003851", + "dropdown.border": "#43708680", + "input.background": "#003851", + "input.border": "#43708680", + "input.placeholderForeground": "#7196a8", + "inputValidation.infoBackground": "#003851", + "pickerGroup.border": "#43708633", + "pickerGroup.foreground": "#7196a8", + "quickInput.background": "#003851", + "quickInputList.focusBackground": "#002d45", + "quickInputList.focusIconForeground": "#82a3b3", + "quickInputTitle.background": "#002d45", + "scrollbar.shadow": "#002d45", + "scrollbarSlider.background": "#43708666", + "scrollbarSlider.hoverBackground": "#517d9473", + "scrollbarSlider.activeBackground": "#517d9499", + "titleBar.activeBackground": "#002d45", + "titleBar.inactiveBackground": "#002d45", + "titleBar.inactiveForeground": "#7196a8", + "titleBar.border": "#43708633", + "activityBar.background": "#002d45", + "activityBar.inactiveForeground": "#7196a8", + "activityBar.border": "#43708633", + "sideBar.background": "#003851", + "sideBar.foreground": "#82a3b3", + "sideBar.border": "#43708633", + "sideBarSectionHeader.background": "#002d45", + "sideBarSectionHeader.border": "#43708633", + "list.activeSelectionBackground": "#002d45", + "list.inactiveSelectionBackground": "#43708633", + "list.hoverBackground": "#002d45", + "list.focusOutline": "#517d9466", + "tree.indentGuidesStroke": "#4370864d", + "editorGroup.border": "#43708600", + "editorGroup.focusedEmptyBorder": "#517d9466", + "editorGroupHeader.tabsBackground": "#003851", + "editorGroupHeader.tabsBorder": "#43708600", + "tab.activeBackground": "#002d45", + "tab.activeBorderTop": "#43708600", + "tab.inactiveBackground": "#003851", + "tab.inactiveForeground": "#7196a8", + "tab.border": "#43708600", + "tab.unfocusedActiveBorderTop": "#43708600", + "editor.background": "#002d45", + "editor.foreground": "#82a3b3", + "editor.findMatchForeground": "#82a3b3", + "editor.findMatchHighlightForeground": "#ffffff", + "editorCursor.foreground": "#748a81", + "editorLineNumber.foreground": "#517d94", + "editorLineNumber.activeForeground": "#82a3b3", + "editor.findRangeHighlightBackground": "#003851", + "editor.hoverHighlightBackground": "#003851", + "editor.lineHighlightBackground": "#003851", + "editor.lineHighlightBorder": "#003851", + "editorWhitespace.foreground": "#437086", + "editorIndentGuide.background1": "#43708640", + "editorIndentGuide.activeBackground1": "#517d9466", + "editorRuler.foreground": "#43708633", + "editorBracketPairGuide.background1": "#43708633", + "editorBracketPairGuide.background2": "#43708633", + "editorBracketPairGuide.background3": "#43708633", + "editorBracketPairGuide.background4": "#43708633", + "editorBracketPairGuide.background5": "#43708633", + "editorBracketPairGuide.background6": "#43708633", + "editorBracketPairGuide.activeBackground1": "#517d9466", + "editorBracketPairGuide.activeBackground2": "#517d9466", + "editorBracketPairGuide.activeBackground3": "#517d9466", + "editorBracketPairGuide.activeBackground4": "#517d9466", + "editorBracketPairGuide.activeBackground5": "#517d9466", + "editorBracketPairGuide.activeBackground6": "#517d9466", + "editorWidget.background": "#003851", + "editorWidget.border": "#43708666", + "editorHoverWidget.background": "#003851", + "editorHoverWidget.border": "#43708666", + "editorSuggestWidget.background": "#003851", + "editorSuggestWidget.border": "#43708666", + "peekView.border": "#43708666", + "peekViewEditor.background": "#002d45", + "peekViewResult.background": "#003851", + "peekViewTitle.background": "#002d45", + "panel.background": "#003851", + "panel.border": "#43708633", + "panelTitle.inactiveForeground": "#7196a8", + "statusBar.background": "#003851", + "statusBar.foreground": "#82a3b3", + "statusBar.border": "#4370864d", + "statusBar.noFolderBackground": "#003851", + "statusBarItem.hoverBackground": "#002d45", + "terminal.background": "#002d45", + "terminal.foreground": "#adc1b8", + "terminalCursor.background": "#002d45", + "terminalCursor.foreground": "#748a81", + "terminal.ansiBlack": "#003851", + "gitDecoration.ignoredResourceForeground": "#517d94", + "extensionButton.prominentForeground": "#002d45", + "diffEditor.diagonalFill": "#437086", + "merge.border": "#437086", + "notifications.background": "#003851", + "notifications.border": "#43708666", + "commandCenter.background": "#003851", + "commandCenter.border": "#43708666", + "commandCenter.activeBackground": "#002d45", + "commandCenter.activeBorder": "#517d9466", + "keybindingLabel.background": "#003851", + "keybindingLabel.border": "#43708666", + "keybindingLabel.bottomBorder": "#002d45" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-light-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-light-color-theme.json new file mode 100644 index 0000000..e4232a5 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-solarized-light-color-theme.json @@ -0,0 +1,121 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Solarized Light", + "type": "light", + "include": "./tanaab-light-workbench-base.json", + "semanticHighlighting": false, + "colors": { + "focusBorder": "#517d9466", + "foreground": "#437086", + "descriptionForeground": "#517d94", + "disabledForeground": "#7196a8", + "textBlockQuote.border": "#82a3b366", + "button.secondaryBackground": "#ddebe8", + "button.secondaryForeground": "#102018", + "button.secondaryHoverBackground": "#82a3b3", + "checkbox.background": "#ecf9f6", + "checkbox.border": "#82a3b380", + "dropdown.background": "#ecf9f6", + "dropdown.border": "#82a3b380", + "dropdown.foreground": "#102018", + "input.background": "#ecf9f6", + "input.border": "#82a3b380", + "input.foreground": "#102018", + "input.placeholderForeground": "#517d94", + "badge.foreground": "#002d45", + "pickerGroup.border": "#82a3b333", + "pickerGroup.foreground": "#517d94", + "quickInput.background": "#ecf9f6", + "quickInput.foreground": "#102018", + "quickInputList.focusBackground": "#ddebe8", + "quickInputList.focusForeground": "#102018", + "quickInputList.focusIconForeground": "#517d94", + "scrollbar.shadow": "#82a3b3", + "scrollbarSlider.background": "#82a3b366", + "scrollbarSlider.hoverBackground": "#517d9473", + "scrollbarSlider.activeBackground": "#517d9499", + "titleBar.activeForeground": "#102018", + "titleBar.inactiveForeground": "#517d94", + "titleBar.border": "#82a3b333", + "activityBar.foreground": "#102018", + "activityBar.inactiveForeground": "#517d94", + "activityBar.border": "#82a3b333", + "activityBarBadge.foreground": "#002d45", + "sideBar.foreground": "#52675e", + "sideBar.border": "#82a3b333", + "sideBarTitle.foreground": "#102018", + "sideBarSectionHeader.background": "#ecf9f6", + "sideBarSectionHeader.foreground": "#102018", + "sideBarSectionHeader.border": "#82a3b333", + "list.activeSelectionBackground": "#ecf9f6", + "list.activeSelectionForeground": "#102018", + "list.inactiveSelectionBackground": "#82a3b333", + "list.inactiveSelectionForeground": "#102018", + "list.hoverBackground": "#ecf9f6", + "list.hoverForeground": "#102018", + "list.focusOutline": "#517d9466", + "tree.indentGuidesStroke": "#82a3b34d", + "editorGroup.border": "#82a3b300", + "editorGroup.focusedEmptyBorder": "#517d9466", + "editorGroupHeader.tabsBorder": "#82a3b300", + "tab.activeForeground": "#102018", + "tab.activeBorderTop": "#82a3b300", + "tab.inactiveForeground": "#517d94", + "tab.border": "#82a3b300", + "tab.unfocusedActiveBorderTop": "#82a3b300", + "editor.foreground": "#437086", + "editorCursor.foreground": "#70857b", + "editorLineNumber.foreground": "#517d94", + "editorLineNumber.activeForeground": "#517d94", + "editor.inactiveSelectionBackground": "#ddebe8", + "editorWhitespace.foreground": "#82a3b3", + "editorIndentGuide.background1": "#82a3b340", + "editorIndentGuide.activeBackground1": "#517d9466", + "editorRuler.foreground": "#82a3b333", + "editorBracketMatch.background": "#002d4500", + "editorBracketMatch.border": "#002d4500", + "editorBracketPairGuide.background1": "#82a3b333", + "editorBracketPairGuide.background2": "#82a3b333", + "editorBracketPairGuide.background3": "#82a3b333", + "editorBracketPairGuide.background4": "#82a3b333", + "editorBracketPairGuide.background5": "#82a3b333", + "editorBracketPairGuide.background6": "#82a3b333", + "editorBracketPairGuide.activeBackground1": "#517d9466", + "editorBracketPairGuide.activeBackground2": "#517d9466", + "editorBracketPairGuide.activeBackground3": "#517d9466", + "editorBracketPairGuide.activeBackground4": "#517d9466", + "editorBracketPairGuide.activeBackground5": "#517d9466", + "editorBracketPairGuide.activeBackground6": "#517d9466", + "editorWidget.background": "#ecf9f6", + "editorWidget.border": "#82a3b366", + "editorWidget.foreground": "#102018", + "editorHoverWidget.background": "#ecf9f6", + "editorHoverWidget.border": "#82a3b366", + "editorSuggestWidget.background": "#ecf9f6", + "editorSuggestWidget.border": "#82a3b366", + "editorSuggestWidget.foreground": "#102018", + "peekView.border": "#82a3b366", + "peekViewTitle.background": "#ecf9f6", + "panel.border": "#82a3b333", + "panelTitle.activeForeground": "#102018", + "panelTitle.inactiveForeground": "#517d94", + "statusBar.foreground": "#52675e", + "statusBar.border": "#82a3b34d", + "statusBarItem.hoverBackground": "#ecf9f6", + "terminal.foreground": "#437086", + "terminalCursor.foreground": "#70857b", + "gitDecoration.ignoredResourceForeground": "#517d94", + "diffEditor.diagonalFill": "#82a3b3", + "merge.border": "#82a3b3", + "notifications.background": "#ecf9f6", + "notifications.border": "#82a3b366", + "notifications.foreground": "#102018", + "commandCenter.background": "#ecf9f6", + "commandCenter.border": "#82a3b366", + "commandCenter.foreground": "#102018", + "commandCenter.activeBorder": "#517d9466", + "keybindingLabel.border": "#82a3b366", + "keybindingLabel.bottomBorder": "#517d94", + "keybindingLabel.foreground": "#102018" + } +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-color-theme.json new file mode 100644 index 0000000..484e2d3 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-color-theme.json @@ -0,0 +1,394 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Shared Syntax", + "semanticHighlighting": false, + "tokenColors": [ + { + "name": "Default syntax", + "settings": { + "foreground": "#bcd9df" + } + }, + { + "name": "Comments", + "scope": ["comment", "punctuation.definition.comment"], + "settings": { + "foreground": "#8f9fa4", + "fontStyle": "italic" + } + }, + { + "name": "Punctuation", + "scope": [ + "punctuation", + "meta.brace", + "meta.delimiter", + "keyword.operator", + "keyword.other.unit", + "storage.type.function.arrow" + ], + "settings": { + "foreground": "#8f9fa4" + } + }, + { + "name": "Structural brackets", + "scope": [ + "punctuation.definition.block", + "punctuation.definition.array", + "punctuation.definition.parameters", + "punctuation.definition.arguments.shell", + "punctuation.definition.binding-pattern", + "punctuation.definition.group.shell", + "punctuation.definition.interpolation", + "punctuation.definition.logical-expression.shell", + "punctuation.definition.subshell.single.shell", + "punctuation.definition.tag", + "punctuation.definition.variable.shell", + "punctuation.section.block", + "punctuation.section.bracket.curly.variable.begin.shell", + "punctuation.section.bracket.curly.variable.end.shell", + "punctuation.section.brackets", + "punctuation.section.property-list", + "punctuation.section.function", + "meta.brace" + ], + "settings": { + "foreground": "#ddebe866" + } + }, + { + "name": "Keywords", + "scope": ["keyword"], + "settings": { + "foreground": "#e25292" + } + }, + { + "name": "Value declarations and storage words", + "scope": ["storage.type", "storage.modifier.local.shell", "storage.modifier.declare.shell"], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Callable and type declaration keywords", + "scope": [ + "storage.type.function", + "storage.type.class", + "storage.type.interface", + "storage.type.enum", + "storage.type.struct", + "storage.modifier", + "entity.name.function.shell", + "keyword.control.import", + "keyword.control.export", + "keyword.control.from", + "keyword.control.as", + "keyword.control.require", + "keyword.control.new", + "keyword.operator.new", + "keyword.operator.expression.import" + ], + "settings": { + "foreground": "#e25292" + } + }, + { + "name": "JSDoc annotations", + "scope": [ + "entity.name.type.instance.jsdoc", + "variable.other.jsdoc", + "constant.language.access-type.jsdoc", + "constant.language.symbol-type.jsdoc", + "comment.block.documentation source.embedded.ts" + ], + "settings": { + "foreground": "#ddebe8" + } + }, + { + "name": "JSDoc tags", + "scope": ["storage.type.class.jsdoc", "punctuation.definition.block.tag.jsdoc"], + "settings": { + "foreground": "#ddebe8", + "fontStyle": "bold" + } + }, + { + "name": "Structural control flow", + "scope": [ + "keyword.control.conditional", + "keyword.control.loop", + "keyword.control.flow", + "keyword.control.switch", + "keyword.control.trycatch", + "keyword.control.with", + "keyword.control.default", + "source.shell keyword.control" + ], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Variables", + "scope": ["variable", "identifier"], + "settings": { + "foreground": "#bcd9df" + } + }, + { + "name": "Parameters", + "scope": ["variable.parameter"], + "settings": { + "foreground": "#ffc333" + } + }, + { + "name": "Properties and structured keys", + "scope": [ + "variable.other.property", + "variable.other.object.property", + "support.variable.property", + "meta.object-literal.key", + "meta.object.member", + "meta.property.object", + "support.type.property-name", + "support.type.property-name.json", + "support.type.property-name.yaml", + "support.type.property-name.toml", + "entity.name.tag.yaml", + "meta.mapping.key" + ], + "settings": { + "foreground": "#ddebe8" + } + }, + { + "name": "Constants and literals", + "scope": ["constant", "constant.numeric", "constant.language", "variable.other.constant"], + "settings": { + "foreground": "#bcd9df" + } + }, + { + "name": "Booleans", + "scope": ["constant.language.boolean", "constant.language.json"], + "settings": { + "foreground": "#ffc333" + } + }, + { + "name": "Numbers", + "scope": ["constant.numeric"], + "settings": { + "foreground": "#8f9fa4" + } + }, + { + "name": "Strings", + "scope": ["string", "string.quoted", "string.template"], + "settings": { + "foreground": "#38d7d0" + } + }, + { + "name": "Structured data strings", + "scope": ["source.json string", "source.yaml string", "source.toml string"], + "settings": { + "foreground": "#bcd9df" + } + }, + { + "name": "String escapes", + "scope": ["constant.character.escape", "constant.character.format.placeholder"], + "settings": { + "foreground": "#ffc333" + } + }, + { + "name": "Regular expressions", + "scope": ["string.regexp", "constant.other.character-class.regexp"], + "settings": { + "foreground": "#38d7d0" + } + }, + { + "name": "Callable and type identifiers", + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call", + "variable.function", + "entity.name.type", + "entity.name.class", + "support.type", + "support.class" + ], + "settings": { + "foreground": "#82a3b3" + } + }, + { + "name": "Tags", + "scope": ["entity.name.tag"], + "settings": { + "foreground": "#82a3b380" + } + }, + { + "name": "Attributes", + "scope": ["entity.other.attribute-name", "punctuation.attribute-shorthand"], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Important style declarations", + "scope": ["keyword.other.important.css", "keyword.other.important.scss"], + "settings": { + "foreground": "#ffc333" + } + }, + { + "name": "TOML table headers", + "scope": [ + "support.type.property-name.table.toml", + "support.type.property-name.array.toml", + "punctuation.definition.table.toml", + "punctuation.definition.array.table.toml", + "punctuation.separator.dot.toml" + ], + "settings": { + "foreground": "#ddebe866" + } + }, + { + "name": "Markdown level-one headings", + "scope": [ + "heading.1.markdown", + "heading.1.markdown punctuation.definition.heading.markdown", + "heading.1.markdown entity.name.section.markdown", + "markup.heading.setext.1.markdown" + ], + "settings": { + "foreground": "#ffc333", + "fontStyle": "bold" + } + }, + { + "name": "Markdown secondary headings", + "scope": [ + "heading.2.markdown", + "heading.3.markdown", + "heading.4.markdown", + "heading.5.markdown", + "heading.6.markdown", + "heading.2.markdown punctuation.definition.heading.markdown", + "heading.3.markdown punctuation.definition.heading.markdown", + "heading.4.markdown punctuation.definition.heading.markdown", + "heading.5.markdown punctuation.definition.heading.markdown", + "heading.6.markdown punctuation.definition.heading.markdown", + "heading.2.markdown entity.name.section.markdown", + "heading.3.markdown entity.name.section.markdown", + "heading.4.markdown entity.name.section.markdown", + "heading.5.markdown entity.name.section.markdown", + "heading.6.markdown entity.name.section.markdown", + "markup.heading.setext.2.markdown" + ], + "settings": { + "foreground": "#00c88a", + "fontStyle": "bold" + } + }, + { + "name": "Markdown list markers", + "scope": ["punctuation.definition.list.begin.markdown"], + "settings": { + "foreground": "#38d7d0" + } + }, + { + "name": "Markdown quotes", + "scope": ["markup.quote.markdown", "punctuation.definition.quote.begin.markdown"], + "settings": { + "foreground": "#8f9fa4", + "fontStyle": "italic" + } + }, + { + "name": "Markdown inline code", + "scope": ["markup.inline.raw"], + "settings": { + "foreground": "#ddebe8", + "background": "#0a1210" + } + }, + { + "name": "Markdown fenced code background", + "scope": ["markup.fenced_code.block.markdown", "markup.raw.block.markdown"], + "settings": { + "background": "#0a1210" + } + }, + { + "name": "Markdown table background", + "scope": ["markup.table.markdown"], + "settings": { + "background": "#0a1210" + } + }, + { + "name": "Links", + "scope": ["markup.underline.link", "string.other.link"], + "settings": { + "foreground": "#38d7d0", + "fontStyle": "underline" + } + }, + { + "name": "Bold markup", + "scope": ["markup.bold"], + "settings": { + "fontStyle": "bold" + } + }, + { + "name": "Italic markup", + "scope": ["markup.italic"], + "settings": { + "fontStyle": "italic" + } + }, + { + "name": "Inserted markup", + "scope": ["markup.inserted", "meta.diff.header.to-file"], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Deleted markup", + "scope": ["markup.deleted", "meta.diff.header.from-file"], + "settings": { + "foreground": "#ff667d" + } + }, + { + "name": "Changed markup", + "scope": ["markup.changed"], + "settings": { + "foreground": "#ffc333" + } + }, + { + "name": "Invalid", + "scope": ["invalid"], + "settings": { + "foreground": "#ff667d", + "fontStyle": "underline" + } + } + ] +} diff --git a/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-light-color-theme.json b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-light-color-theme.json new file mode 100644 index 0000000..148d338 --- /dev/null +++ b/dotfiles/vscode/.vscode/extensions/tanaabased.theme/themes/tanaab-syntax-light-color-theme.json @@ -0,0 +1,304 @@ +{ + "$schema": "vscode://schemas/color-theme", + "name": "Tanaab Shared Light Syntax", + "include": "./tanaab-syntax-color-theme.json", + "semanticHighlighting": false, + "tokenColors": [ + { + "name": "Light default syntax", + "settings": { + "foreground": "#273238" + } + }, + { + "name": "Light comments", + "scope": ["comment", "punctuation.definition.comment"], + "settings": { + "foreground": "#597788", + "fontStyle": "italic" + } + }, + { + "name": "Light punctuation", + "scope": [ + "punctuation", + "meta.brace", + "meta.delimiter", + "keyword.operator", + "keyword.other.unit", + "storage.type.function.arrow" + ], + "settings": { + "foreground": "#536269" + } + }, + { + "name": "Light structural brackets", + "scope": [ + "punctuation.definition.block", + "punctuation.definition.array", + "punctuation.definition.parameters", + "punctuation.definition.arguments.shell", + "punctuation.definition.binding-pattern", + "punctuation.definition.group.shell", + "punctuation.definition.interpolation", + "punctuation.definition.logical-expression.shell", + "punctuation.definition.subshell.single.shell", + "punctuation.definition.tag", + "punctuation.definition.variable.shell", + "punctuation.section.block", + "punctuation.section.bracket.curly.variable.begin.shell", + "punctuation.section.bracket.curly.variable.end.shell", + "punctuation.section.brackets", + "punctuation.section.property-list", + "punctuation.section.function", + "meta.brace" + ], + "settings": { + "foreground": "#53626966" + } + }, + { + "name": "Light JSDoc annotations", + "scope": [ + "entity.name.type.instance.jsdoc", + "variable.other.jsdoc", + "constant.language.access-type.jsdoc", + "constant.language.symbol-type.jsdoc", + "comment.block.documentation source.embedded.ts" + ], + "settings": { + "foreground": "#536269" + } + }, + { + "name": "Light JSDoc tags", + "scope": ["storage.type.class.jsdoc", "punctuation.definition.block.tag.jsdoc"], + "settings": { + "foreground": "#536269", + "fontStyle": "bold" + } + }, + { + "name": "Light variables", + "scope": ["variable", "identifier"], + "settings": { + "foreground": "#273238" + } + }, + { + "name": "Light properties and structured keys", + "scope": [ + "variable.other.property", + "variable.other.object.property", + "support.variable.property", + "meta.object-literal.key", + "meta.object.member", + "meta.property.object", + "support.type.property-name", + "support.type.property-name.json", + "support.type.property-name.yaml", + "support.type.property-name.toml", + "entity.name.tag.yaml", + "meta.mapping.key" + ], + "settings": { + "foreground": "#536269" + } + }, + { + "name": "Light constants and literals", + "scope": ["constant", "constant.numeric", "constant.language", "variable.other.constant"], + "settings": { + "foreground": "#273238" + } + }, + { + "name": "Light booleans", + "scope": ["constant.language.boolean", "constant.language.json"], + "settings": { + "foreground": "#8a5f00" + } + }, + { + "name": "Light numbers", + "scope": ["constant.numeric"], + "settings": { + "foreground": "#597788" + } + }, + { + "name": "Light structured data strings", + "scope": ["source.json string", "source.yaml string", "source.toml string"], + "settings": { + "foreground": "#273238" + } + }, + { + "name": "Light callable and type identifiers", + "scope": [ + "entity.name.function", + "support.function", + "meta.function-call", + "variable.function", + "entity.name.type", + "entity.name.class", + "support.type", + "support.class" + ], + "settings": { + "foreground": "#517d94" + } + }, + { + "name": "Light TOML table headers", + "scope": [ + "support.type.property-name.table.toml", + "support.type.property-name.array.toml", + "punctuation.definition.table.toml", + "punctuation.definition.array.table.toml", + "punctuation.separator.dot.toml" + ], + "settings": { + "foreground": "#53626966" + } + }, + { + "name": "Light Markdown quotes", + "scope": ["markup.quote.markdown", "punctuation.definition.quote.begin.markdown"], + "settings": { + "foreground": "#597788", + "fontStyle": "italic" + } + }, + { + "name": "Light Markdown inline code", + "scope": ["markup.inline.raw"], + "settings": { + "foreground": "#536269", + "background": "#bcd9df" + } + }, + { + "name": "Light Markdown fenced code background", + "scope": ["markup.fenced_code.block.markdown", "markup.raw.block.markdown"], + "settings": { + "background": "#bcd9df" + } + }, + { + "name": "Light Markdown table background", + "scope": ["markup.table.markdown"], + "settings": { + "background": "#bcd9df" + } + }, + { + "name": "Light links", + "scope": ["markup.underline.link", "string.other.link"], + "settings": { + "foreground": "#087a82", + "fontStyle": "underline" + } + }, + { + "name": "Light keywords", + "scope": ["keyword"], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Light value declarations and storage words", + "scope": ["storage.type", "storage.modifier.local.shell", "storage.modifier.declare.shell"], + "settings": { + "foreground": "#e25292" + } + }, + { + "name": "Light callable and type declaration keywords", + "scope": [ + "storage.type.function", + "storage.type.class", + "storage.type.interface", + "storage.type.enum", + "storage.type.struct", + "storage.modifier", + "entity.name.function.shell", + "keyword.control.import", + "keyword.control.export", + "keyword.control.from", + "keyword.control.as", + "keyword.control.require", + "keyword.control.new", + "keyword.operator.new", + "keyword.operator.expression.import" + ], + "settings": { + "foreground": "#33d3a1" + } + }, + { + "name": "Light structural control flow", + "scope": [ + "keyword.control.conditional", + "keyword.control.loop", + "keyword.control.flow", + "keyword.control.switch", + "keyword.control.trycatch", + "keyword.control.with", + "keyword.control.default", + "source.shell keyword.control" + ], + "settings": { + "foreground": "#e25292" + } + }, + { + "name": "Light tags", + "scope": ["entity.name.tag"], + "settings": { + "foreground": "#517d9480" + } + }, + { + "name": "Light attributes", + "scope": ["entity.other.attribute-name", "punctuation.attribute-shorthand"], + "settings": { + "foreground": "#e25292" + } + }, + { + "name": "Light important style declarations", + "scope": ["keyword.other.important.css", "keyword.other.important.scss"], + "settings": { + "foreground": "#8a5f00" + } + }, + { + "name": "Light Markdown secondary headings", + "scope": [ + "heading.2.markdown", + "heading.3.markdown", + "heading.4.markdown", + "heading.5.markdown", + "heading.6.markdown", + "heading.2.markdown punctuation.definition.heading.markdown", + "heading.3.markdown punctuation.definition.heading.markdown", + "heading.4.markdown punctuation.definition.heading.markdown", + "heading.5.markdown punctuation.definition.heading.markdown", + "heading.6.markdown punctuation.definition.heading.markdown", + "heading.2.markdown entity.name.section.markdown", + "heading.3.markdown entity.name.section.markdown", + "heading.4.markdown entity.name.section.markdown", + "heading.5.markdown entity.name.section.markdown", + "heading.6.markdown entity.name.section.markdown", + "markup.heading.setext.2.markdown" + ], + "settings": { + "foreground": "#db2777", + "fontStyle": "bold" + } + } + ] +} diff --git a/dotfiles/vscode/Library/Application Support/Code/User/settings.json b/dotfiles/vscode/Library/Application Support/Code/User/settings.json new file mode 100644 index 0000000..85e89dd --- /dev/null +++ b/dotfiles/vscode/Library/Application Support/Code/User/settings.json @@ -0,0 +1,21 @@ +{ + "editor.cursorStyle": "block", + "editor.detectIndentation": true, + "editor.fontFamily": "'Meslo LG M DZ for Powerline', Menlo, Monaco, 'Courier New', monospace", + "editor.fontSize": 16, + "editor.insertSpaces": true, + "editor.minimap.renderCharacters": false, + "editor.multiCursorLimit": 30000, + "editor.renderWhitespace": "trailing", + "editor.rulers": [80, 120], + "editor.tabSize": 2, + "explorer.confirmDragAndDrop": false, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + "javascript.updateImportsOnFileMove.enabled": "always", + "prettier.requireConfig": true, + "prettier.singleQuote": true, + "prettier.useEditorConfig": false, + "terminal.integrated.defaultProfile.osx": "zsh", + "workbench.colorTheme": "Tanaab Solarized Dark" +} diff --git a/dotfiles/warp/.warp/settings.toml b/dotfiles/warp/.warp/settings.toml new file mode 100644 index 0000000..d41a96c --- /dev/null +++ b/dotfiles/warp/.warp/settings.toml @@ -0,0 +1,97 @@ +[appearance] +spacing = "normal" + +[appearance.tabs] +workspace_decoration_visibility = "always_show" +directory_tab_colors = { "/Users/pirog/tanaab" = { color = "cyan" }, "/Users/pirog/work" = { color = "magenta" } } + +[appearance.text] +font_size = 16.0 +notebook_font_size = 14.0 +match_notebook_to_monospace_font_size = true + +[appearance.vertical_tabs] +enabled = true + +[appearance.themes] +theme = { custom = { name = "Tanaab Solarized Dark", path = "tanaab-solarized-dark.yaml" } } +system_theme = false + +[appearance.full_screen_apps] +alt_screen_padding = { custom = { uniform_padding = 0.0 } } + +[appearance.window] +override_blur = 1 +override_opacity = 82 +zoom_level = 100 + +[appearance.icon] +app_icon = "comets" + +[appearance.input] +input_mode = "pinned_to_bottom" + +[appearance.panes] +should_dim_inactive_panes = true + +[appearance.cursor] +cursor_display_type = "block" + +[agents] +cloud_conversation_storage_enabled = true + +[agents.warp_agent] + +[agents.warp_agent.input] +nld_in_terminal_enabled = true + +[privacy] +telemetry_enabled = true +crash_reporting_enabled = true +custom_secret_regex_list = [ + { name = "IPv4 Address", pattern = '\b((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}\b' }, + { + name = "IPv6 Address", + pattern = '\b((([0-9A-Fa-f]{1,4}:){1,6}:)|(([0-9A-Fa-f]{1,4}:){7}))([0-9A-Fa-f]{1,4})\b', + }, + { name = "Slack App Token", pattern = '\bxapp-[0-9]+-[A-Za-z0-9_]+-[0-9]+-[a-f0-9]+\b' }, + { name = "Phone Number", pattern = '\b(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}\b' }, + { + name = "AWS Access ID", + pattern = '\b(AKIA|A3T|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{12,}\b', + }, + { + name = "MAC Address", + pattern = '\b((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))\b', + }, + { name = "Google API Key", pattern = '\bAIza[0-9A-Za-z-_]{35}\b' }, + { name = "Google OAuth ID", pattern = '\b[0-9]+-[0-9A-Za-z_]{32}\.apps\.googleusercontent\.com\b' }, + { name = "GitHub Classic Personal Access Token", pattern = '\bghp_[A-Za-z0-9_]{36}\b' }, + { name = "GitHub Fine-Grained Personal Access Token", pattern = '\bgithub_pat_[A-Za-z0-9_]{82}\b' }, + { name = "GitHub OAuth Access Token", pattern = '\bgho_[A-Za-z0-9_]{36}\b' }, + { name = "GitHub User-to-Server Token", pattern = '\bghu_[A-Za-z0-9_]{36}\b' }, + { name = "GitHub Server-to-Server Token", pattern = '\bghs_[A-Za-z0-9_]{36}\b' }, + { name = "Stripe Key", pattern = '\b(?:r|s)k_(test|live)_[0-9a-zA-Z]{24}\b' }, + { name = "Firebase Auth Domain", pattern = '\b([a-z0-9-]){1,30}(\.firebaseapp\.com)\b' }, + { name = "JWT", pattern = '\b(ey[a-zA-z0-9_\-=]{10,}\.){2}[a-zA-z0-9_\-=]{10,}\b' }, + { name = "OpenAI API Key", pattern = '\bsk-[a-zA-Z0-9]{48}\b' }, + { name = "Anthropic API Key", pattern = '\bsk-ant-api\d{0,2}-[a-zA-Z0-9\-]{80,120}\b' }, + { name = "Generic SK API Key", pattern = '\bsk-[a-zA-Z0-9\-]{10,100}\b' }, + { name = "Fireworks API Key", pattern = '\bfw_[a-zA-Z0-9]{24}\b' }, + { name = "Warp API Key", pattern = '\bwk-[0-9]+\.[A-Fa-f0-9.\-]+\b' }, +] + +[privacy.secret_redaction] +enabled = false + +[general] +login_item = false + +[terminal] + +[terminal.input] +honor_ps1 = false +input_box_type_setting = "universal" + +[notifications] +toast_duration_secs = 8 diff --git a/dotfiles/warp/.warp/themes/tanaab-dark.yaml b/dotfiles/warp/.warp/themes/tanaab-dark.yaml new file mode 100644 index 0000000..91c52e2 --- /dev/null +++ b/dotfiles/warp/.warp/themes/tanaab-dark.yaml @@ -0,0 +1,26 @@ +# Slate backgrounds from variants.slate.base with modes.dark chromatic roles. +name: Tanaab Dark +accent: '#00c88a' +cursor: '#748a81' +background: '#273238' +foreground: '#e6f0eb' +details: darker +terminal_colors: + normal: + black: '#283944' + red: '#ff667d' + green: '#00c88a' + yellow: '#ffb000' + blue: '#5ab0ff' + magenta: '#e03a83' + cyan: '#38d7d0' + white: '#adc1b8' + bright: + black: '#748a81' + red: '#ff8c9c' + green: '#33d3a1' + yellow: '#ffc333' + blue: '#83c6ff' + magenta: '#e25292' + cyan: '#68e4df' + white: '#e6f0eb' diff --git a/dotfiles/warp/.warp/themes/tanaab-light.yaml b/dotfiles/warp/.warp/themes/tanaab-light.yaml new file mode 100644 index 0000000..6d06a50 --- /dev/null +++ b/dotfiles/warp/.warp/themes/tanaab-light.yaml @@ -0,0 +1,26 @@ +# Slate neutrals from variants.slate.base with modes.light chromatic and ANSI roles. +name: Tanaab Light +accent: '#db2777' +cursor: '#8f9fa4' +background: '#ecf9f6' +foreground: '#273238' +details: lighter +terminal_colors: + normal: + black: '#102018' + red: '#ff667d' + green: '#00c88a' + yellow: '#ffb000' + blue: '#5ab0ff' + magenta: '#e03a83' + cyan: '#38d7d0' + white: '#52675e' + bright: + black: '#70857b' + red: '#ff8c9c' + green: '#33d3a1' + yellow: '#ffc333' + blue: '#83c6ff' + magenta: '#e25292' + cyan: '#68e4df' + white: '#5f746a' diff --git a/dotfiles/warp/.warp/themes/tanaab-solarized-dark.yaml b/dotfiles/warp/.warp/themes/tanaab-solarized-dark.yaml new file mode 100644 index 0000000..3160eb2 --- /dev/null +++ b/dotfiles/warp/.warp/themes/tanaab-solarized-dark.yaml @@ -0,0 +1,30 @@ +# Solarized's CIELAB lightness ramp, transformed around Tanaab's fixed ANSI anchors. +# Chromatic ANSI colors remain fixed to dotfiles/theme/colors.json modes.dark. +# ANSI black uses variants.solarized.base.base02 as the first raised surface. +name: Tanaab Solarized Dark +accent: '#00c88a' +cursor: '#748a81' +background: '#002d45' +# Original subdued foreground: '#82a3b3' +# Brighter foreground: '#ddebe8' +foreground: '#adc1b8' +details: darker +terminal_colors: + normal: + black: '#003851' + red: '#ff667d' + green: '#00c88a' + yellow: '#ffb000' + blue: '#5ab0ff' + magenta: '#e03a83' + cyan: '#38d7d0' + white: '#adc1b8' + bright: + black: '#748a81' + red: '#ff8c9c' + green: '#33d3a1' + yellow: '#ffc333' + blue: '#83c6ff' + magenta: '#e25292' + cyan: '#68e4df' + white: '#e6f0eb' diff --git a/dotfiles/warp/.warp/themes/tanaab-solarized-light.yaml b/dotfiles/warp/.warp/themes/tanaab-solarized-light.yaml new file mode 100644 index 0000000..2f0eb0a --- /dev/null +++ b/dotfiles/warp/.warp/themes/tanaab-solarized-light.yaml @@ -0,0 +1,27 @@ +# Solarized's CIELAB lightness ramp, transformed around Tanaab's fixed ANSI anchors. +# Chromatic ANSI colors remain fixed to dotfiles/theme/colors.json modes.light. +name: Tanaab Solarized Light +accent: '#db2777' +cursor: '#70857b' +background: '#ecf9f6' +foreground: '#437086' +details: lighter +terminal_colors: + normal: + black: '#102018' + red: '#ff667d' + green: '#00c88a' + yellow: '#ffb000' + blue: '#5ab0ff' + magenta: '#e03a83' + cyan: '#38d7d0' + white: '#52675e' + bright: + black: '#70857b' + red: '#ff8c9c' + green: '#33d3a1' + yellow: '#ffc333' + blue: '#83c6ff' + magenta: '#e25292' + cyan: '#68e4df' + white: '#5f746a' diff --git a/dotfiles/zsh/.config/zsh/homebrew.zsh b/dotfiles/zsh/.config/zsh/homebrew.zsh new file mode 100644 index 0000000..96b4bf4 --- /dev/null +++ b/dotfiles/zsh/.config/zsh/homebrew.zsh @@ -0,0 +1,4 @@ +# Initialize Apple Silicon Homebrew once for both login and interactive shells. +if [[ -z "${HOMEBREW_PREFIX:-}" && -x /opt/homebrew/bin/brew ]]; then + eval "$(/opt/homebrew/bin/brew shellenv)" +fi diff --git a/dotfiles/zsh/.p10k.zsh b/dotfiles/zsh/.p10k.zsh deleted file mode 100644 index 1aec576..0000000 --- a/dotfiles/zsh/.p10k.zsh +++ /dev/null @@ -1,1611 +0,0 @@ -# Generated by Powerlevel10k configuration wizard on 2021-09-17 at 22:41 EDT. -# Based on romkatv/powerlevel10k/config/p10k-lean.zsh, checksum 54401. -# Wizard options: nerdfont-complete + powerline, small icons, ascii, lean, 24h time, -# 1 line, compact, concise, transient_prompt, instant_prompt=verbose. -# Type `p10k configure` to generate another config. -# -# Config for Powerlevel10k with lean prompt style. Type `p10k configure` to generate -# your own config based on it. -# -# Tip: Looking for a nice color? Here's a one-liner to print colormap. -# -# for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done - -# Temporarily change options. -'builtin' 'local' '-a' 'p10k_config_opts' -[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') -[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') -[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') -'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' - -() { - emulate -L zsh -o extended_glob - - # Unset all configuration options. This allows you to apply configuration changes without - # restarting zsh. Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`. - unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' - - # Zsh >= 5.1 is required. - autoload -Uz is-at-least && is-at-least 5.1 || return - - # The list of segments shown on the left. Fill it with the most important segments. - typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( - # os_icon # os identifier - dir # current directory - vcs # git status - prompt_char # prompt symbol - ) - - # The list of segments shown on the right. Fill it with less important segments. - # Right prompt on the last prompt line (where you are typing your commands) gets - # automatically hidden when the input line reaches it. Right prompt above the - # last prompt line gets hidden if it would overlap with left prompt. - typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( - status # exit code of the last command - command_execution_time # duration of the last command - background_jobs # presence of background jobs - direnv # direnv status (https://direnv.net/) - asdf # asdf version manager (https://github.com/asdf-vm/asdf) - virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) - anaconda # conda environment (https://conda.io/) - pyenv # python environment (https://github.com/pyenv/pyenv) - goenv # go environment (https://github.com/syndbg/goenv) - nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) - nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) - nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) - # node_version # node.js version - # go_version # go version (https://golang.org) - # rust_version # rustc version (https://www.rust-lang.org) - # dotnet_version # .NET version (https://dotnet.microsoft.com) - # php_version # php version (https://www.php.net/) - # laravel_version # laravel php framework version (https://laravel.com/) - # java_version # java version (https://www.java.com/) - # package # name@version from package.json (https://docs.npmjs.com/files/package.json) - rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) - rvm # ruby version from rvm (https://rvm.io) - fvm # flutter version management (https://github.com/leoafarias/fvm) - luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) - jenv # java version from jenv (https://github.com/jenv/jenv) - plenv # perl version from plenv (https://github.com/tokuhirom/plenv) - phpenv # php version from phpenv (https://github.com/phpenv/phpenv) - scalaenv # scala version from scalaenv (https://github.com/scalaenv/scalaenv) - haskell_stack # haskell version from stack (https://haskellstack.org/) - kubecontext # current kubernetes context (https://kubernetes.io/) - terraform # terraform workspace (https://www.terraform.io) - # terraform_version # terraform version (https://www.terraform.io) - aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) - aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) - azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) - gcloud # google cloud cli account and project (https://cloud.google.com/) - google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) - toolbox # toolbox name (https://github.com/containers/toolbox) - context # user@hostname - nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) - ranger # ranger shell (https://github.com/ranger/ranger) - nnn # nnn shell (https://github.com/jarun/nnn) - xplr # xplr shell (https://github.com/sayanarijit/xplr) - vim_shell # vim shell indicator (:sh) - midnight_commander # midnight commander shell (https://midnight-commander.org/) - nix_shell # nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) - # vpn_ip # virtual private network indicator - # load # CPU load - # disk_usage # disk usage - # ram # free RAM - # swap # used swap - todo # todo items (https://github.com/todotxt/todo.txt-cli) - timewarrior # timewarrior tracking status (https://timewarrior.net/) - taskwarrior # taskwarrior task count (https://taskwarrior.org/) - time # current time - # ip # ip address and bandwidth usage for a specified network interface - # public_ip # public IP address - # proxy # system-wide http/https/ftp proxy - # battery # internal battery - # wifi # wifi speed - # example # example user-defined segment (see prompt_example function below) - ) - - # Defines character set used by powerlevel10k. It's best to let `p10k configure` set it for you. - typeset -g POWERLEVEL9K_MODE=ascii - # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid - # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added. - typeset -g POWERLEVEL9K_ICON_PADDING=none - - # Basic style options that define the overall look of your prompt. You probably don't want to - # change them. - typeset -g POWERLEVEL9K_BACKGROUND= # transparent background - typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace - typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space - typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol - - # When set to true, icons appear before content on both sides of the prompt. When set - # to false, icons go after content. If empty or not set, icons go before content in the left - # prompt and after content in the right prompt. - # - # You can also override it for a specific segment: - # - # POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false - # - # Or for a specific segment in specific state: - # - # POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false - typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true - - # Add an empty line before each prompt. - typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false - - # Connect left prompt lines with these symbols. - typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX= - typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= - typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= - # Connect right prompt lines with these symbols. - typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX= - typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX= - typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX= - - # The left end of left prompt. - typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= - # The right end of right prompt. - typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL= - - # Ruler, a.k.a. the horizontal line before each prompt. If you set it to true, you'll - # probably want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false above and - # POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' below. - typeset -g POWERLEVEL9K_SHOW_RULER=false - typeset -g POWERLEVEL9K_RULER_CHAR='-' # reasonable alternative: '·' - typeset -g POWERLEVEL9K_RULER_FOREGROUND=242 - - # Filler between left and right prompt on the first prompt line. You can set it to '·' or '-' - # to make it easier to see the alignment between left and right prompt and to separate prompt - # from command output. It serves the same purpose as ruler (see above) without increasing - # the number of prompt lines. You'll probably want to set POWERLEVEL9K_SHOW_RULER=false - # if using this. You might also like POWERLEVEL9K_PROMPT_ADD_NEWLINE=false for more compact - # prompt. - typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' - if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then - # The color of the filler. - typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 - # Add a space between the end of left prompt and the filler. - typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=' ' - # Add a space between the filler and the start of right prompt. - typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=' ' - # Start filler from the edge of the screen if there are no left segments on the first line. - typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' - # End filler on the edge of the screen if there are no right segments on the first line. - typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' - fi - - #################################[ os_icon: os identifier ]################################## - # OS identifier color. - typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND= - # Custom icon. - # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='⭐' - - ################################[ prompt_char: prompt symbol ]################################ - # Green prompt symbol if the last command succeeded. - typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 - # Red prompt symbol if the last command failed. - typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 - # Default prompt symbol. - typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='>' - # Prompt symbol in command vi mode. - typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='<' - # Prompt symbol in visual vi mode. - typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='V' - # Prompt symbol in overwrite vi mode. - typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='^' - typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true - # No line terminator if prompt_char is the last segment. - typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='' - # No line introducer if prompt_char is the first segment. - typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= - - ##################################[ dir: current directory ]################################## - # Default current directory color. - typeset -g POWERLEVEL9K_DIR_FOREGROUND=31 - # If directory is too long, shorten some of its segments to the shortest possible unique - # prefix. The shortened directory can be tab-completed to the original. - typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique - # Replace removed segment suffixes with this symbol. - typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= - # Color of the shortened directory segments. - typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=103 - # Color of the anchor directory segments. Anchor segments are never shortened. The first - # segment is always an anchor. - typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=39 - # Display anchor directory segments in bold. - typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true - # Don't shorten directories that contain any of these files. They are anchors. - local anchor_files=( - .bzr - .citc - .git - .hg - .node-version - .python-version - .go-version - .ruby-version - .lua-version - .java-version - .perl-version - .php-version - .tool-version - .shorten_folder_marker - .svn - .terraform - CVS - Cargo.toml - composer.json - go.mod - package.json - stack.yaml - ) - typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" - # If set to "first" ("last"), remove everything before the first (last) subdirectory that contains - # files matching $POWERLEVEL9K_SHORTEN_FOLDER_MARKER. For example, when the current directory is - # /foo/bar/git_repo/nested_git_repo/baz, prompt will display git_repo/nested_git_repo/baz (first) - # or nested_git_repo/baz (last). This assumes that git_repo and nested_git_repo contain markers - # and other directories don't. - # - # Optionally, "first" and "last" can be followed by ":" where is an integer. - # This moves the truncation point to the right (positive offset) or to the left (negative offset) - # relative to the marker. Plain "first" and "last" are equivalent to "first:0" and "last:0" - # respectively. - typeset -g POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=false - # Don't shorten this many last directory segments. They are anchors. - typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 - # Shorten directory if it's longer than this even if there is space for it. The value can - # be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, - # directory will be shortened only when prompt doesn't fit or when other parameters demand it - # (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). - # If set to `0`, directory will always be shortened to its minimum length. - typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 - # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this - # many columns for typing commands. - typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 - # When `dir` segment is on the last prompt line, try to shorten it enough to leave at least - # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. - typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 - # If set to true, embed a hyperlink into the directory. Useful for quickly - # opening a directory in the file manager simply by clicking the link. - # Can also be handy when the directory is shortened, as it allows you to see - # the full directory that was used in previous commands. - typeset -g POWERLEVEL9K_DIR_HYPERLINK=false - - # Enable special styling for non-writable and non-existent directories. See POWERLEVEL9K_LOCK_ICON - # and POWERLEVEL9K_DIR_CLASSES below. - typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=v3 - - # The default icon shown next to non-writable and non-existent directories when - # POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3. - # typeset -g POWERLEVEL9K_LOCK_ICON='⭐' - - # POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons and colors for different - # directories. It must be an array with 3 * N elements. Each triplet consists of: - # - # 1. A pattern against which the current directory ($PWD) is matched. Matching is done with - # extended_glob option enabled. - # 2. Directory class for the purpose of styling. - # 3. An empty string. - # - # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. - # - # If POWERLEVEL9K_DIR_SHOW_WRITABLE is set to v3, non-writable and non-existent directories - # acquire class suffix _NOT_WRITABLE and NON_EXISTENT respectively. - # - # For example, given these settings: - # - # typeset -g POWERLEVEL9K_DIR_CLASSES=( - # '~/work(|/*)' WORK '' - # '~(|/*)' HOME '' - # '*' DEFAULT '') - # - # Whenever the current directory is ~/work or a subdirectory of ~/work, it gets styled with one - # of the following classes depending on its writability and existence: WORK, WORK_NOT_WRITABLE or - # WORK_NON_EXISTENT. - # - # Simply assigning classes to directories doesn't have any visible effects. It merely gives you an - # option to define custom colors and icons for different directory classes. - # - # # Styling for WORK. - # typeset -g POWERLEVEL9K_DIR_WORK_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=31 - # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=103 - # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=39 - # - # # Styling for WORK_NOT_WRITABLE. - # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=31 - # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=103 - # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=39 - # - # # Styling for WORK_NON_EXISTENT. - # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=31 - # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=103 - # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=39 - # - # If a styling parameter isn't explicitly defined for some class, it falls back to the classless - # parameter. For example, if POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND is not set, it falls - # back to POWERLEVEL9K_DIR_FOREGROUND. - # - typeset -g POWERLEVEL9K_DIR_CLASSES=() - - # Custom prefix. - # typeset -g POWERLEVEL9K_DIR_PREFIX='%fin ' - - #####################################[ vcs: git status ]###################################### - # Branch icon. Set this parameter to '\uF126 ' for the popular Powerline branch icon. - typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= - - # Untracked files icon. It's really a question mark, your font isn't broken. - # Change the value of this parameter to show a different icon. - typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' - - # Formatter for Git status. - # - # Example output: master wip <42>42 *42 merge ~42 +42 !42 ?42. - # - # You can edit the function to customize how Git status looks. - # - # VCS_STATUS_* parameters are set by gitstatus plugin. See reference: - # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. - function my_git_formatter() { - emulate -L zsh - - if [[ -n $P9K_CONTENT ]]; then - # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from - # gitstatus plugin). VCS_STATUS_* parameters are not available in this case. - typeset -g my_git_format=$P9K_CONTENT - return - fi - - if (( $1 )); then - # Styling for up-to-date Git status. - local meta='%f' # default foreground - local clean='%76F' # green foreground - local modified='%178F' # yellow foreground - local untracked='%39F' # blue foreground - local conflicted='%196F' # red foreground - else - # Styling for incomplete and stale Git status. - local meta='%244F' # grey foreground - local clean='%244F' # grey foreground - local modified='%244F' # grey foreground - local untracked='%244F' # grey foreground - local conflicted='%244F' # grey foreground - fi - - local res - - if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then - local branch=${(V)VCS_STATUS_LOCAL_BRANCH} - # If local branch name is at most 32 characters long, show it in full. - # Otherwise show the first 12 .. the last 12. - # Tip: To always show local branch name in full without truncation, delete the next line. - (( $#branch > 32 )) && branch[13,-13]=".." # <-- this line - res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}" - fi - - if [[ -n $VCS_STATUS_TAG - # Show tag only if not on a branch. - # Tip: To always show tag, delete the next line. - && -z $VCS_STATUS_LOCAL_BRANCH # <-- this line - ]]; then - local tag=${(V)VCS_STATUS_TAG} - # If tag name is at most 32 characters long, show it in full. - # Otherwise show the first 12 .. the last 12. - # Tip: To always show tag name in full without truncation, delete the next line. - (( $#tag > 32 )) && tag[13,-13]=".." # <-- this line - res+="${meta}#${clean}${tag//\%/%%}" - fi - - # Display the current Git commit if there is no branch and no tag. - # Tip: To always display the current Git commit, delete the next line. - [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] && # <-- this line - res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" - - # Show tracking branch name if it differs from local branch. - if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then - res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" - fi - - # Display "wip" if the latest commit's summary contains "wip" or "WIP". - if [[ $VCS_STATUS_COMMIT_SUMMARY == (|*[^[:alnum:]])(wip|WIP)(|[^[:alnum:]]*) ]]; then - res+=" ${modified}wip" - fi - - # <42 if behind the remote. - (( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}<${VCS_STATUS_COMMITS_BEHIND}" - # >42 if ahead of the remote; no leading space if also behind the remote: <42>42. - (( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " - (( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}>${VCS_STATUS_COMMITS_AHEAD}" - # <-42 if behind the push remote. - (( VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" ${clean}<-${VCS_STATUS_PUSH_COMMITS_BEHIND}" - (( VCS_STATUS_PUSH_COMMITS_AHEAD && !VCS_STATUS_PUSH_COMMITS_BEHIND )) && res+=" " - # ->42 if ahead of the push remote; no leading space if also behind: <-42->42. - (( VCS_STATUS_PUSH_COMMITS_AHEAD )) && res+="${clean}->${VCS_STATUS_PUSH_COMMITS_AHEAD}" - # *42 if have stashes. - (( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" - # 'merge' if the repo is in an unusual state. - [[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" - # ~42 if have merge conflicts. - (( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" - # +42 if have staged changes. - (( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" - # !42 if have unstaged changes. - (( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" - # ?42 if have untracked files. It's really a question mark, your font isn't broken. - # See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. - # Remove the next line if you don't want to see untracked files at all. - (( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" - # "-" if the number of unstaged files is unknown. This can happen due to - # POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY (see below) being set to a non-negative number lower - # than the number of files in the Git index, or due to bash.showDirtyState being set to false - # in the repository config. The number of staged and untracked files may also be unknown - # in this case. - (( VCS_STATUS_HAS_UNSTAGED == -1 )) && res+=" ${modified}-" - - typeset -g my_git_format=$res - } - functions -M my_git_formatter 2>/dev/null - - # Don't count the number of unstaged, untracked and conflicted files in Git repositories with - # more than this many files in the index. Negative value means infinity. - # - # If you are working in Git repositories with tens of millions of files and seeing performance - # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output - # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's - # config: `git config bash.showDirtyState false`. - typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1 - - # Don't show Git status in prompt for repositories whose workdir matches this pattern. - # For example, if set to '~', the Git repository at $HOME/.git will be ignored. - # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'. - typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~' - - # Disable the default Git status formatting. - typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true - # Install our own Git status formatter. - typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}' - typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}' - # Enable counters for staged, unstaged, etc. - typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 - - # Icon color. - typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=76 - typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=244 - # Custom icon. - typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION= - # Custom prefix. - # typeset -g POWERLEVEL9K_VCS_PREFIX='%fon ' - - # Show status of repositories of these types. You can add svn and/or hg if you are - # using them. If you do, your prompt may become slow even when your current directory - # isn't in an svn or hg reposotiry. - typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) - - # These settings are used for repositories other than Git or when gitstatusd fails and - # Powerlevel10k has to fall back to using vcs_info. - typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=76 - typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=76 - typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=178 - - ##########################[ status: exit code of the last command ]########################### - # Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and - # style them independently from the regular OK and ERROR state. - typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true - - # Status on success. No content, just an icon. No need to show it if prompt_char is enabled as - # it will signify success by turning green. - typeset -g POWERLEVEL9K_STATUS_OK=false - typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 - typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='ok' - - # Status when some part of a pipe command fails but the overall exit status is zero. It may look - # like this: 1|0. - typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true - typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=70 - typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='ok' - - # Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as - # it will signify error by turning red. - typeset -g POWERLEVEL9K_STATUS_ERROR=false - typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 - typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='err' - - # Status when the last command was terminated by a signal. - typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true - typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=160 - # Use terse signal names: "INT" instead of "SIGINT(2)". - typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false - typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION= - - # Status when some part of a pipe command fails and the overall exit status is also non-zero. - # It may look like this: 1|0. - typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true - typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=160 - typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='err' - - ###################[ command_execution_time: duration of the last command ]################### - # Show duration of the last command if takes at least this many seconds. - typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 - # Show this many fractional digits. Zero means round to seconds. - typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 - # Execution time color. - typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=101 - # Duration format: 1d 2h 3m 4s. - typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' - # Custom icon. - typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION= - # Custom prefix. - # typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='%ftook ' - - #######################[ background_jobs: presence of background jobs ]####################### - # Don't show the number of background jobs. - typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false - # Background jobs color. - typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=70 - # Custom icon. - # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #######################[ direnv: direnv status (https://direnv.net/) ]######################## - # Direnv color. - typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=178 - # Custom icon. - # typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###############[ asdf: asdf version manager (https://github.com/asdf-vm/asdf) ]############### - # Default asdf color. Only used to display tools for which there is no color override (see below). - # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND. - typeset -g POWERLEVEL9K_ASDF_FOREGROUND=66 - - # There are four parameters that can be used to hide asdf tools. Each parameter describes - # conditions under which a tool gets hidden. Parameters can hide tools but not unhide them. If at - # least one parameter decides to hide a tool, that tool gets hidden. If no parameter decides to - # hide a tool, it gets shown. - # - # Special note on the difference between POWERLEVEL9K_ASDF_SOURCES and - # POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW. Consider the effect of the following commands: - # - # asdf local python 3.8.1 - # asdf global python 3.8.1 - # - # After running both commands the current python version is 3.8.1 and its source is "local" as - # it takes precedence over "global". If POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW is set to false, - # it'll hide python version in this case because 3.8.1 is the same as the global version. - # POWERLEVEL9K_ASDF_SOURCES will hide python version only if the value of this parameter doesn't - # contain "local". - - # Hide tool versions that don't come from one of these sources. - # - # Available sources: - # - # - shell `asdf current` says "set by ASDF_${TOOL}_VERSION environment variable" - # - local `asdf current` says "set by /some/not/home/directory/file" - # - global `asdf current` says "set by /home/username/file" - # - # Note: If this parameter is set to (shell local global), it won't hide tools. - # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SOURCES. - typeset -g POWERLEVEL9K_ASDF_SOURCES=(shell local global) - - # If set to false, hide tool versions that are the same as global. - # - # Note: The name of this parameter doesn't reflect its meaning at all. - # Note: If this parameter is set to true, it won't hide tools. - # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_PROMPT_ALWAYS_SHOW. - typeset -g POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW=false - - # If set to false, hide tool versions that are equal to "system". - # - # Note: If this parameter is set to true, it won't hide tools. - # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_SYSTEM. - typeset -g POWERLEVEL9K_ASDF_SHOW_SYSTEM=true - - # If set to non-empty value, hide tools unless there is a file matching the specified file pattern - # in the current directory, or its parent directory, or its grandparent directory, and so on. - # - # Note: If this parameter is set to empty value, it won't hide tools. - # Note: SHOW_ON_UPGLOB isn't specific to asdf. It works with all prompt segments. - # Tip: Override this parameter for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_SHOW_ON_UPGLOB. - # - # Example: Hide nodejs version when there is no package.json and no *.js files in the current - # directory, in `..`, in `../..` and so on. - # - # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.js|package.json' - typeset -g POWERLEVEL9K_ASDF_SHOW_ON_UPGLOB= - - # Ruby version from asdf. - typeset -g POWERLEVEL9K_ASDF_RUBY_FOREGROUND=168 - # typeset -g POWERLEVEL9K_ASDF_RUBY_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_RUBY_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Python version from asdf. - typeset -g POWERLEVEL9K_ASDF_PYTHON_FOREGROUND=37 - # typeset -g POWERLEVEL9K_ASDF_PYTHON_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_PYTHON_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Go version from asdf. - typeset -g POWERLEVEL9K_ASDF_GOLANG_FOREGROUND=37 - # typeset -g POWERLEVEL9K_ASDF_GOLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_GOLANG_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Node.js version from asdf. - typeset -g POWERLEVEL9K_ASDF_NODEJS_FOREGROUND=70 - # typeset -g POWERLEVEL9K_ASDF_NODEJS_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_NODEJS_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Rust version from asdf. - typeset -g POWERLEVEL9K_ASDF_RUST_FOREGROUND=37 - # typeset -g POWERLEVEL9K_ASDF_RUST_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_RUST_SHOW_ON_UPGLOB='*.foo|*.bar' - - # .NET Core version from asdf. - typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_FOREGROUND=134 - # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_DOTNET_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Flutter version from asdf. - typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=38 - # typeset -g POWERLEVEL9K_ASDF_FLUTTER_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_FLUTTER_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Lua version from asdf. - typeset -g POWERLEVEL9K_ASDF_LUA_FOREGROUND=32 - # typeset -g POWERLEVEL9K_ASDF_LUA_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_LUA_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Java version from asdf. - typeset -g POWERLEVEL9K_ASDF_JAVA_FOREGROUND=32 - # typeset -g POWERLEVEL9K_ASDF_JAVA_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_JAVA_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Perl version from asdf. - typeset -g POWERLEVEL9K_ASDF_PERL_FOREGROUND=67 - # typeset -g POWERLEVEL9K_ASDF_PERL_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_PERL_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Erlang version from asdf. - typeset -g POWERLEVEL9K_ASDF_ERLANG_FOREGROUND=125 - # typeset -g POWERLEVEL9K_ASDF_ERLANG_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_ERLANG_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Elixir version from asdf. - typeset -g POWERLEVEL9K_ASDF_ELIXIR_FOREGROUND=129 - # typeset -g POWERLEVEL9K_ASDF_ELIXIR_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_ELIXIR_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Postgres version from asdf. - typeset -g POWERLEVEL9K_ASDF_POSTGRES_FOREGROUND=31 - # typeset -g POWERLEVEL9K_ASDF_POSTGRES_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_POSTGRES_SHOW_ON_UPGLOB='*.foo|*.bar' - - # PHP version from asdf. - typeset -g POWERLEVEL9K_ASDF_PHP_FOREGROUND=99 - # typeset -g POWERLEVEL9K_ASDF_PHP_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_PHP_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Haskell version from asdf. - typeset -g POWERLEVEL9K_ASDF_HASKELL_FOREGROUND=172 - # typeset -g POWERLEVEL9K_ASDF_HASKELL_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_HASKELL_SHOW_ON_UPGLOB='*.foo|*.bar' - - # Julia version from asdf. - typeset -g POWERLEVEL9K_ASDF_JULIA_FOREGROUND=70 - # typeset -g POWERLEVEL9K_ASDF_JULIA_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_ASDF_JULIA_SHOW_ON_UPGLOB='*.foo|*.bar' - - ##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### - # NordVPN connection indicator color. - typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=39 - # Hide NordVPN connection indicator when not connected. - typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= - typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= - # Custom icon. - # typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## - # Ranger shell color. - typeset -g POWERLEVEL9K_RANGER_FOREGROUND=178 - # Custom icon. - # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### - # Nnn shell color. - typeset -g POWERLEVEL9K_NNN_FOREGROUND=72 - # Custom icon. - # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## - # xplr shell color. - typeset -g POWERLEVEL9K_XPLR_FOREGROUND=72 - # Custom icon. - # typeset -g POWERLEVEL9K_XPLR_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###########################[ vim_shell: vim shell indicator (:sh) ]########################### - # Vim shell indicator color. - typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=34 - # Custom icon. - # typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### - # Midnight Commander shell color. - typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=178 - # Custom icon. - # typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #[ nix_shell: nix shell (https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) ]## - # Nix shell color. - typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=74 - - # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line. - # typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION= - - # Custom icon. - # typeset -g POWERLEVEL9K_NIX_SHELL_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##################################[ disk_usage: disk usage ]################################## - # Colors for different levels of disk usage. - typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=35 - typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=220 - typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=160 - # Thresholds for different levels of disk usage (percentage points). - typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL=90 - typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL=95 - # If set to true, hide disk usage when below $POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL percent. - typeset -g POWERLEVEL9K_DISK_USAGE_ONLY_WARNING=false - # Custom icon. - # typeset -g POWERLEVEL9K_DISK_USAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ######################################[ ram: free RAM ]####################################### - # RAM color. - typeset -g POWERLEVEL9K_RAM_FOREGROUND=66 - # Custom icon. - # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #####################################[ swap: used swap ]###################################### - # Swap color. - typeset -g POWERLEVEL9K_SWAP_FOREGROUND=96 - # Custom icon. - # typeset -g POWERLEVEL9K_SWAP_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ######################################[ load: CPU load ]###################################### - # Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. - typeset -g POWERLEVEL9K_LOAD_WHICH=5 - # Load color when load is under 50%. - typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=66 - # Load color when load is between 50% and 70%. - typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=178 - # Load color when load is over 70%. - typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=166 - # Custom icon. - # typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ - # Todo color. - typeset -g POWERLEVEL9K_TODO_FOREGROUND=110 - # Hide todo when the total number of tasks is zero. - typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true - # Hide todo when the number of tasks after filtering is zero. - typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false - - # Todo format. The following parameters are available within the expansion. - # - # - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. - # - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. - # - # These variables correspond to the last line of the output of `todo.sh -p ls`: - # - # TODO: 24 of 42 tasks shown - # - # Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. - # - # typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' - - # Custom icon. - # typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###########[ timewarrior: timewarrior tracking status (https://timewarrior.net/) ]############ - # Timewarrior color. - typeset -g POWERLEVEL9K_TIMEWARRIOR_FOREGROUND=110 - # If the tracked task is longer than 24 characters, truncate and append "..". - # Tip: To always display tasks without truncation, delete the following parameter. - # Tip: To hide task names and display just the icon when time tracking is enabled, set the - # value of the following parameter to "". - typeset -g POWERLEVEL9K_TIMEWARRIOR_CONTENT_EXPANSION='${P9K_CONTENT:0:24}${${P9K_CONTENT:24}:+..}' - - # Custom icon. - # typeset -g POWERLEVEL9K_TIMEWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##############[ taskwarrior: taskwarrior task count (https://taskwarrior.org/) ]############## - # Taskwarrior color. - typeset -g POWERLEVEL9K_TASKWARRIOR_FOREGROUND=74 - - # Taskwarrior segment format. The following parameters are available within the expansion. - # - # - P9K_TASKWARRIOR_PENDING_COUNT The number of pending tasks: `task +PENDING count`. - # - P9K_TASKWARRIOR_OVERDUE_COUNT The number of overdue tasks: `task +OVERDUE count`. - # - # Zero values are represented as empty parameters. - # - # The default format: - # - # '${P9K_TASKWARRIOR_OVERDUE_COUNT:+"!$P9K_TASKWARRIOR_OVERDUE_COUNT/"}$P9K_TASKWARRIOR_PENDING_COUNT' - # - # typeset -g POWERLEVEL9K_TASKWARRIOR_CONTENT_EXPANSION='$P9K_TASKWARRIOR_PENDING_COUNT' - - # Custom icon. - # typeset -g POWERLEVEL9K_TASKWARRIOR_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##################################[ context: user@hostname ]################################## - # Context color when running with privileges. - typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=178 - # Context color in SSH without privileges. - typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=180 - # Default context color (no privileges, no SSH). - typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=180 - - # Context format when running with privileges: bold user@hostname. - typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%B%n@%m' - # Context format when in SSH without privileges: user@hostname. - typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' - # Default context format (no privileges, no SSH): user@hostname. - typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' - - # Don't show context unless running with privileges or in SSH. - # Tip: Remove the next line to always show context. - typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= - - # Custom icon. - # typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' - # Custom prefix. - # typeset -g POWERLEVEL9K_CONTEXT_PREFIX='%fwith ' - - ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### - # Python virtual environment color. - typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=37 - # Don't show Python version next to the virtual environment name. - typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false - # If set to "false", won't show virtualenv if pyenv is already shown. - # If set to "if-different", won't show virtualenv if it's the same as pyenv. - typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV=false - # Separate environment name from Python version only with a space. - typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= - # Custom icon. - # typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #####################[ anaconda: conda environment (https://conda.io/) ]###################### - # Anaconda environment color. - typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=37 - - # Anaconda segment format. The following parameters are available within the expansion. - # - # - CONDA_PREFIX Absolute path to the active Anaconda/Miniconda environment. - # - CONDA_DEFAULT_ENV Name of the active Anaconda/Miniconda environment. - # - CONDA_PROMPT_MODIFIER Configurable prompt modifier (see below). - # - P9K_ANACONDA_PYTHON_VERSION Current python version (python --version). - # - # CONDA_PROMPT_MODIFIER can be configured with the following command: - # - # conda config --set env_prompt '({default_env}) ' - # - # The last argument is a Python format string that can use the following variables: - # - # - prefix The same as CONDA_PREFIX. - # - default_env The same as CONDA_DEFAULT_ENV. - # - name The last segment of CONDA_PREFIX. - # - stacked_env Comma-separated list of names in the environment stack. The first element is - # always the same as default_env. - # - # Note: '({default_env}) ' is the default value of env_prompt. - # - # The default value of POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION expands to $CONDA_PROMPT_MODIFIER - # without the surrounding parentheses, or to the last path component of CONDA_PREFIX if the former - # is empty. - typeset -g POWERLEVEL9K_ANACONDA_CONTENT_EXPANSION='${${${${CONDA_PROMPT_MODIFIER#\(}% }%\)}:-${CONDA_PREFIX:t}}' - - # Custom icon. - # typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ - # Pyenv color. - typeset -g POWERLEVEL9K_PYENV_FOREGROUND=37 - # Hide python version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) - # If set to false, hide python version if it's the same as global: - # $(pyenv version-name) == $(pyenv global). - typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide python version if it's equal to "system". - typeset -g POWERLEVEL9K_PYENV_SHOW_SYSTEM=true - - # Pyenv segment format. The following parameters are available within the expansion. - # - # - P9K_CONTENT Current pyenv environment (pyenv version-name). - # - P9K_PYENV_PYTHON_VERSION Current python version (python --version). - # - # The default format has the following logic: - # - # 1. Display just "$P9K_CONTENT" if it's equal to "$P9K_PYENV_PYTHON_VERSION" or - # starts with "$P9K_PYENV_PYTHON_VERSION/". - # 2. Otherwise display "$P9K_CONTENT $P9K_PYENV_PYTHON_VERSION". - typeset -g POWERLEVEL9K_PYENV_CONTENT_EXPANSION='${P9K_CONTENT}${${P9K_CONTENT:#$P9K_PYENV_PYTHON_VERSION(|/*)}:+ $P9K_PYENV_PYTHON_VERSION}' - - # Custom icon. - # typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ - # Goenv color. - typeset -g POWERLEVEL9K_GOENV_FOREGROUND=37 - # Hide go version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_GOENV_SOURCES=(shell local global) - # If set to false, hide go version if it's the same as global: - # $(goenv version-name) == $(goenv global). - typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide go version if it's equal to "system". - typeset -g POWERLEVEL9K_GOENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## - # Nodenv color. - typeset -g POWERLEVEL9K_NODENV_FOREGROUND=70 - # Hide node version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_NODENV_SOURCES=(shell local global) - # If set to false, hide node version if it's the same as global: - # $(nodenv version-name) == $(nodenv global). - typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide node version if it's equal to "system". - typeset -g POWERLEVEL9K_NODENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### - # Nvm color. - typeset -g POWERLEVEL9K_NVM_FOREGROUND=70 - # Custom icon. - # typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ - # Nodeenv color. - typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=70 - # Don't show Node version next to the environment name. - typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false - # Separate environment name from Node version only with a space. - typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= - # Custom icon. - # typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##############################[ node_version: node.js version ]############################### - # Node version color. - typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=70 - # Show node version only when in a directory tree containing package.json. - typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true - # Custom icon. - # typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #######################[ go_version: go version (https://golang.org) ]######################## - # Go version color. - typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=37 - # Show go version only when in a go project subdirectory. - typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true - # Custom icon. - # typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #################[ rust_version: rustc version (https://www.rust-lang.org) ]################## - # Rust version color. - typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=37 - # Show rust version only when in a rust project subdirectory. - typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true - # Custom icon. - # typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ - # .NET version color. - typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=134 - # Show .NET version only when in a .NET project subdirectory. - typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true - # Custom icon. - # typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #####################[ php_version: php version (https://www.php.net/) ]###################### - # PHP version color. - typeset -g POWERLEVEL9K_PHP_VERSION_FOREGROUND=99 - # Show PHP version only when in a PHP project subdirectory. - typeset -g POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY=true - # Custom icon. - # typeset -g POWERLEVEL9K_PHP_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ laravel_version: laravel php framework version (https://laravel.com/) ]########### - # Laravel version color. - typeset -g POWERLEVEL9K_LARAVEL_VERSION_FOREGROUND=161 - # Custom icon. - # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ####################[ java_version: java version (https://www.java.com/) ]#################### - # Java version color. - typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=32 - # Show java version only when in a java project subdirectory. - typeset -g POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY=true - # Show brief version. - typeset -g POWERLEVEL9K_JAVA_VERSION_FULL=false - # Custom icon. - # typeset -g POWERLEVEL9K_JAVA_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###[ package: name@version from package.json (https://docs.npmjs.com/files/package.json) ]#### - # Package color. - typeset -g POWERLEVEL9K_PACKAGE_FOREGROUND=117 - # Package format. The following parameters are available within the expansion. - # - # - P9K_PACKAGE_NAME The value of `name` field in package.json. - # - P9K_PACKAGE_VERSION The value of `version` field in package.json. - # - # typeset -g POWERLEVEL9K_PACKAGE_CONTENT_EXPANSION='${P9K_PACKAGE_NAME//\%/%%}@${P9K_PACKAGE_VERSION//\%/%%}' - # Custom icon. - # typeset -g POWERLEVEL9K_PACKAGE_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## - # Rbenv color. - typeset -g POWERLEVEL9K_RBENV_FOREGROUND=168 - # Hide ruby version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) - # If set to false, hide ruby version if it's the same as global: - # $(rbenv version-name) == $(rbenv global). - typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide ruby version if it's equal to "system". - typeset -g POWERLEVEL9K_RBENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## - # Rvm color. - typeset -g POWERLEVEL9K_RVM_FOREGROUND=168 - # Don't show @gemset at the end. - typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false - # Don't show ruby- at the front. - typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false - # Custom icon. - # typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ - # Fvm color. - typeset -g POWERLEVEL9K_FVM_FOREGROUND=38 - # Custom icon. - # typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### - # Lua color. - typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=32 - # Hide lua version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) - # If set to false, hide lua version if it's the same as global: - # $(luaenv version-name) == $(luaenv global). - typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide lua version if it's equal to "system". - typeset -g POWERLEVEL9K_LUAENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ - # Java color. - typeset -g POWERLEVEL9K_JENV_FOREGROUND=32 - # Hide java version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) - # If set to false, hide java version if it's the same as global: - # $(jenv version-name) == $(jenv global). - typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide java version if it's equal to "system". - typeset -g POWERLEVEL9K_JENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ - # Perl color. - typeset -g POWERLEVEL9K_PLENV_FOREGROUND=67 - # Hide perl version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) - # If set to false, hide perl version if it's the same as global: - # $(plenv version-name) == $(plenv global). - typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide perl version if it's equal to "system". - typeset -g POWERLEVEL9K_PLENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ - # PHP color. - typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=99 - # Hide php version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_PHPENV_SOURCES=(shell local global) - # If set to false, hide php version if it's the same as global: - # $(phpenv version-name) == $(phpenv global). - typeset -g POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide php version if it's equal to "system". - typeset -g POWERLEVEL9K_PHPENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_PHPENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #######[ scalaenv: scala version from scalaenv (https://github.com/scalaenv/scalaenv) ]####### - # Scala color. - typeset -g POWERLEVEL9K_SCALAENV_FOREGROUND=160 - # Hide scala version if it doesn't come from one of these sources. - typeset -g POWERLEVEL9K_SCALAENV_SOURCES=(shell local global) - # If set to false, hide scala version if it's the same as global: - # $(scalaenv version-name) == $(scalaenv global). - typeset -g POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW=false - # If set to false, hide scala version if it's equal to "system". - typeset -g POWERLEVEL9K_SCALAENV_SHOW_SYSTEM=true - # Custom icon. - # typeset -g POWERLEVEL9K_SCALAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ haskell_stack: haskell version from stack (https://haskellstack.org/) ]########### - # Haskell color. - typeset -g POWERLEVEL9K_HASKELL_STACK_FOREGROUND=172 - # Hide haskell version if it doesn't come from one of these sources. - # - # shell: version is set by STACK_YAML - # local: version is set by stack.yaml up the directory tree - # global: version is set by the implicit global project (~/.stack/global-project/stack.yaml) - typeset -g POWERLEVEL9K_HASKELL_STACK_SOURCES=(shell local) - # If set to false, hide haskell version if it's the same as in the implicit global project. - typeset -g POWERLEVEL9K_HASKELL_STACK_ALWAYS_SHOW=true - # Custom icon. - # typeset -g POWERLEVEL9K_HASKELL_STACK_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# - # Show kubecontext only when the the command you are typing invokes one of these tools. - # Tip: Remove the next line to always show kubecontext. - typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens|kubectx|oc|istioctl|kogito|k9s|helmfile|flux|fluxctl|stern' - - # Kubernetes context classes for the purpose of using different colors, icons and expansions with - # different contexts. - # - # POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element - # in each pair defines a pattern against which the current kubernetes context gets matched. - # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) - # that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, - # you'll see this value in your prompt. The second element of each pair in - # POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The - # first match wins. - # - # For example, given these settings: - # - # typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( - # '*prod*' PROD - # '*test*' TEST - # '*' DEFAULT) - # - # If your current kubernetes context is "deathray-testing/default", its class is TEST - # because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. - # - # You can define different colors, icons and content expansions for different classes: - # - # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=28 - # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' - typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( - # '*prod*' PROD # These values are examples that are unlikely - # '*test*' TEST # to match your needs. Customize them as needed. - '*' DEFAULT) - typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=134 - # typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' - - # Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext - # segment. Parameter expansions are very flexible and fast, too. See reference: - # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. - # - # Within the expansion the following parameters are always available: - # - # - P9K_CONTENT The content that would've been displayed if there was no content - # expansion defined. - # - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the - # output of `kubectl config get-contexts`. - # - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the - # output of `kubectl config get-contexts`. - # - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE - # in the output of `kubectl config get-contexts`. If there is no - # namespace, the parameter is set to "default". - # - P9K_KUBECONTEXT_USER The current context's user. Corresponds to column AUTHINFO in the - # output of `kubectl config get-contexts`. - # - # If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), - # the following extra parameters are available: - # - # - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". - # - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. - # - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. - # - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. - # - # P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, - # if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": - # - # - P9K_KUBECONTEXT_CLOUD_NAME=gke - # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account - # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a - # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 - # - # If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": - # - # - P9K_KUBECONTEXT_CLOUD_NAME=eks - # - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 - # - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 - # - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 - typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= - # Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. - POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' - # Append the current context's namespace if it's not "default". - POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' - - # Custom prefix. - # typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='%fat ' - - ################[ terraform: terraform workspace (https://www.terraform.io) ]################# - # Don't show terraform workspace if it's literally "default". - typeset -g POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT=false - # POWERLEVEL9K_TERRAFORM_CLASSES is an array with even number of elements. The first element - # in each pair defines a pattern against which the current terraform workspace gets matched. - # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) - # that gets matched. If you unset all POWERLEVEL9K_TERRAFORM_*CONTENT_EXPANSION parameters, - # you'll see this value in your prompt. The second element of each pair in - # POWERLEVEL9K_TERRAFORM_CLASSES defines the workspace class. Patterns are tried in order. The - # first match wins. - # - # For example, given these settings: - # - # typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( - # '*prod*' PROD - # '*test*' TEST - # '*' OTHER) - # - # If your current terraform workspace is "project_test", its class is TEST because "project_test" - # doesn't match the pattern '*prod*' but does match '*test*'. - # - # You can define different colors, icons and content expansions for different classes: - # - # typeset -g POWERLEVEL9K_TERRAFORM_TEST_FOREGROUND=28 - # typeset -g POWERLEVEL9K_TERRAFORM_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_TERRAFORM_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' - typeset -g POWERLEVEL9K_TERRAFORM_CLASSES=( - # '*prod*' PROD # These values are examples that are unlikely - # '*test*' TEST # to match your needs. Customize them as needed. - '*' OTHER) - typeset -g POWERLEVEL9K_TERRAFORM_OTHER_FOREGROUND=38 - # typeset -g POWERLEVEL9K_TERRAFORM_OTHER_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #############[ terraform_version: terraform version (https://www.terraform.io) ]############## - # Terraform version color. - typeset -g POWERLEVEL9K_TERRAFORM_VERSION_FOREGROUND=38 - # Custom icon. - # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# - # Show aws only when the the command you are typing invokes one of these tools. - # Tip: Remove the next line to always show aws. - typeset -g POWERLEVEL9K_AWS_SHOW_ON_COMMAND='aws|awless|terraform|pulumi|terragrunt' - - # POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element - # in each pair defines a pattern against which the current AWS profile gets matched. - # More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) - # that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, - # you'll see this value in your prompt. The second element of each pair in - # POWERLEVEL9K_AWS_CLASSES defines the profile class. Patterns are tried in order. The - # first match wins. - # - # For example, given these settings: - # - # typeset -g POWERLEVEL9K_AWS_CLASSES=( - # '*prod*' PROD - # '*test*' TEST - # '*' DEFAULT) - # - # If your current AWS profile is "company_test", its class is TEST - # because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. - # - # You can define different colors, icons and content expansions for different classes: - # - # typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 - # typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' - typeset -g POWERLEVEL9K_AWS_CLASSES=( - # '*prod*' PROD # These values are examples that are unlikely - # '*test*' TEST # to match your needs. Customize them as needed. - '*' DEFAULT) - typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=208 - # typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' - - # AWS segment format. The following parameters are available within the expansion. - # - # - P9K_AWS_PROFILE The name of the current AWS profile. - # - P9K_AWS_REGION The region associated with the current AWS profile. - typeset -g POWERLEVEL9K_AWS_CONTENT_EXPANSION='${P9K_AWS_PROFILE//\%/%%}${P9K_AWS_REGION:+ ${P9K_AWS_REGION//\%/%%}}' - - #[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# - # AWS Elastic Beanstalk environment color. - typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=70 - # Custom icon. - # typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## - # Show azure only when the the command you are typing invokes one of these tools. - # Tip: Remove the next line to always show azure. - typeset -g POWERLEVEL9K_AZURE_SHOW_ON_COMMAND='az|terraform|pulumi|terragrunt' - # Azure account name color. - typeset -g POWERLEVEL9K_AZURE_FOREGROUND=32 - # Custom icon. - # typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### - # Show gcloud only when the the command you are typing invokes one of these tools. - # Tip: Remove the next line to always show gcloud. - typeset -g POWERLEVEL9K_GCLOUD_SHOW_ON_COMMAND='gcloud|gcs' - # Google cloud color. - typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=32 - - # Google cloud format. Change the value of POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION and/or - # POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION if the default is too verbose or not informative - # enough. You can use the following parameters in the expansions. Each of them corresponds to the - # output of `gcloud` tool. - # - # Parameter | Source - # -------------------------|-------------------------------------------------------------------- - # P9K_GCLOUD_CONFIGURATION | gcloud config configurations list --format='value(name)' - # P9K_GCLOUD_ACCOUNT | gcloud config get-value account - # P9K_GCLOUD_PROJECT_ID | gcloud config get-value project - # P9K_GCLOUD_PROJECT_NAME | gcloud projects describe $P9K_GCLOUD_PROJECT_ID --format='value(name)' - # - # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced with '%%'. - # - # Obtaining project name requires sending a request to Google servers. This can take a long time - # and even fail. When project name is unknown, P9K_GCLOUD_PROJECT_NAME is not set and gcloud - # prompt segment is in state PARTIAL. When project name gets known, P9K_GCLOUD_PROJECT_NAME gets - # set and gcloud prompt segment transitions to state COMPLETE. - # - # You can customize the format, icon and colors of gcloud segment separately for states PARTIAL - # and COMPLETE. You can also hide gcloud in state PARTIAL by setting - # POWERLEVEL9K_GCLOUD_PARTIAL_VISUAL_IDENTIFIER_EXPANSION and - # POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION to empty. - typeset -g POWERLEVEL9K_GCLOUD_PARTIAL_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_ID//\%/%%}' - typeset -g POWERLEVEL9K_GCLOUD_COMPLETE_CONTENT_EXPANSION='${P9K_GCLOUD_PROJECT_NAME//\%/%%}' - - # Send a request to Google (by means of `gcloud projects describe ...`) to obtain project name - # this often. Negative value disables periodic polling. In this mode project name is retrieved - # only when the current configuration, account or project id changes. - typeset -g POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS=60 - - # Custom icon. - # typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# - # Show google_app_cred only when the the command you are typing invokes one of these tools. - # Tip: Remove the next line to always show google_app_cred. - typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_SHOW_ON_COMMAND='terraform|pulumi|terragrunt' - - # Google application credentials classes for the purpose of using different colors, icons and - # expansions with different credentials. - # - # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first - # element in each pair defines a pattern against which the current kubernetes context gets - # matched. More specifically, it's P9K_CONTENT prior to the application of context expansion - # (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION - # parameters, you'll see this value in your prompt. The second element of each pair in - # POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. - # The first match wins. - # - # For example, given these settings: - # - # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( - # '*:*prod*:*' PROD - # '*:*test*:*' TEST - # '*' DEFAULT) - # - # If your current Google application credentials is "service_account deathray-testing x@y.com", - # its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. - # - # You can define different colors, icons and content expansions for different classes: - # - # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 - # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' - # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' - typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( - # '*:*prod*:*' PROD # These values are examples that are unlikely - # '*:*test*:*' TEST # to match your needs. Customize them as needed. - '*' DEFAULT) - typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=32 - # typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' - - # Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by - # google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: - # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. - # - # You can use the following parameters in the expansion. Each of them corresponds to one of the - # fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. - # - # Parameter | JSON key file field - # ---------------------------------+--------------- - # P9K_GOOGLE_APP_CRED_TYPE | type - # P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id - # P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email - # - # Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurrences of '%' replaced by '%%'. - typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' - - ##############[ toolbox: toolbox name (https://github.com/containers/toolbox) ]############### - # Toolbox color. - typeset -g POWERLEVEL9K_TOOLBOX_FOREGROUND=178 - # Don't display the name of the toolbox if it matches fedora-toolbox-*. - typeset -g POWERLEVEL9K_TOOLBOX_CONTENT_EXPANSION='${P9K_TOOLBOX_NAME:#fedora-toolbox-*}' - # Custom icon. - # typeset -g POWERLEVEL9K_TOOLBOX_VISUAL_IDENTIFIER_EXPANSION='⭐' - # Custom prefix. - # typeset -g POWERLEVEL9K_TOOLBOX_PREFIX='%fin ' - - ###############################[ public_ip: public IP address ]############################### - # Public IP color. - typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=94 - # Custom icon. - # typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ########################[ vpn_ip: virtual private network indicator ]######################### - # VPN IP color. - typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=81 - # When on VPN, show just an icon without the IP address. - # Tip: To display the private IP address when on VPN, remove the next line. - typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= - # Regular expression for the VPN network interface. Run `ifconfig` or `ip -4 a show` while on VPN - # to see the name of the interface. - typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(gpd|wg|(.*tun)|tailscale)[0-9]*' - # If set to true, show one segment per matching network interface. If set to false, show only - # one segment corresponding to the first matching network interface. - # Tip: If you set it to true, you'll probably want to unset POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION. - typeset -g POWERLEVEL9K_VPN_IP_SHOW_ALL=false - # Custom icon. - # typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ###########[ ip: ip address and bandwidth usage for a specified network interface ]########### - # IP color. - typeset -g POWERLEVEL9K_IP_FOREGROUND=38 - # The following parameters are accessible within the expansion: - # - # Parameter | Meaning - # ----------------------+------------------------------------------- - # P9K_IP_IP | IP address - # P9K_IP_INTERFACE | network interface - # P9K_IP_RX_BYTES | total number of bytes received - # P9K_IP_TX_BYTES | total number of bytes sent - # P9K_IP_RX_BYTES_DELTA | number of bytes received since last prompt - # P9K_IP_TX_BYTES_DELTA | number of bytes sent since last prompt - # P9K_IP_RX_RATE | receive rate (since last prompt) - # P9K_IP_TX_RATE | send rate (since last prompt) - typeset -g POWERLEVEL9K_IP_CONTENT_EXPANSION='$P9K_IP_IP${P9K_IP_RX_RATE:+ %70F<$P9K_IP_RX_RATE}${P9K_IP_TX_RATE:+ %215F>$P9K_IP_TX_RATE}' - # Show information for the first network interface whose name matches this regular expression. - # Run `ifconfig` or `ip -4 a show` to see the names of all network interfaces. - typeset -g POWERLEVEL9K_IP_INTERFACE='[ew].*' - # Custom icon. - # typeset -g POWERLEVEL9K_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' - - #########################[ proxy: system-wide http/https/ftp proxy ]########################## - # Proxy color. - typeset -g POWERLEVEL9K_PROXY_FOREGROUND=68 - # Custom icon. - # typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' - - ################################[ battery: internal battery ]################################# - # Show battery in red when it's below this level and not connected to power supply. - typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 - typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=160 - # Show battery in green when it's charging or fully charged. - typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=70 - # Show battery in yellow when it's discharging. - typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=178 - # Battery pictograms going from low to high level of charge. - typeset -g POWERLEVEL9K_BATTERY_STAGES=('battery') - # Don't show the remaining time to charge/discharge. - typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false - - #####################################[ wifi: wifi speed ]##################################### - # WiFi color. - typeset -g POWERLEVEL9K_WIFI_FOREGROUND=68 - # Custom icon. - # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='⭐' - - # Use different colors and icons depending on signal strength ($P9K_WIFI_BARS). - # - # # Wifi colors and icons for different signal strength levels (low to high). - # typeset -g my_wifi_fg=(68 68 68 68 68) # <-- change these values - # typeset -g my_wifi_icon=('WiFi' 'WiFi' 'WiFi' 'WiFi' 'WiFi') # <-- change these values - # - # typeset -g POWERLEVEL9K_WIFI_CONTENT_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}$P9K_WIFI_LAST_TX_RATE Mbps' - # typeset -g POWERLEVEL9K_WIFI_VISUAL_IDENTIFIER_EXPANSION='%F{${my_wifi_fg[P9K_WIFI_BARS+1]}}${my_wifi_icon[P9K_WIFI_BARS+1]}' - # - # The following parameters are accessible within the expansions: - # - # Parameter | Meaning - # ----------------------+--------------- - # P9K_WIFI_SSID | service set identifier, a.k.a. network name - # P9K_WIFI_LINK_AUTH | authentication protocol such as "wpa2-psk" or "none"; empty if unknown - # P9K_WIFI_LAST_TX_RATE | wireless transmit rate in megabits per second - # P9K_WIFI_RSSI | signal strength in dBm, from -120 to 0 - # P9K_WIFI_NOISE | noise in dBm, from -120 to 0 - # P9K_WIFI_BARS | signal strength in bars, from 0 to 4 (derived from P9K_WIFI_RSSI and P9K_WIFI_NOISE) - - ####################################[ time: current time ]#################################### - # Current time color. - typeset -g POWERLEVEL9K_TIME_FOREGROUND=66 - # Format for the current time: 09:51:02. See `man 3 strftime`. - typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' - # If set to true, time will update when you hit enter. This way prompts for the past - # commands will contain the start times of their commands as opposed to the default - # behavior where they contain the end times of their preceding commands. - typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false - # Custom icon. - typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION= - # Custom prefix. - # typeset -g POWERLEVEL9K_TIME_PREFIX='%fat ' - - # Example of a user-defined prompt segment. Function prompt_example will be called on every - # prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or - # POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and orange text greeting the user. - # - # Type `p10k help segment` for documentation and a more sophisticated example. - function prompt_example() { - p10k segment -f 208 -i '*' -t 'hello, %n' - } - - # User-defined prompt segments may optionally provide an instant_prompt_* function. Its job - # is to generate the prompt segment for display in instant prompt. See - # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. - # - # Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function - # and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k - # will replay these calls without actually calling instant_prompt_*. It is imperative that - # instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this - # rule is not observed, the content of instant prompt will be incorrect. - # - # Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If - # instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. - function instant_prompt_example() { - # Since prompt_example always makes the same `p10k segment` calls, we can call it from - # instant_prompt_example. This will give us the same `example` prompt segment in the instant - # and regular prompts. - prompt_example - } - - # User-defined prompt segments can be customized the same way as built-in segments. - # typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=208 - # typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' - - # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt - # when accepting a command line. Supported values: - # - # - off: Don't change prompt when accepting a command line. - # - always: Trim down prompt when accepting a command line. - # - same-dir: Trim down prompt when accepting a command line unless this is the first command - # typed after changing current working directory. - typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=always - - # Instant prompt mode. - # - # - off: Disable instant prompt. Choose this if you've tried instant prompt and found - # it incompatible with your zsh configuration files. - # - quiet: Enable instant prompt and don't print warnings when detecting console output - # during zsh initialization. Choose this if you've read and understood - # https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. - # - verbose: Enable instant prompt and print a warning when detecting console output during - # zsh initialization. Choose this if you've never tried instant prompt, haven't - # seen the warning, or if you are unsure what this all means. - typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose - - # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. - # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload - # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you - # really need it. - typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true - - # If p10k is already loaded, reload configuration. - # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. - (( ! $+functions[p10k] )) || p10k reload -} - -# Tell `p10k configure` which file it should overwrite. -typeset -g POWERLEVEL9K_CONFIG_FILE=${${(%):-%x}:a} - -(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} -'builtin' 'unset' 'p10k_config_opts' diff --git a/dotfiles/zsh/.zprofile b/dotfiles/zsh/.zprofile index 1c94960..392bc25 100644 --- a/dotfiles/zsh/.zprofile +++ b/dotfiles/zsh/.zprofile @@ -1,8 +1,2 @@ -# Load Homebrew for login shells. -if [[ -x /opt/homebrew/bin/brew ]]; then - eval "$(/opt/homebrew/bin/brew shellenv)" -elif [[ -x /usr/local/bin/brew ]]; then - eval "$(/usr/local/bin/brew shellenv)" -elif command -v brew >/dev/null 2>&1; then - eval "$(brew shellenv)" -fi +# Login shells initialize Homebrew before interactive shell setup. +[[ -r "$HOME/.config/zsh/homebrew.zsh" ]] && source "$HOME/.config/zsh/homebrew.zsh" diff --git a/dotfiles/zsh/.zshrc b/dotfiles/zsh/.zshrc index 4e1c1f4..37b477c 100644 --- a/dotfiles/zsh/.zshrc +++ b/dotfiles/zsh/.zshrc @@ -1,49 +1,31 @@ -# Enable Powerlevel10k instant prompt. Keep this close to the top of ~/.zshrc. -if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then - source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" -fi - # Some terminal apps launch interactive non-login shells, which skip ~/.zprofile. -if [[ -z "${HOMEBREW_PREFIX:-}" ]]; then - if [[ -x /opt/homebrew/bin/brew ]]; then - eval "$(/opt/homebrew/bin/brew shellenv)" - elif [[ -x /usr/local/bin/brew ]]; then - eval "$(/usr/local/bin/brew shellenv)" - elif command -v brew >/dev/null 2>&1; then - eval "$(brew shellenv)" - fi -fi - -export ZSH="$HOME/.oh-my-zsh" -ZSH_THEME="powerlevel10k/powerlevel10k" -plugins=(git zsh-autosuggestions) - -source "$ZSH/oh-my-zsh.sh" - -[[ ! -f "$HOME/.p10k.zsh" ]] || source "$HOME/.p10k.zsh" +[[ -r "$HOME/.config/zsh/homebrew.zsh" ]] && source "$HOME/.config/zsh/homebrew.zsh" -if [[ -r "$HOME/.oh-my-zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]]; then - source "$HOME/.oh-my-zsh/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" -elif [[ -r "${ZSH_CUSTOM:-$ZSH/custom}/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]]; then - source "${ZSH_CUSTOM:-$ZSH/custom}/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" -fi - -export PATH="$HOME/.lando/bin:$PATH" +# Command search path. Zsh keeps the path array and PATH in sync. +typeset -U path PATH +export BUN_INSTALL="$HOME/.bun" -if [[ -s "$HOME/.bun/_bun" ]]; then - source "$HOME/.bun/_bun" +[[ -d "$HOME/.lando/bin" ]] && path=("$HOME/.lando/bin" $path) +[[ -d "$BUN_INSTALL/bin" ]] && path=("$BUN_INSTALL/bin" $path) +if [[ -n "${HOMEBREW_PREFIX:-}" && -d "$HOMEBREW_PREFIX/opt/node@24/bin" ]]; then + path=("$HOMEBREW_PREFIX/opt/node@24/bin" $path) fi -export BUN_INSTALL="$HOME/.bun" -export PATH="$BUN_INSTALL/bin:$PATH" +# Persistent history without a shell framework. +HISTFILE="$HOME/.zsh_history" +HISTSIZE=50000 +SAVEHIST=10000 +setopt append_history extended_history hist_ignore_dups hist_ignore_space share_history -if [[ -d "$HOME/.docker/completions" ]]; then - fpath=("$HOME/.docker/completions" $fpath) -fi +# Completions supplied by local tools. +[[ -s "$HOME/.bun/_bun" ]] && source "$HOME/.bun/_bun" +[[ -d "$HOME/.docker/completions" ]] && fpath=("$HOME/.docker/completions" $fpath) autoload -Uz compinit -compinit +_zsh_cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/zsh" +mkdir -p "$_zsh_cache_dir" +compinit -d "$_zsh_cache_dir/zcompdump-${ZSH_VERSION}" +unset _zsh_cache_dir -if [[ -n "${HOMEBREW_PREFIX:-}" && -d "${HOMEBREW_PREFIX}/opt/node@24/bin" ]]; then - export PATH="${HOMEBREW_PREFIX}/opt/node@24/bin:$PATH" -fi +# Warp can replace this with its native prompt; other terminals retain a useful default. +PROMPT='%n@%m %1~ %# ' diff --git a/package.json b/package.json index ca24e3a..b060e6b 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,11 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@lando/leia": "^1.0.0-beta.4", - "eslint": "^10.4.1", + "eslint": "^10.7.0", "eslint-config-prettier": "^10.1.1", - "globals": "^17.6.0", + "globals": "^17.7.0", "mocha": "^11.7.6", - "prettier": "^3.8.3", + "prettier": "^3.9.5", "shellcheck": "^4.1.0" }, "scripts": { diff --git a/scratchpad/tanaab-colors-dark.png b/scratchpad/tanaab-colors-dark.png new file mode 100644 index 0000000..48f8c02 Binary files /dev/null and b/scratchpad/tanaab-colors-dark.png differ diff --git a/scratchpad/tanaab-colors-light.png b/scratchpad/tanaab-colors-light.png new file mode 100644 index 0000000..a9ae2dc Binary files /dev/null and b/scratchpad/tanaab-colors-light.png differ diff --git a/scratchpad/tanaab-syntax-javascript-dark.png b/scratchpad/tanaab-syntax-javascript-dark.png new file mode 100644 index 0000000..b75afa5 Binary files /dev/null and b/scratchpad/tanaab-syntax-javascript-dark.png differ diff --git a/scratchpad/tanaab-syntax-javascript-light.png b/scratchpad/tanaab-syntax-javascript-light.png new file mode 100644 index 0000000..ea657e6 Binary files /dev/null and b/scratchpad/tanaab-syntax-javascript-light.png differ diff --git a/scratchpad/tanaab-syntax-vue-dark.png b/scratchpad/tanaab-syntax-vue-dark.png new file mode 100644 index 0000000..6b356ab Binary files /dev/null and b/scratchpad/tanaab-syntax-vue-dark.png differ diff --git a/scratchpad/tanaab-syntax-vue-light.png b/scratchpad/tanaab-syntax-vue-light.png new file mode 100644 index 0000000..87217c3 Binary files /dev/null and b/scratchpad/tanaab-syntax-vue-light.png differ diff --git a/scratchpad/tanaab-terminal-dark.png b/scratchpad/tanaab-terminal-dark.png new file mode 100644 index 0000000..977d4b8 Binary files /dev/null and b/scratchpad/tanaab-terminal-dark.png differ diff --git a/scratchpad/tanaab-terminal-light.png b/scratchpad/tanaab-terminal-light.png new file mode 100644 index 0000000..ef7740e Binary files /dev/null and b/scratchpad/tanaab-terminal-light.png differ diff --git a/skills/me-readiness/SKILL.md b/skills/me-readiness/SKILL.md index e933427..09f3080 100644 --- a/skills/me-readiness/SKILL.md +++ b/skills/me-readiness/SKILL.md @@ -17,8 +17,8 @@ metadata: Use this skill to verify that the current `me` checkout and interactive macOS profile are ready for supported work as `pirog`. Core machine capabilities and required Codex integration determine -readiness. Optional applications, 1Password access, Tailscale connectivity, the Janus runtime, and -the monday connector produce warnings without making the whole profile unready. +readiness. Optional applications, 1Password access, Tailscale connectivity, and the monday +connector produce warnings without making the whole profile unready. The skill is read-only. It does not install packages, restow files, configure tokens, repair services, mutate connector data, or validate the Agentbox product. @@ -65,7 +65,7 @@ services, mutate connector data, or validate the Agentbox product. - `homebrew`: Homebrew availability and effective write access. - `packages`: every Brewfile formula, optional Brewfile casks, required commands, and the Homebrew `node@24` runtime. - - `dotfiles`: complete Stow simulation, optional Janus runtime, and generated Codex config. + - `dotfiles`: complete Stow simulation and generated Codex config. - `manual_apps`: optional 1Password and Tailscale capabilities plus token-fallback warnings. - `codex_plugins`: the installed `piroplugin` link and its target checkout. @@ -133,8 +133,8 @@ services, mutate connector data, or validate the Agentbox product. missing link or conflict fails readiness. - Keep generated Codex config and the `piroplugin` link to the current checkout as required integration surfaces. -- Treat the Janus runtime, 1Password CLI/vault/Environment access, Tailscale command/connectivity, - Agentbox `tailscaled`, and monday identity as optional warnings. +- Treat 1Password CLI/vault/Environment access, Tailscale command/connectivity, Agentbox + `tailscaled`, and monday identity as optional warnings. - Treat the GitHub connector identity as required. - Never print token values, raw environment contents, or the 1Password authorization sentinel. - Do not mutate GitHub or monday data and do not fall back to browser or computer automation. @@ -161,7 +161,7 @@ services, mutate connector data, or validate the Agentbox product. - Confirm missing formulas, required commands, incomplete Stow state, generated config, and the `piroplugin` target produce failures. -- Confirm missing casks, Janus, 1Password, Tailscale, Agentbox `tailscaled`, and monday produce only +- Confirm missing casks, 1Password, Tailscale, Agentbox `tailscaled`, and monday produce only warnings. - Confirm Node 24 and newer pass while older versions fail. - Confirm Agentbox cask exceptions require the same executable-script and plist markers as diff --git a/skills/me-readiness/scripts/check-machine-lib.js b/skills/me-readiness/scripts/check-machine-lib.js index cd19f20..6312199 100644 --- a/skills/me-readiness/scripts/check-machine-lib.js +++ b/skills/me-readiness/scripts/check-machine-lib.js @@ -57,7 +57,6 @@ const CHECK_BUCKET_BY_ID = new Map([ ]), ['node_version', 'packages'], ['dotfiles_stowed', 'dotfiles'], - ['vim_janus_runtime', 'dotfiles'], ['codex_generated_config', 'dotfiles'], ['command_op', 'manual_apps'], ['onepassword_cli_vault_access', 'manual_apps'], @@ -471,31 +470,6 @@ async function appendDotfileChecks(checks, repoRoot, homeDir, deps) { } } -async function appendVimJanusRuntimeCheck(checks, homeDir, deps) { - const janusRuntimePath = path.join(homeDir, '.vim', 'janus', 'vim'); - const requiredFiles = [ - path.join(janusRuntimePath, 'core', 'before', 'plugin', 'janus.vim'), - path.join(janusRuntimePath, 'core', 'plugins.vim'), - ]; - const missing = []; - - for (const requiredFile of requiredFiles) { - if (!(await pathInfo(requiredFile, deps))) { - missing.push(requiredFile); - } - } - - checks.push( - missing.length === 0 - ? pass('vim_janus_runtime', 'Janus runtime exists at ~/.vim/janus/vim.') - : warn( - 'vim_janus_runtime', - `Optional Janus runtime is incomplete: ${missing.join(', ')}.`, - 'Restore the Janus runtime at ~/.vim/janus/vim before relying on the Vim profile.', - ), - ); -} - async function appendGeneratedConfigCheck(checks, homeDir, deps) { const generatedConfigPath = path.join(homeDir, '.codex', 'config.toml'); try { @@ -834,7 +808,6 @@ export async function checkMachine(options = {}) { await appendRequiredCommandChecks(checks, deps); await appendNodeRuntimeCheck(checks, deps); await appendDotfileChecks(checks, repoRoot, homeDir, deps); - await appendVimJanusRuntimeCheck(checks, homeDir, deps); await appendGeneratedConfigCheck(checks, homeDir, deps); await appendOnePasswordChecks(checks, agentboxHost, env, deps); await appendTailscaleChecks(checks, agentboxHost, deps); diff --git a/test/me-readiness-check-machine.spec.js b/test/me-readiness-check-machine.spec.js index 7ed9724..337f729 100644 --- a/test/me-readiness-check-machine.spec.js +++ b/test/me-readiness-check-machine.spec.js @@ -41,6 +41,7 @@ const DEFAULT_BREWFILE = [ 'brew "node@24"', 'brew "python@3.14"', 'brew "stow"', + 'brew "vim"', 'brew "zsh"', 'brew "oven-sh/bun/bun"', ].join('\n'); @@ -53,6 +54,7 @@ const DEFAULT_FORMULAS = [ 'node@24', 'python@3.14', 'stow', + 'vim', 'zsh', 'oven-sh/bun/bun', ]; @@ -69,10 +71,6 @@ const DEFAULT_CASKS = [ ]; const DOTFILE_PACKAGES = ['ai', 'git', 'ssh', 'vim', 'zsh']; -function homePath(...segments) { - return path.join(HOME_DIR, ...segments); -} - function makeFileInfo({ executable = false, file = true, symbolicLink = false } = {}) { return { mode: executable ? 0o100755 : 0o100644, @@ -117,7 +115,6 @@ function makeDeps({ execCalls, installedCasks = DEFAULT_CASKS, installedFormulas = DEFAULT_FORMULAS, - janusReady = true, nodeVersion = 'v24.11.1', opError = false, pluginTarget = REPO_ROOT, @@ -132,11 +129,6 @@ function makeDeps({ const caskSet = new Set(installedCasks); const formulaSet = new Set(installedFormulas); const unwritable = new Set(unwritablePaths); - const janusFiles = new Set([ - homePath('.vim', 'janus', 'vim', 'core', 'before', 'plugin', 'janus.vim'), - homePath('.vim', 'janus', 'vim', 'core', 'plugins.vim'), - ]); - return { access(targetPath) { if (unwritable.has(targetPath)) { @@ -206,9 +198,6 @@ function makeDeps({ if (targetPath === PLUGIN_LINK) { return makeFileInfo({ symbolicLink: true }); } - if (janusReady && janusFiles.has(targetPath)) { - return makeFileInfo(); - } throw new Error(`missing: ${targetPath}`); }, readFile(targetPath) { @@ -355,13 +344,6 @@ describe('skills/me-readiness/scripts/check-machine-lib', () => { assert.equal(findCheck(report, 'dotfiles_stowed').status, 'fail'); }); - it('treats the external Janus runtime as optional', async () => { - const report = await runCheck({ janusReady: false }); - - assert.equal(report.ok, true); - assert.equal(findCheck(report, 'vim_janus_runtime').status, 'warn'); - }); - it('keeps generated Codex configuration and piroplugin as hard requirements', async () => { const missingConfig = await runCheck({ configExists: false }); const wrongPlugin = await runCheck({ pluginTarget: '/tmp/other-me' }); @@ -445,7 +427,6 @@ describe('skills/me-readiness/scripts/check-machine-lib', () => { configExists: false, installedCasks: [], installedFormulas: [], - janusReady: false, stowOutput: 'LINK: .zshrc', tailscaleError: true, unwritablePaths: [HOMEBREW_CACHE],