From 331bfe63e66ba1b476d375823c261b32eeed3c7d Mon Sep 17 00:00:00 2001 From: xSghetti Date: Sun, 4 Aug 2024 14:30:13 -0400 Subject: [PATCH] restore zsh --- src/powerlevel10k/LICENSE | 22 + src/powerlevel10k/Makefile | 14 + src/powerlevel10k/README.md | 2107 ++++ src/powerlevel10k/config/p10k-classic.zsh | 1737 +++ .../config/p10k-lean-8colors.zsh | 1712 +++ src/powerlevel10k/config/p10k-lean.zsh | 1712 +++ src/powerlevel10k/config/p10k-pure.zsh | 193 + src/powerlevel10k/config/p10k-rainbow.zsh | 1835 ++++ .../config/p10k-robbyrussell.zsh | 111 + src/powerlevel10k/font.md | 167 + src/powerlevel10k/internal/configure.zsh | 84 + src/powerlevel10k/internal/configure.zsh.zwc | Bin 0 -> 8488 bytes src/powerlevel10k/internal/icons.zsh | 1167 ++ src/powerlevel10k/internal/icons.zsh.zwc | Bin 0 -> 63544 bytes src/powerlevel10k/internal/notes.md | 197 + src/powerlevel10k/internal/p10k.zsh | 9491 +++++++++++++++++ src/powerlevel10k/internal/p10k.zsh.zwc | Bin 0 -> 817224 bytes src/powerlevel10k/internal/parser.zsh | 382 + src/powerlevel10k/internal/parser.zsh.zwc | Bin 0 -> 17512 bytes src/powerlevel10k/internal/wizard.zsh | 2256 ++++ src/powerlevel10k/internal/worker.zsh | 219 + src/powerlevel10k/internal/worker.zsh.zwc | Bin 0 -> 17568 bytes src/powerlevel10k/powerlevel10k.png | Bin 0 -> 62099 bytes src/powerlevel10k/powerlevel10k.zsh-theme | 83 + src/powerlevel10k/powerlevel10k.zsh-theme.zwc | Bin 0 -> 8552 bytes src/powerlevel10k/powerlevel9k.zsh-theme | 1 + src/powerlevel10k/powerlevel9k.zsh-theme.zwc | Bin 0 -> 560 bytes src/powerlevel10k/prompt_powerlevel10k_setup | 1 + src/powerlevel10k/prompt_powerlevel9k_setup | 1 + 29 files changed, 23492 insertions(+) create mode 100644 src/powerlevel10k/LICENSE create mode 100644 src/powerlevel10k/Makefile create mode 100644 src/powerlevel10k/README.md create mode 100644 src/powerlevel10k/config/p10k-classic.zsh create mode 100644 src/powerlevel10k/config/p10k-lean-8colors.zsh create mode 100644 src/powerlevel10k/config/p10k-lean.zsh create mode 100644 src/powerlevel10k/config/p10k-pure.zsh create mode 100644 src/powerlevel10k/config/p10k-rainbow.zsh create mode 100644 src/powerlevel10k/config/p10k-robbyrussell.zsh create mode 100644 src/powerlevel10k/font.md create mode 100644 src/powerlevel10k/internal/configure.zsh create mode 100644 src/powerlevel10k/internal/configure.zsh.zwc create mode 100644 src/powerlevel10k/internal/icons.zsh create mode 100644 src/powerlevel10k/internal/icons.zsh.zwc create mode 100644 src/powerlevel10k/internal/notes.md create mode 100644 src/powerlevel10k/internal/p10k.zsh create mode 100644 src/powerlevel10k/internal/p10k.zsh.zwc create mode 100644 src/powerlevel10k/internal/parser.zsh create mode 100644 src/powerlevel10k/internal/parser.zsh.zwc create mode 100644 src/powerlevel10k/internal/wizard.zsh create mode 100644 src/powerlevel10k/internal/worker.zsh create mode 100644 src/powerlevel10k/internal/worker.zsh.zwc create mode 100644 src/powerlevel10k/powerlevel10k.png create mode 100644 src/powerlevel10k/powerlevel10k.zsh-theme create mode 100644 src/powerlevel10k/powerlevel10k.zsh-theme.zwc create mode 100644 src/powerlevel10k/powerlevel9k.zsh-theme create mode 100644 src/powerlevel10k/powerlevel9k.zsh-theme.zwc create mode 100644 src/powerlevel10k/prompt_powerlevel10k_setup create mode 100644 src/powerlevel10k/prompt_powerlevel9k_setup diff --git a/src/powerlevel10k/LICENSE b/src/powerlevel10k/LICENSE new file mode 100644 index 0000000..7986ede --- /dev/null +++ b/src/powerlevel10k/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2009-2014 Robby Russell and contributors (see https://github.com/robbyrussell/oh-my-zsh/contributors) +Copyright (c) 2014-2017 Ben Hilburn +Copyright (c) 2019 Roman Perepelitsa and contributors (see https://github.com/romkatv/powerlevel10k/contributors) + +MIT LICENSE + +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/src/powerlevel10k/Makefile b/src/powerlevel10k/Makefile new file mode 100644 index 0000000..86e55ee --- /dev/null +++ b/src/powerlevel10k/Makefile @@ -0,0 +1,14 @@ +ZSH := $(shell command -v zsh 2> /dev/null) + +all: + +zwc: + $(MAKE) -C gitstatus zwc + $(or $(ZSH),:) -fc 'for f in *.zsh-theme internal/*.zsh; do zcompile -R -- $$f.zwc $$f || exit; done' + +minify: + $(MAKE) -C gitstatus minify + rm -rf -- .git .gitattributes .gitignore LICENSE Makefile README.md font.md powerlevel10k.png + +pkg: zwc + $(MAKE) -C gitstatus pkg diff --git a/src/powerlevel10k/README.md b/src/powerlevel10k/README.md new file mode 100644 index 0000000..884cb21 --- /dev/null +++ b/src/powerlevel10k/README.md @@ -0,0 +1,2107 @@ +# Powerlevel10k +[![Gitter](https://badges.gitter.im/powerlevel10k/community.svg)]( + https://gitter.im/powerlevel10k/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) + +- **THE PROJECT HAS VERY LIMITED SUPPORT** +- **NO NEW FEATURES ARE IN THE WORKS** +- **MOST BUGS WILL GO UNFIXED** +- **HELP REQUESTS WILL BE IGNORED** + +Powerlevel10k is a theme for Zsh. It emphasizes [speed](#uncompromising-performance), +[flexibility](#extremely-customizable) and [out-of-the-box experience](#configuration-wizard). + +![Powerlevel10k]( +https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-styles-high-contrast.png) + +- [Getting started](#getting-started) +- [Features](#features) +- [Installation](#installation) +- [Configuration](#configuration) +- [Fonts](#fonts) +- [Try it in Docker](#try-it-in-docker) +- [License](#license) +- [FAQ](#faq) +- [Troubleshooting](#troubleshooting) + +## Getting started + +1. [Install the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). *Optional but highly + recommended.* +1. [Install Powerlevel10k](#installation) itself. +1. Restart Zsh with `exec zsh`. +1. Type `p10k configure` if the configuration wizard doesn't start automatically. + +## Features + +- [Configuration wizard](#configuration-wizard) +- [Uncompromising performance](#uncompromising-performance) +- [Powerlevel9k compatibility](#powerlevel9k-compatibility) +- [Pure compatibility](#pure-compatibility) +- [Instant prompt](#instant-prompt) +- [Show on command](#show-on-command) +- [Transient prompt](#transient-prompt) +- [Current directory that just works](#current-directory-that-just-works) +- [Extremely customizable](#extremely-customizable) +- [Batteries included](#batteries-included) +- [Extensible](#extensible) + +### Configuration wizard + +Type `p10k configure` to access the builtin configuration wizard right from your terminal. + +
+ Screen recording + + ![Powerlevel10k Configuration Wizard]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/configuration-wizard.gif) +
+ +All styles except [Pure](#pure-compatibility) are functionally equivalent. They display the same +information and differ only in presentation. + +Configuration wizard creates `~/.p10k.zsh` based on your preferences. Additional prompt +customization can be done by editing this file. It has plenty of comments to help you navigate +through configuration options. + +*Tip*: Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) before +running `p10k configure` to unlock all prompt styles. + +*FAQ:* + +- [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) +- [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) + +*Troubleshooting*: + +- [Some prompt styles are missing from the configuration wizard]( + #some-prompt-styles-are-missing-from-the-configuration-wizard). +- [Question mark in prompt](#question-mark-in-prompt). +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render). +- [Sub-pixel imperfections around powerline symbols]( + #sub-pixel-imperfections-around-powerline-symbols). +- [Directory is difficult to see in prompt when using Rainbow style]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style). + +### Uncompromising performance + +When you hit *ENTER*, the next prompt appears instantly. With Powerlevel10k there is no prompt lag. +If you install Cygwin on Raspberry Pi, `cd` into a Linux Git repository and activate enough prompt +segments to fill four prompt lines on both sides of the screen... wait, that's just crazy and no +one ever does that. Probably impossible, too. The point is, Powerlevel10k prompt is always fast, no +matter what you do! + +
+ Screen recording + + ![Powerlevel10k Performance]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/performance.gif) +
+ +Note how the effect of every command is instantly reflected by the very next prompt. + +| Command | Prompt Indicator | Meaning | +|-------------------------------|:----------------:|----------------------------------------------------------------------:| +| `timew start hack linux` | `โŒš hack linux` | time tracking enabled in [timewarrior](https://timewarrior.net/) | +| `touch x y` | `?2` | 2 untracked files in the Git repo | +| `rm COPYING` | `!1` | 1 unstaged change in the Git repo | +| `echo 3.7.3 >.python-version` | `๐Ÿ 3.7.3` | the current python version in [pyenv](https://github.com/pyenv/pyenv) | + +Other Zsh themes capable of displaying the same information either produce prompt lag or print +prompt that doesn't reflect the current state of the system and then refresh it later. With +Powerlevel10k you get fast prompt *and* up-to-date information. + +*FAQ*: [Is it really fast?](#is-it-really-fast) + +### Powerlevel9k compatibility + +Powerlevel10k understands all [Powerlevel9k](https://github.com/Powerlevel9k/powerlevel9k) +configuration parameters. + +
+ Screen recording + + ![Powerlevel10k Compatibility with 9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/9k-compatibility.gif) +
+ +[Migration](#installation) from Powerlevel9k to Powerlevel10k is a straightforward process. All +your `POWERLEVEL9K` configuration parameters will still work. Prompt will look the same as before +([almost]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config)) +but it will be [much faster](#uncompromising-performance) ([certainly](#is-it-really-fast)). + +*FAQ*: + +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?]( + #im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) +- [What is the relationship between Powerlevel9k and Powerlevel10k?]( + #What-is-the-relationship-between-powerlevel9k-and-powerlevel10k) + +### Pure compatibility + +Powerlevel10k can produce the same prompt as [Pure](https://github.com/sindresorhus/pure). Type +`p10k configure` and select *Pure* style. + +
+ Screen recording + + ![Powerlevel10k Pure Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/pure-style.gif) +
+ +You can still use Powerlevel10k features such as [transient prompt](#transient-prompt) or +[instant prompt](#instant-prompt) when sporting Pure style. + +To customize prompt, edit `~/.p10k.zsh`. Powerlevel10k doesn't recognize Pure configuration +parameters, so you'll need to use `POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3` instead of +`PURE_CMD_MAX_EXEC_TIME=3`, etc. All relevant parameters are in `~/.p10k.zsh`. This file has +plenty of comments to help you navigate through it. + +*FAQ:* [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) + +### Instant prompt + +If your `~/.zshrc` loads many plugins, or perhaps just a few slow ones +(for example, [pyenv](https://github.com/pyenv/pyenv) or [nvm](https://github.com/nvm-sh/nvm)), you +may have noticed that it takes some time for Zsh to start. + +
+ Screen recording + + ![Powerlevel10k No Instant Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/no-instant-prompt.gif) +
+ +Powerlevel10k can remove Zsh startup lag **even if it's not caused by a theme**. + +
+ Screen recording + + ![Powerlevel10k Instant Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/instant-prompt.gif) +
+ +This feature is called *Instant Prompt*. You need to explicitly enable it through `p10k configure` +or [manually](#how-do-i-configure-instant-prompt). It does what it says on the tin -- prints prompt +instantly upon Zsh startup allowing you to start typing while plugins are still loading. + +Other themes *increase* Zsh startup lag -- some by a lot, others by a just a little. Powerlevel10k +*removes* it outright. + +If you are curious about how *Instant Prompt* works, see +[this section in zsh-bench](https://github.com/romkatv/zsh-bench#instant-prompt). + +*FAQ:* [How do I configure instant prompt?](#how-do-i-configure-instant-prompt) + +### Show on command + +The behavior of some commands depends on global environment. For example, `kubectl run ...` runs an +image on the cluster defined by the current kubernetes context. If you frequently change context +between "prod" and "testing", you might want to display the current context in Zsh prompt. If you do +likewise for AWS, Azure and Google Cloud credentials, prompt will get pretty crowded. + +Enter *Show On Command*. This feature makes prompt segments appear only when they are relevant to +the command you are currently typing. + +
+ Screen recording + + ![Powerlevel10k Show On Command]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/show-on-command.gif) +
+ +Configs created by `p10k configure` enable show on command for several prompt segments by default. +Here's the relevant parameter for kubernetes context: + +```zsh +# Show prompt segment "kubecontext" only when the command you are typing invokes one of these tools. +typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' +``` + +To customize when different prompt segments are shown, open `~/.p10k.zsh`, search for +`SHOW_ON_COMMAND` and either remove these parameters to display affected segments unconditionally, +or change their values. + +### Transient prompt + +When *Transient Prompt* is enabled through `p10k configure`, Powerlevel10k will trim down every +prompt when accepting a command line. + +
+ Screen recording + + ![Powerlevel10k Transient Prompt]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/transient-prompt.gif) +
+ +Transient prompt makes it much easier to copy-paste series of commands from the terminal scrollback. + +*Tip*: If you enable transient prompt, take advantage of two-line prompt. You'll get the benefit of +extra space for typing commands without the usual drawback of reduced scrollback density. Sparse +prompt (with an empty line before prompt) also works great in combination with transient prompt. + +### Current directory that just works + +The current working directory is perhaps the most important prompt segment. Powerlevel10k goes to +great length to highlight its important parts and to truncate it with the least loss of information +when horizontal space gets scarce. + +
+ Screen recording + + ![Powerlevel10k Directory Truncation]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/directory-truncation.gif) +
+ +When the full directory doesn't fit, the leftmost segment gets truncated to its shortest unique +prefix. In the screencast, `~/work` becomes `~/wo`. It couldn't be truncated to `~/w` because it +would be ambiguous (there was `~/wireguard` when the session was recorded). The next segment -- +`projects` -- turns into `p` as there was nothing else that started with `p` in `~/work/`. + +Directory segments are shown in one of three colors: + +- Truncated segments are bleak. +- Important segments are bright and never truncated. These include the first and the last segment, + roots of Git repositories, etc. +- Regular segments (not truncated but can be) use in-between color. + +*Tip*: If you copy-paste a truncated directory and hit *TAB*, it'll complete to the original. + +*Troubleshooting*: [Directory is difficult to see in prompt when using Rainbow style.]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) + +### Extremely customizable + +Powerlevel10k can be configured to look like any other Zsh theme out there. + +
+ Screen recording + + ![Powerlevel10k Other Theme Emulation]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/other-theme-emulation.gif) +
+ +[Pure](#pure-compatibility), [Powerlevel9k](#powerlevel9k-compatibility) and [robbyrussell]( + #how-to-make-powerlevel10k-look-like-robbyrussell-oh-my-zsh-theme) emulations are built-in. +To emulate the appearance of other themes, you'll need to write a suitable configuration file. The +best way to go about it is to run `p10k configure`, select the style that is the closest to your +goal and then edit `~/.p10k.zsh`. + +The full range of Powerlevel10k appearance spans from spartan: + +![Powerlevel10k Spartan Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/spartan-style.png) + +To ~~ridiculous~~ extravagant: + +![Powerlevel10k Extravagant Style]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/extravagant-style.png) + +### Batteries included + +Powerlevel10k comes with dozens of built-in high quality prompt segments that can display +information from a variety of sources. When you run `p10k configure` and choose any style +except [Pure](#pure-compatibility), many of these segments get enabled by +default while others can be manually enabled by opening `~/.p10k.zsh` and uncommenting them. +You can enable as many segments as you like. It won't slow down your prompt or Zsh startup. + +| Segment | Meaning | +|--------:|---------| +| `anaconda` | virtual environment from [conda](https://conda.io/) | +| `asdf` | tool versions from [asdf](https://github.com/asdf-vm/asdf) | +| `aws` | [aws profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) | +| `aws_eb_env` | [aws elastic beanstalk](https://aws.amazon.com/elasticbeanstalk/) environment | +| `azure` | [azure](https://docs.microsoft.com/en-us/cli/azure) account name | +| `background_jobs` | presence of background jobs | +| `battery` | internal battery state and charge level (yep, batteries *literally* included) | +| `command_execution_time` | duration (wall time) of the last command | +| `context` | user@hostname | +| `cpu_arch` | CPU architecture | +| `dir` | current working directory | +| `direnv` | [direnv](https://direnv.net/) status | +| `disk_usage` | disk usage | +| `dotnet_version` | [dotnet](https://dotnet.microsoft.com) version | +| `fvm` | flutter environment from [fvm](https://github.com/leoafarias/fvm) | +| `gcloud` | [google cloud](https://cloud.google.com/) cli account and project | +| `goenv` | go environment from [goenv](https://github.com/syndbg/goenv) | +| `google_app_cred` | [google application credentials](https://cloud.google.com/docs/authentication/production) | +| `go_version` | [go](https://golang.org) version | +| `haskell_stack` | haskell version from [stack](https://haskellstack.org/) | +| `ip` | IP address and bandwidth usage for a specified network interface | +| `java_version` | [java](https://www.java.com/) version | +| `jenv` | java environment from [jenv](https://github.com/jenv/jenv) | +| `kubecontext` | current [kubernetes](https://kubernetes.io/) context | +| `laravel_version` | [laravel php framework](https://laravel.com/) version | +| `load` | CPU load | +| `luaenv` | lua environment from [luaenv](https://github.com/cehoffman/luaenv) | +| `midnight_commander` | [midnight commander](https://midnight-commander.org/) shell | +| `nix_shell` | [nix shell](https://nixos.org/nixos/nix-pills/developing-with-nix-shell.html) indicator | +| `nnn` | [nnn](https://github.com/jarun/nnn) shell | +| `lf` | [lf](https://github.com/gokcehan/lf) shell | +| `chezmoi_shell` | [chezmoi](https://www.chezmoi.io/) shell | +| `nodeenv` | node.js environment from [nodeenv](https://github.com/ekalinin/nodeenv) | +| `nodenv` | node.js environment from [nodenv](https://github.com/nodenv/nodenv) | +| `node_version` | [node.js](https://nodejs.org/) version | +| `nordvpn` | [nordvpn](https://nordvpn.com/) connection status | +| `nvm` | node.js environment from [nvm](https://github.com/nvm-sh/nvm) | +| `os_icon` | your OS logo (apple for macOS, swirl for debian, etc.) | +| `package` | `name@version` from [package.json](https://docs.npmjs.com/files/package.json) | +| `per_directory_history` | Oh My Zsh [per-directory-history](https://github.com/jimhester/per-directory-history) local/global indicator | +| `perlbrew` | perl version from [perlbrew](https://github.com/gugod/App-perlbrew) | +| `phpenv` | php environment from [phpenv](https://github.com/phpenv/phpenv) | +| `php_version` | [php](https://www.php.net/) version | +| `plenv` | perl environment from [plenv](https://github.com/tokuhirom/plenv) | +| `prompt_char` | multi-functional prompt symbol; changes depending on vi mode: `โฏ`, `โฎ`, `V`, `โ–ถ` for insert, command, visual and replace mode respectively; turns red on error | +| `proxy` | system-wide http/https/ftp proxy | +| `public_ip` | public IP address | +| `pyenv` | python environment from [pyenv](https://github.com/pyenv/pyenv) | +| `ram` | free RAM | +| `ranger` | [ranger](https://github.com/ranger/ranger) shell | +| `yazi` | [yazi](https://github.com/sxyazi/yazi) shell | +| `rbenv` | ruby environment from [rbenv](https://github.com/rbenv/rbenv) | +| `rust_version` | [rustc](https://www.rust-lang.org) version | +| `rvm` | ruby environment from [rvm](https://rvm.io) | +| `scalaenv` | scala version from [scalaenv](https://github.com/scalaenv/scalaenv) | +| `status` | exit code of the last command | +| `swap` | used swap | +| `taskwarrior` | [taskwarrior](https://taskwarrior.org/) task count | +| `terraform` | [terraform](https://www.terraform.io) workspace | +| `terraform_version` | [terraform](https://www.terraform.io) version | +| `time` | current time | +| `timewarrior` | [timewarrior](https://timewarrior.net/) tracking status | +| `todo` | [todo](https://github.com/todotxt/todo.txt-cli) items | +| `toolbox` | [toolbox](https://github.com/containers/toolbox) name | +| `vcs` | Git repository status | +| `vim_shell` | [vim](https://www.vim.org/) shell (`:sh`) | +| `virtualenv` | python environment from [venv](https://docs.python.org/3/library/venv.html) | +| `vi_mode` | vi mode (you don't need this if you've enabled prompt_char) | +| `vpn_ip` | virtual private network indicator | +| `wifi` | WiFi speed | +| `xplr` | [xplr](https://github.com/sayanarijit/xplr) shell | + +### Extensible + +If there is no prompt segment that does what you need, implement your own. Powerlevel10k provides +public API for defining segments that are as fast and as flexible as built-in ones. + +
+ Screen recording + + ![Powerlevel10k Custom Segment]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/custom-segment.gif) +
+ +On Linux you can fetch current CPU temperature by reading `/sys/class/thermal/thermal_zone0/temp`. +The screencast shows how to define a prompt segment to display this value. Once the segment is +defined, you can use it like any other segment. All standard customization parameters will work for +it out of the box. + +Type `p10k help segment` for reference. + +*Note*: If you modify `POWERLEVEL9K_*` parameters in an already initialized interactive shell (as +opposed to editing `~/.p10k.zsh`), the changes might not be immediately effective. To apply the +modifications, invoke `p10k reload`. Setting `POWERLEVEL9K_DISABLE_HOT_RELOAD=false` eliminates the +necessity for `p10k reload` but results in a marginally slower prompt. + +*Tip*: Prefix names of your own segments with `my_` to avoid clashes with future versions of +Powerlevel10k. + +## Installation + +- [Manual](#manual) ๐Ÿ‘ˆ **choose this if confused or uncertain** +- [Oh My Zsh](#oh-my-zsh) +- [Prezto](#prezto) +- [Zim](#zim) +- [Antibody](#antibody) +- [Antidote](#antidote) +- [Antigen](#antigen) +- [Zplug](#zplug) +- [Zgen](#zgen) +- [Zplugin](#zplugin) +- [Zinit](#zinit) +- [Zi](#zi) +- [Zap](#zap) +- [Homebrew](#homebrew) +- [Arch Linux](#arch-linux) +- [Alpine Linux](#alpine-linux) +- [Fig](#fig) + +### Manual + +```zsh +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +Users in China can use the official mirror on gitee.com for faster download.
+ไธญๅ›ฝ็”จๆˆทๅฏไปฅไฝฟ็”จ gitee.com ไธŠ็š„ๅฎ˜ๆ–น้•œๅƒๅŠ ้€Ÿไธ‹่ฝฝ. + +```zsh +git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +This is the simplest kind of installation and it works even if you are using a plugin manager. Just +make sure to disable the current theme in your plugin manager. See +[troubleshooting](#cannot-make-powerlevel10k-work-with-my-plugin-manager) for help. + +### Oh My Zsh + +1. Clone the repository: + ```zsh + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k + ``` + Users in China can use the official mirror on gitee.com for faster download.
+ ไธญๅ›ฝ็”จๆˆทๅฏไปฅไฝฟ็”จ gitee.com ไธŠ็š„ๅฎ˜ๆ–น้•œๅƒๅŠ ้€Ÿไธ‹่ฝฝ. + + ```zsh + git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k + ``` +2. Set `ZSH_THEME="powerlevel10k/powerlevel10k"` in `~/.zshrc`. + +### Prezto + +Add `zstyle :prezto:module:prompt theme powerlevel10k` to `~/.zpreztorc`. + +### Zim + +Add `zmodule romkatv/powerlevel10k --use degit` to `~/.zimrc` and run `zimfw install`. + +### Antibody + +Add `antibody bundle romkatv/powerlevel10k` to `~/.zshrc`. + +### Antidote + +Add `romkatv/powerlevel10k` to `~/.zsh_plugins.txt`. + +### Antigen + +Add `antigen theme romkatv/powerlevel10k` to `~/.zshrc`. Make sure you have `antigen apply` +somewhere after it. + +### Zplug + +Add `zplug romkatv/powerlevel10k, as:theme, depth:1` to `~/.zshrc`. + +### Zgen + +Add `zgen load romkatv/powerlevel10k powerlevel10k` to `~/.zshrc`. + +### Zplugin + +Add `zplugin ice depth=1; zplugin light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zinit + +Add `zinit ice depth=1; zinit light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zi + +Add `zi ice depth=1; zi light romkatv/powerlevel10k` to `~/.zshrc`. + +The use of `depth=1` ice is optional. Other types of ice are neither recommended nor officially +supported by Powerlevel10k. + +### Zap + +Add `plug "romkatv/powerlevel10k"` to `~/.zshrc`. + +### Homebrew + +```zsh +brew install powerlevel10k +echo "source $(brew --prefix)/share/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc +``` + +### Arch Linux + +```zsh +yay -S --noconfirm zsh-theme-powerlevel10k-git +echo 'source /usr/share/zsh-theme-powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +[zsh-theme-powerlevel10k-git](https://aur.archlinux.org/packages/zsh-theme-powerlevel10k-git/) +referenced above is the official Powerlevel10k package. + +There is also [zsh-theme-powerlevel10k]( + https://www.archlinux.org/packages/extra/x86_64/zsh-theme-powerlevel10k/) package. +Historically, [it has been breaking often and for extended periods of time]( + https://github.com/romkatv/powerlevel10k/pull/786). **Do not use it.** + +### Alpine Linux + +```zsh +apk add zsh zsh-theme-powerlevel10k +mkdir -p ~/.local/share/zsh/plugins +ln -s /usr/share/zsh/plugins/powerlevel10k ~/.local/share/zsh/plugins/ +``` + +### Fig + +Follow the instructions on +[this page](https://fig.io/plugins/other/powerlevel10k). + +## Configuration + +- [For new users](#for-new-users) +- [For Powerlevel9k users](#for-powerlevel9k-users) + +### For new users + +On the first run, Powerlevel10k [configuration wizard](#configuration-wizard) will ask you a few +questions and configure your prompt. If it doesn't trigger automatically, type `p10k configure`. +Configuration wizard creates `~/.p10k.zsh` based on your preferences. Additional prompt +customization can be done by editing this file. It has plenty of comments to help you navigate +through configuration options. + +*FAQ*: + +- [What is the best prompt style in the configuration wizard?]( + #what-is-the-best-prompt-style-in-the-configuration-wizard) +- [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) +- [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) +- [How do I add username and/or hostname to prompt?]( + #how-do-i-add-username-andor-hostname-to-prompt) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) +- [Why some prompt segments appear and disappear as I'm typing?]( + #why-some-prompt-segments-appear-and-disappear-as-im-typing) + +*Troubleshooting*: + +- [Question mark in prompt](#question-mark-in-prompt). +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render). +- [Sub-pixel imperfections around powerline symbols]( + #sub-pixel-imperfections-around-powerline-symbols). +- [Directory is difficult to see in prompt when using Rainbow style]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style). + +### For Powerlevel9k users + +If you've been using Powerlevel9k before, **do not remove the configuration options**. Powerlevel10k +will pick them up and provide you with the same prompt UI you are used to. See +[Powerlevel9k compatibility](#powerlevel9k-compatibility). + +*FAQ*: + +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?]( + #im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [What is the relationship between Powerlevel9k and Powerlevel10k?]( + #what-is-the-relationship-between-powerlevel9k-and-powerlevel10k) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) + +*Troubleshooting*: [Extra or missing spaces in prompt compared to Powerlevel9k]( + #extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k). + +## Fonts + +Powerlevel10k doesn't require custom fonts but can take advantage of them if they are available. +It works well with [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts), +[Source Code Pro](https://github.com/adobe-fonts/source-code-pro), +[Font Awesome](https://fontawesome.com/), [Powerline](https://github.com/powerline/fonts), and even +the default system fonts. The full choice of style options is available only when using +[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts). + +๐Ÿ‘‡ **Recommended font**: Meslo Nerd Font patched for Powerlevel10k. ๐Ÿ‘‡ + +### Meslo Nerd Font patched for Powerlevel10k + +Gorgeous monospace font designed by Jim Lyles for Bitstream, customized by the same for Apple, +further customized by Andrรฉ Berg, and finally patched by yours truly with customized scripts +originally developed by Ryan L McIntyre of Nerd Fonts. Contains all glyphs and symbols that +Powerlevel10k may need. Battle-tested in dozens of different terminals on all major operating +systems. + +*FAQ*: [How was the recommended font created?](#how-was-the-recommended-font-created) + +#### Automatic font installation + +If you are using iTerm2 or Termux, `p10k configure` can install the recommended font for you. +Simply answer `Yes` when asked whether to install *Meslo Nerd Font*. + +If you are using a different terminal, proceed with manual font installation. ๐Ÿ‘‡ + +#### Manual font installation + +1. Download these four ttf files: + - [MesloLGS NF Regular.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf) + - [MesloLGS NF Bold.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf) + - [MesloLGS NF Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf) + - [MesloLGS NF Bold Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf) +1. Double-click on each file and click "Install". This will make `MesloLGS NF` font available to all + applications on your system. +1. Configure your terminal to use this font: + - **iTerm2**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. Alternatively, open *iTerm2 โ†’ Preferences โ†’ Profiles โ†’ Text* and set *Font* to + `MesloLGS NF`. + - **Apple Terminal**: Open *Terminal โ†’ Preferences โ†’ Profiles โ†’ Text*, click *Change* under *Font* + and select `MesloLGS NF` family. + - **Hyper**: Open *Hyper โ†’ Edit โ†’ Preferences* and change the value of `fontFamily` under + `module.exports.config` to `MesloLGS NF`. + - **Visual Studio Code**: Open *File โ†’ Preferences โ†’ Settings* (PC) or + *Code โ†’ Preferences โ†’ Settings* (Mac), enter `terminal.integrated.fontFamily` in the search box at + the top of *Settings* tab and set the value below to `MesloLGS NF`. + Consult [this screenshot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/389133fb8c9a2347929a23702ce3039aacc46c3d/visual-studio-code-font-settings.jpg) + to see how it should look like or see [this issue]( + https://github.com/romkatv/powerlevel10k/issues/671) for extra information. + - **GNOME Terminal** (the default Ubuntu terminal): Open *Terminal โ†’ Preferences* and click on the + selected profile under *Profiles*. Check *Custom font* under *Text Appearance* and select + `MesloLGS NF Regular`. + - **Konsole**: Open *Settings โ†’ Edit Current Profile โ†’ Appearance*, click *Select Font* and select + `MesloLGS NF Regular`. + - **Tilix**: Open *Tilix โ†’ Preferences* and click on the selected profile under *Profiles*. Check + *Custom font* under *Text Appearance* and select `MesloLGS NF Regular`. + - **Windows Console Host** (the old thing): Click the icon in the top left corner, then + *Properties โ†’ Font* and set *Font* to `MesloLGS NF`. + - **Windows Terminal** by Microsoft (the new thing): Open *Settings* (Ctrl+,), click + either on the selected profile under *Profiles* or on *Defaults*, click *Appearance* and set + *Font face* to `MesloLGS NF`. + - **Conemu**: Open *Setup โ†’ General โ†’ Fonts* and set *Main console font* to `MesloLGS NF`. + - **IntelliJ** (and other IDEs by Jet Brains): Open *IDE โ†’ Edit โ†’ Preferences โ†’ Editor โ†’ + Color Scheme โ†’ Console Font*. Select *Use console font instead of the default* and set the font + name to `MesloLGS NF`. + - **Termux**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. + - **Blink**: Type `config`, go to *Appearance*, tap *Add a new font*, tap *Open Gallery*, select + *MesloLGS NF.css*, tap *import* and type `exit` in the home view to reload the font. + - **Tabby** (formerly **Terminus**): Open *Settings โ†’ Appearance* and set *Font* to `MesloLGS NF`. + - **Terminator**: Open *Preferences* using the context menu. Under *Profiles* select the *General* + tab (should be selected already), uncheck *Use the system fixed width font* (if not already) + and select `MesloLGS NF Regular`. Exit the Preferences dialog by clicking *Close*. + - **Guake**: Right Click on an open terminal and open *Preferences*. Under *Appearance* + tab, uncheck *Use the system fixed width font* (if not already) and select `MesloLGS NF Regular`. + Exit the Preferences dialog by clicking *Close*. + - **MobaXterm**: Open *Settings* โ†’ *Configuration* โ†’ *Terminal* โ†’ (under *Terminal look and feel*) + and change *Font* to `MesloLGS NF`. If you have *sessions*, you need to change the font in each + of them through *Settings* โ†’ right click on an individual session โ†’ *Edit Session* โ†’ *Terminal + Settings* โ†’ *Font settings*. + - **Asbrรบ Connection Manager**: Open *Preferences โ†’ Local Shell Options โ†’ Look and Feel*, enable + *Use these personal options* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + To change the font for the remote host connections, go to *Preferences โ†’ Terminal Options โ†’ + Look and Feel* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + - **WSLtty**: Right click on an open terminal and then on *Options*. In the *Text* section, under + *Font*, click *"Select..."* and set Font to `MesloLGS NF Regular`. + - **Yakuake**: Click *โ‰ก* โ†’ *Manage Profiles* โ†’ *New* โ†’ *Appearance*. Click *Choose* next to the + *Font* dropdown, select `MesloLGS NF` and click *OK*. Click *OK* to save the profile. Select the + new profile and click *Set as Default*. + - **Alacritty**: Create or open `~/.config/alacritty/alacritty.toml` and add the following + section to it: + ```toml + [font.normal] + family = "MesloLGS NF" + ``` + - **foot**: Create or open `~/.config/foot/foot.ini` and add the following section to it: + ```ini + font=MesloLGS NF:size=12 + ``` + - **kitty**: Create or open `~/.config/kitty/kitty.conf` and add the following line to it: + ```text + font_family MesloLGS NF + ``` + Restart kitty by closing all sessions and opening a new session. + - **puTTY**: Set *Window* โ†’ *Appearance* โ†’ *Font* to `MesloLGS NF`. Requires puTTY + version >= 0.75. + - **WezTerm**: Create or open `$HOME/.config/wezterm/wezterm.lua` and add the following: + ```lua + local wezterm = require 'wezterm'; + return { + font = wezterm.font("MesloLGS NF"), + } + ``` + If the file already exists, only add the line with the font to the existing return. + Also add the first line if it is not already present. + - **urxvt**: Create or open `~/.Xresources` and add the following line to it: + ```text + URxvt.font: xft:MesloLGS NF:size=11 + ``` + You can adjust the font size to your preference. After changing the config run + `xrdb ~/.Xresources` to reload it. The new config is applied to all new terminals. + - **xterm**: Create or open `~/.Xresources` and add the following line to it: + ```text + xterm*faceName: MesloLGS NF + ``` + After changing the config run `xrdb ~/.Xresources` to reload it. The new config is applied to + all new terminals. + - **Zed**: Open `~/.config/zed/settings.json` and set `terminal.font_family` to `"MesloLGS NF"`. + ```jsonc + { + "terminal": { + "font_family": "MesloLGS NF" + }, + // Other settings. + } + ``` + - Crostini (Linux on Chrome OS): Open + chrome-untrusted://terminal/html/nassh_preferences_editor.html, set *Text font family* to + `'MesloLGS NF'` (including the quotes) and *Custom CSS (inline text)* to the following: + ```css + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Regular.ttf"); + font-weight: normal; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold.ttf"); + font-weight: bold; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Italic.ttf"); + font-weight: normal; + font-style: italic; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold%20Italic.ttf"); + font-weight: bold; + font-style: italic; + } + ``` + **_CAVEAT_**: If you open the normal terminal preferences these settings will be overwritten. +1. Run `p10k configure` to generate a new `~/.p10k.zsh`. The old config may work + incorrectly with the new font. + +_Using a different terminal and know how to set the font for it? Share your knowledge by sending a +PR to expand the list!_ + +## Try it in Docker + +Try Powerlevel10k in Docker. You can safely make any changes to the file system while trying out +the theme. Once you exit Zsh, the container is deleted. + +```zsh +docker run -e TERM -e COLORTERM -e LC_ALL=C.UTF-8 -it --rm alpine sh -uec ' + apk add git zsh nano vim + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k + echo "source ~/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc + cd ~/powerlevel10k + exec zsh' +``` + +*Tip*: Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) before +running the Docker command to get access to all prompt styles. + +*Tip*: Run `p10k configure` while in Docker to try a different prompt style. + +## License + +Powerlevel10k is released under the +[MIT license](https://github.com/romkatv/powerlevel10k/blob/master/LICENSE). + +## FAQ + +- [How do I update Powerlevel10k?](#how-do-i-update-powerlevel10k) +- [How do I uninstall Powerlevel10k?](#how-do-i-uninstall-powerlevel10k) +- [How do I install Powerlevel10k on a machine without Internet access?](#how-do-i-install-powerlevel10k-on-a-machine-without-internet-access) +- [Where can I ask for help and report bugs?](#where-can-i-ask-for-help-and-report-bugs) +- [Which aspects of shell and terminal does Powerlevel10k affect?](#which-aspects-of-shell-and-terminal-does-powerlevel10k-affect) +- [I'm using Powerlevel9k with Oh My Zsh. How do I migrate?](#im-using-powerlevel9k-with-oh-my-zsh-how-do-i-migrate) +- [Is it really fast?](#is-it-really-fast) +- [How do I configure instant prompt?](#how-do-i-configure-instant-prompt) +- [How do I initialize direnv when using instant prompt?](#how-do-i-initialize-direnv-when-using-instant-prompt) +- [How do I export GPG_TTY when using instant prompt?](#how-do-i-export-gpg_tty-when-using-instant-prompt) +- [What do different symbols in Git status mean?](#what-do-different-symbols-in-git-status-mean) +- [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) +- [Why is Git status from `$HOME/.git` not displayed in prompt?](#why-is-git-status-from-homegit-not-displayed-in-prompt) +- [Why does Git status sometimes appear grey and then gets colored after a short period of time?](#why-does-git-status-sometimes-appear-grey-and-then-gets-colored-after-a-short-period-of-time) +- [How do I add username and/or hostname to prompt?](#how-do-i-add-username-andor-hostname-to-prompt) +- [Why some prompt segments appear and disappear as I'm typing?](#why-some-prompt-segments-appear-and-disappear-as-im-typing) +- [How do I change prompt colors?](#how-do-i-change-prompt-colors) +- [Why does Powerlevel10k spawn extra processes?](#why-does-powerlevel10k-spawn-extra-processes) +- [Are there configuration options that make Powerlevel10k slow?](#are-there-configuration-options-that-make-powerlevel10k-slow) +- [Is Powerlevel10k fast to load?](#is-powerlevel10k-fast-to-load) +- [What is the relationship between Powerlevel9k and Powerlevel10k?](#what-is-the-relationship-between-powerlevel9k-and-powerlevel10k) +- [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?](#does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) +- [What is the best prompt style in the configuration wizard?](#what-is-the-best-prompt-style-in-the-configuration-wizard) +- [How to make Powerlevel10k look like robbyrussell Oh My Zsh theme?](#how-to-make-powerlevel10k-look-like-robbyrussell-oh-my-zsh-theme) +- [Can prompts for completed commands display error status for *those* commands instead of the commands preceding them?](#can-prompts-for-completed-commands-display-error-status-for-those-commands-instead-of-the-commands-preceding-them) +- [What is the minimum supported Zsh version?](#what-is-the-minimum-supported-zsh-version) +- [How were these screenshots and animated gifs created?](#how-were-these-screenshots-and-animated-gifs-created) +- [How was the recommended font created?](#how-was-the-recommended-font-created) +- [How to package Powerlevel10k for distribution?](#how-to-package-powerlevel10k-for-distribution) + +### How do I update Powerlevel10k? + +The command to update Powerlevel10k depends on how it was installed. + +| Installation | Update command | +|-------------------------------|-------------------------------------------------------------| +| [Manual](#manual) | `git -C ~/powerlevel10k pull` | +| [Oh My Zsh](#oh-my-zsh) | `git -C ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k pull` | +| [Prezto](#prezto) | `zprezto-update` | +| [Zim](#zim) | `zimfw update` | +| [Antigen](#antigen) | `antigen update` | +| [Antidote](#antidote) | `antidote update` | +| [Zplug](#zplug) | `zplug update` | +| [Zgen](#zgen) | `zgen update` | +| [Zplugin](#zplugin) | `zplugin update` | +| [Zinit](#zinit) | `zinit update` | +| [Zi](#zi) | `zi update` | +| [Zap](#zap) | `zap update` | +| [Homebrew](#homebrew) | `brew update && brew upgrade` | +| [Arch Linux](#arch-linux) | `yay -S --noconfirm zsh-theme-powerlevel10k-git` | +| [Alpine Linux](#alpine-linux) | `apk update && apk upgrade` | + +**IMPORTANT**: Restart Zsh after updating Powerlevel10k. [Do not use `source ~/.zshrc`]( + #weird-things-happen-after-typing-source-zshrc). + +### How do I uninstall Powerlevel10k? + +1. Remove all references to "p10k" from `~/.zshrc`. You might have this snippet at the top: + ```zsh + 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 + ``` + And this at the bottom: + ```zsh + [[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh + ``` + These are added by the [configuration wizard](#configuration-wizard). Remove them. +2. Remove all references to "powerlevel10k" from `~/.zshrc`, `~/.zpreztorc` and `~/.zimrc` (some + of these files may be missing -- this is normal). These references have been added manually by + yourself when installing Powerlevel10k. Refer to the [installation instructions](#installation) + if you need a reminder. +3. Verify that all references to "p10k" and "powerlevel10k" are gone from `~/.zshrc`, `~/.zpreztorc` + and `~/.zimrc`. + ```zsh + grep -E 'p10k|powerlevel10k' ~/.zshrc ~/.zpreztorc ~/.zimrc 2>/dev/null + ``` + If this command produces output, there are still references to "p10k" or "powerlevel10k". You + need to remove them. +4. Delete Powerlevel10k configuration file. This file is created by the + [configuration wizard](#configuration-wizard) and may contain manual edits by yourself. + ```zsh + rm -f ~/.p10k.zsh + ``` +5. Delete Powerlevel10k source files. These files have been downloaded when you've installed + Powerlevel10k. The command to delete them depends on which installation method you'd chosen. + Refer to the [installation instructions](#installation) if you need a reminder. + + | Installation | Uninstall command | + |-------------------------------|------------------------------------------------------------------| + | [Manual](#manual) | `rm -rf ~/powerlevel10k` | + | [Oh My Zsh](#oh-my-zsh) | `rm -rf -- ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k` | + | [Prezto](#prezto) | n/a | + | [Zim](#zim) | `zimfw uninstall` | + | [Antigen](#antigen) | `antigen purge romkatv/powerlevel10k` | + | [Antidote](#antidote) | `antidote purge romkatv/powerlevel10k` | + | [Zplug](#zplug) | `zplug clean` | + | [Zgen](#zgen) | `zgen reset` | + | [Zplugin](#zplugin) | `zplugin delete romkatv/powerlevel10k` | + | [Zinit](#zinit) | `zinit delete romkatv/powerlevel10k` | + | [Zi](#zi) | `zi delete romkatv/powerlevel10k` | + | [Zap](#zap) | `zsh -ic 'zap clean'` | + | [Homebrew](#homebrew) | `brew uninstall powerlevel10k` | + | [Arch Linux](#arch-linux) | `yay -R --noconfirm zsh-theme-powerlevel10k-git` | + | [Alpine Linux](#alpine-linux) | `apk del zsh-theme-powerlevel10k` | +6. Restart Zsh. [Do not use `source ~/.zshrc`](#weird-things-happen-after-typing-source-zshrc). +7. Delete Powerlevel10k cache files. + ```zsh + rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}"/p10k-*(N) "${XDG_CACHE_HOME:-$HOME/.cache}"/gitstatus + ``` + +### How do I install Powerlevel10k on a machine without Internet access? + +1. Run this command on the machine without Internet access: + ```sh + uname -sm | tr '[A-Z]' '[a-z]' + ``` +2. Run these commands on a machine connected to the Internet after replacing the value of + `target_uname` with the output of the previous command: + ```sh + target_uname="replace this with the output of the previous command" + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k + GITSTATUS_CACHE_DIR="$HOME"/powerlevel10k/gitstatus/usrbin ~/powerlevel10k/gitstatus/install -f -s "${target_uname% *}" -m "${target_uname#* }" + ``` +3. Copy `~/powerlevel10k` from the machine connected to the Internet to the one without Internet + access. +4. Add `source ~/powerlevel10k/powerlevel10k.zsh-theme` to `~/.zshrc` on the machine without + Internet access: + ```zsh + echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc + ``` +5. If `~/.zshrc` on the machine without Internet access sets `ZSH_THEME`, remove that line. + ```zsh + sed -i.bak '/^ZSH_THEME=/d' ~/.zshrc + ``` + +To update, remove `~/powerlevel10k` on both machines and repeat steps 1-3. + +### Where can I ask for help and report bugs? + +The best way to ask for help and to report bugs is to [open an issue]( + https://github.com/romkatv/powerlevel10k/issues). + +[Gitter]( + https://gitter.im/powerlevel10k/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +is another option. + +If all else fails, email roman.perepelitsa@gmail.com. + +If necessary, encrypt your communication with [this PGP key]( + https://api.github.com/users/romkatv/gpg_keys). + +### Which aspects of shell and terminal does Powerlevel10k affect? + +Powerlevel10k defines prompt and nothing else. It sets [prompt-related options]( + http://zsh.sourceforge.net/Doc/Release/Options.html#Prompting), and parameters `PS1` and `RPS1`. + +![Prompt Highlight]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/prompt-highlight.png) + +Everything within the highlighted areas on the screenshot is produced by Powerlevel10k. +Powerlevel10k has no control over the terminal content or colors outside these areas. + +Powerlevel10k does not affect: + +- Terminal window/tab title. +- Colors used by `ls`. +- The behavior of `git` command. +- The content and style of Tab completions. +- Command line colors (syntax highlighting, autosuggestions, etc.). +- Key bindings. +- Aliases. +- Prompt parameters other than `PS1` and `RPS1`. +- Zsh options other than those [related to prompt]( + http://zsh.sourceforge.net/Doc/Release/Options.html#Prompting). +- The set of available commands. Powerlevel10k does not install any new commands + with the only exception of `p10k`. + +### I'm using Powerlevel9k with Oh My Zsh. How do I migrate? + +1. Run this command: +```zsh +# Add powerlevel10k to the list of Oh My Zsh themes. +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k +# Replace ZSH_THEME="powerlevel9k/powerlevel9k" with ZSH_THEME="powerlevel10k/powerlevel10k". +sed -i.bak 's/powerlevel9k/powerlevel10k/g' ~/.zshrc +# Restart Zsh. +exec zsh +``` +2. *Optional but highly recommended:* + 1. Install [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). + 1. Type `p10k configure` and choose your favorite prompt style. + +*Related:* + - [Powerlevel9k compatibility.](#powerlevel9k-compatibility) + - [Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config?]( + #does-powerlevel10k-always-render-exactly-the-same-prompt-as-powerlevel9k-given-the-same-config) + - [Extra or missing spaces in prompt compared to Powerlevel9k.]( + #extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k) + - [Configuration wizard.](#configuration-wizard) + +### Is it really fast? + +Yes. See [zsh-bench](https://github.com/romkatv/zsh-bench) or a direct comparison with +[Powerlevel9k](https://asciinema.org/a/NHRjK3BMePw66jtRVY2livHwZ) and +[Spaceship](https://asciinema.org/a/253094). + +### How do I configure instant prompt? + +See [instant prompt](#instant-prompt) to learn about instant prompt. This section explains how you +can enable and configure it and lists caveats that you should be aware of. + +Instant prompt can be enabled either through `p10k configure` or by manually adding the following +code snippet at the top of `~/.zshrc`: + +```zsh +# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. +# Initialization code that may require console input (password prompts, [y/n] +# confirmations, etc.) must go above this block; everything else may go below. +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 +``` + +It's important that you copy the lines verbatim. Don't replace `source` with something else, don't +call `zcompile`, don't redirect output, etc. + +When instant prompt is enabled, for the duration of Zsh initialization standard input is redirected +to `/dev/null` and standard output with standard error are redirected to a temporary file. Once Zsh +is fully initialized, standard file descriptors are restored and the content of the temporary file +is printed out. + +When using instant prompt, you should carefully check any output that appears on Zsh startup as it +may indicate that initialization has been altered, or perhaps even broken, by instant prompt. +Initialization code that may require console input, such as asking for a keyring password or for a +*[y/n]* confirmation, must be moved above the instant prompt preamble in `~/.zshrc`. Initialization +code that merely prints to console but never reads from it will work correctly with instant prompt, +although output that normally has colors may appear uncolored. You can either leave it be, suppress +the output, or move it above the instant prompt preamble. + +Here's an example of `~/.zshrc` that breaks when instant prompt is enabled: + +```zsh +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 + +keychain id_rsa --agents ssh # asks for password +chatty-script # spams to stdout even when everything is fine +# ... +``` + +Fixed version: + +```zsh +keychain id_rsa --agents ssh # moved before instant prompt + +# OK to perform console I/O before this point. +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 +# From this point on, until zsh is fully initialized, console input won't work and +# console output may appear uncolored. + +chatty-script >/dev/null # spam output suppressed +# ... +``` + +If `POWERLEVEL9K_INSTANT_PROMPT` is unset or set to `verbose`, Powerlevel10k will print a warning +when it detects console output during initialization to bring attention to potential issues. You can +silence this warning (without suppressing console output) with `POWERLEVEL9K_INSTANT_PROMPT=quiet`. +This is recommended if some initialization code in `~/.zshrc` prints to console and it's infeasible +to move it above the instant prompt preamble or to suppress its output. You can completely disable +instant prompt with `POWERLEVEL9K_INSTANT_PROMPT=off`. Do this if instant prompt breaks Zsh +initialization and you don't know how to fix it. + +The value of `POWERLEVEL9K_INSTANT_PROMPT` can be changed by running `p10k configure` and selecting +the appropriate option on the *Instant Prompt* screen. Alternatively, you can search for +`POWERLEVEL9K_INSTANT_PROMPT` in the existing `~/.p10k.zsh` and change its value there. + +*Note*: Instant prompt requires Zsh >= 5.4. It's OK to enable it even when using an older version of +Zsh but it won't do anything. + +*FAQ*: + +- [How do I initialize direnv when using instant prompt?]( + #how-do-i-initialize-direnv-when-using-instant-prompt) +- [How do I export GPG_TTY when using instant prompt?]( + #how-do-i-export-gpg_tty-when-using-instant-prompt) + +### How do I initialize direnv when using instant prompt? + +If you've enabled [instant prompt](#instant-prompt), you should have these lines at the top of +`~/.zshrc`: + +```zsh +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 +``` + +To initialize direnv you need to add one line above that block and one line below it. + +```zsh +(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv export zsh)" + +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 + +(( ${+commands[direnv]} )) && emulate zsh -c "$(direnv hook zsh)" +``` + +*Related*: [How do I export GPG_TTY when using instant prompt?]( + #how-do-i-export-gpg_tty-when-using-instant-prompt) + +### How do I export GPG_TTY when using instant prompt? + +You can export `GPG_TTY` like this anywhere in `~/.zshrc`: + +```zsh +export GPG_TTY=$TTY +``` + +This works whether you are using [instant prompt](#instant-prompt) or not. It works even if you +aren't using powerlevel10k. As an extra bonus, it's much faster than the commonly used +`export GPG_TTY=$(tty)`. + +*Related*: [How do I initialize direnv when using instant prompt?]( + #how-do-i-initialize-direnv-when-using-instant-prompt) + +### What do different symbols in Git status mean? + +When using Lean, Classic or Rainbow style, Git status may look like this: + +```text +feature:master wip โ‡ฃ42โ‡ก42 โ‡ 42โ‡ข42 *42 merge ~42 +42 !42 ?42 +``` + +| Symbol | Meaning | Source | +| --------- | -------------------------------------------------------------------- | ------------------------------------------------------ | +| `feature` | current branch; replaced with `#tag` or `@commit` if not on a branch | `git status --ignore-submodules=dirty` | +| `master` | remote tracking branch; only shown if different from local branch | `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}` | +| `wip` | the latest commit's summary contains "wip" or "WIP" | `git show --pretty=%s --no-patch HEAD` | +| `=` | up to date with the remote (neither ahead nor behind) | `git rev-list --count HEAD...@{upstream}` | +| `โ‡ฃ42` | this many commits behind the remote | `git rev-list --right-only --count HEAD...@{upstream}` | +| `โ‡ก42` | this many commits ahead of the remote | `git rev-list --left-only --count HEAD...@{upstream}` | +| `โ‡ 42` | this many commits behind the push remote | `git rev-list --right-only --count HEAD...@{push}` | +| `โ‡ข42` | this many commits ahead of the push remote | `git rev-list --left-only --count HEAD...@{push}` | +| `*42` | this many stashes | `git stash list` | +| `merge` | repository state | `git status --ignore-submodules=dirty` | +| `~42` | this many merge conflicts | `git status --ignore-submodules=dirty` | +| `+42` | this many staged changes | `git status --ignore-submodules=dirty` | +| `!42` | this many unstaged changes | `git status --ignore-submodules=dirty` | +| `?42` | this many untracked files | `git status --ignore-submodules=dirty` | +| `โ”€` | the number of staged, unstaged or untracked files is unknown | `echo $POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY` or `git config --get bash.showDirtyState` | + +*Related*: [How do I change the format of Git status?](#how-do-i-change-the-format-of-git-status) + +### How do I change the format of Git status? + +To change the format of Git status, open `~/.p10k.zsh`, search for `my_git_formatter` and edit its +source code. + +*Related*: [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) + +### Why is Git status from `$HOME/.git` not displayed in prompt? + +When using Lean, Classic or Rainbow style, `~/.p10k.zsh` contains the following parameter: + +```zsh +# 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='~' +``` + +To see Git status for `$HOME/.git` in prompt, open `~/.p10k.zsh` and remove +`POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN`. + +### Why does Git status sometimes appear grey and then gets colored after a short period of time? + +tl;dr: When Git status in prompt is greyed out, it means Powerlevel10k is currently computing +up-to-date Git status in the background. Prompt will get automatically refreshed when this +computation completes. + +When your current directory is within a Git repository, Powerlevel10k computes up-to-date Git +status after every command. If the repository is large, or the machine is slow, this computation +can take quite a bit of time. If it takes longer than 10 milliseconds (configurable via +`POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS`), Powerlevel10k displays the last known Git status in +grey and continues to compute up-to-date Git status in the background. When the computation +completes, Powerlevel10k refreshes prompt with new information, this time with colored Git status. + +When using *Rainbow* style, Git status is displayed as black on grey while it's still being +computed. Depending on the terminal color palette, this may be difficult to read. In this case you +might want to change the background color to something lighter for more contrast. To do that, open +`~/.p10k.zsh`, search for `POWERLEVEL9K_VCS_LOADING_BACKGROUND`, uncomment it if it's commented out, +and change the value. + +```zsh +typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=244 +``` + +Type `source ~/.p10k.zsh` to apply your changes to the current Zsh session. + +*Related*: [How do I change prompt colors?](#how-do-i-change-prompt-colors) + +### How do I add username and/or hostname to prompt? + +When using Lean, Classic or Rainbow style, prompt shows `username@hostname` when you are logged in +as root or via SSH. There is little value in showing `username` or `hostname` when you are logged in +to your local machine as a normal user. So the absence of `username@hostname` in your prompt is an +indication that you are working locally and that you aren't root. You can change it, however. + +Open `~/.p10k.zsh`. Close to the top you can see the most important parameters that define which +segments are shown in your prompt. All generally useful prompt segments are listed in there. Some of +them are enabled, others are commented out. One of them is of interest to you. + +```zsh +typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + ... + context # user@hostname + ... +) +``` + +Search for `context` to find the section in the config that lists parameters specific to this prompt +segment. You should see the following lines: + +```zsh +# 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= +``` + +If you follow the tip and remove (or comment out) the last line, you'll always see +`username@hostname` in prompt. You can change the format to just `username`, or change the color, by +adjusting the values of parameters nearby. There are plenty of comments to help you navigate. + +You can also move `context` to a different position in `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS` or even +to `POWERLEVEL9K_LEFT_PROMPT_ELEMENTS`. + +### Why some prompt segments appear and disappear as I'm typing? + +Prompt segments can be configured to be shown only when the current command you are typing invokes +a relevant tool. + +```zsh +# Show prompt segment "kubecontext" only when the command you are typing invokes +# invokes kubectl, helm, or kubens. +typeset -g POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' +``` + +Configs created by `p10k configure` may contain parameters of this kind. To customize when different +prompt segments are shown, open `~/.p10k.zsh`, search for `SHOW_ON_COMMAND` and either remove these +parameters or change their values. + +You can also define a function in `~/.zshrc` to toggle the display of a prompt segment between +*always* and *on command*. This is similar to `kubeon`/`kubeoff` from +[kube-ps1](https://github.com/jonmosco/kube-ps1). + +```zsh +function kube-toggle() { + if (( ${+POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND} )); then + unset POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND + else + POWERLEVEL9K_KUBECONTEXT_SHOW_ON_COMMAND='kubectl|helm|kubens' + fi + p10k reload + if zle; then + zle push-input + zle accept-line + fi +} +``` + +Invoke this function by typing `kube-toggle`. You can also bind it to a key by adding two more lines +to `~/.zshrc`: + +```zsh +zle -N kube-toggle +bindkey '^]' kube-toggle # ctrl-] to toggle kubecontext in powerlevel10k prompt +``` + +### How do I change prompt colors? + +You can either [change the color palette used by your terminal]( + #change-the-color-palette-used-by-your-terminal) or +[set colors through Powerlevel10k configuration parameters]( + #set-colors-through-Powerlevel10k-configuration-parameters). + +#### Change the color palette used by your terminal + +How exactly you change the terminal color palette (a.k.a. color scheme, or theme) depends on the +kind of terminal you are using. Look around in terminal's settings/preferences or consult +documentation. + +When you change the terminal color palette, it usually affects only the first 16 colors, numbered +from 0 to 15. In order to see any effect on Powerlevel10k prompt, you need to use prompt style that +utilizes these low-numbered colors. Type `p10k configure` and select *Rainbow*, *Lean* โ†’ *8 colors* +or *Pure* โ†’ *Original*. Other styles use higher-numbered colors, so they look the same in any +terminal color palette. + +#### Set colors through Powerlevel10k configuration parameters + +Open `~/.p10k.zsh`, search for "color", "foreground" and "background" and change values of +appropriate parameters. For example, here's how you can set the foreground of `time` prompt segment +to bright red: + +```zsh +typeset -g POWERLEVEL9K_TIME_FOREGROUND=160 +``` + +Colors are specified using numbers from 0 to 255. Colors from 0 to 15 look differently in different +terminals. Many terminals also support customization of these colors through color palettes +(a.k.a. color schemes, or themes). Colors from 16 to 255 always look the same. + +Type `source ~/.p10k.zsh` to apply your changes to the current Zsh session. + +To see how different numbered colors look in your terminal, run the following command: + +```zsh +for i in {0..255}; do print -Pn "%K{$i} %k%F{$i}${(l:3::0:)i}%f " ${${(M)$((i%6)):#3}:+$'\n'}; done +``` + +If your terminal supports truecolor, you can use 24-bit colors in the `#RRGGBB` format in addition +to the numbered colors. + +```zsh +typeset -g POWERLEVEL9K_TIME_FOREGROUND='#FF0000' +``` + +*Related:* + - [Directory is difficult to see in prompt when using Rainbow style.]( + #directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) + - [Incorrect foreground color in VSCode Terminal.](#incorrect-foreground-color-in-vscode-terminal) + +By default, VSCode Terminal may arbitrarily replace the foreground color of your choice with a +different color. This behavior can be +[turned off](https://code.visualstudio.com/docs/terminal/appearance#_minimum-contrast-ratio) in +VSCode settings. + +### Why does Powerlevel10k spawn extra processes? + +Powerlevel10k uses [gitstatus](https://github.com/romkatv/gitstatus) as the backend behind `vcs` +prompt; gitstatus spawns `gitstatusd` and `zsh`. See +[gitstatus](https://github.com/romkatv/gitstatus) for details. Powerlevel10k may also spawn `zsh` +to perform computation without blocking prompt. To avoid security hazard, these background processes +aren't shared by different interactive shells. They terminate automatically when the parent `zsh` +process terminates or runs `exec(3)`. + +### Are there configuration options that make Powerlevel10k slow? + +No, Powerlevel10k is always fast, with any configuration you throw at it. If you have noticeable +prompt latency when using Powerlevel10k, please +[open an issue](https://github.com/romkatv/powerlevel10k/issues). + +### Is Powerlevel10k fast to load? + +Yes. See [zsh-bench](https://github.com/romkatv/zsh-bench). + +### What is the relationship between Powerlevel9k and Powerlevel10k? + +Powerlevel10k was forked from Powerlevel9k in March 2019 after a week-long discussion in +[powerlevel9k#1170](https://github.com/Powerlevel9k/powerlevel9k/issues/1170). Powerlevel9k was +already a mature project with a large user base and a release cycle measured in months. Powerlevel10k +was spun off to iterate on performance improvements and new features at much higher pace. + +Powerlevel9k and Powerlevel10k are independent projects. When using one, you shouldn't install the +other. Issues should be filed against the project that you actually use. There are no individuals +that have commit rights in both repositories. All bug fixes and new features committed to +Powerlevel9k repository get ported to Powerlevel10k. + +Over time, virtually all code in Powerlevel10k has been rewritten. There is currently no meaningful +overlap between the implementations of Powerlevel9k and Powerlevel10k. + +Powerlevel10k is committed to maintaining backward compatibility with all configs indefinitely. This +commitment covers all configuration parameters recognized by Powerlevel9k (see +[Powerlevel9k compatibility](#powerlevel9k-compatibility)) and additional parameters that only +Powerlevel10k understands. Names of all parameters in Powerlevel10k start with `POWERLEVEL9K_` for +consistency. + +### Does Powerlevel10k always render exactly the same prompt as Powerlevel9k given the same config? + +Almost. There are a few differences. + +- By default only `git` vcs backend is enabled in Powerlevel10k. If you need `svn` and `hg`, add + them to `POWERLEVEL9K_VCS_BACKENDS`. These backends aren't yet optimized in Powerlevel10k, so + enabling them will make prompt *very slow*. +- Powerlevel10k doesn't support `POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY=true`. +- Powerlevel10k strives to be bug-compatible with Powerlevel9k but not when it comes to egregious + bugs. If you accidentally rely on these bugs, your prompt will differ between Powerlevel9k and + Powerlevel10k. Some examples: + - Powerlevel9k ignores some options that are set after the theme is sourced while Powerlevel10k + respects all options. If you see different icons in Powerlevel9k and Powerlevel10k, you've + probably defined `POWERLEVEL9K_MODE` before sourcing the theme. This parameter gets ignored + by Powerlevel9k but honored by Powerlevel10k. If you want your prompt to look in Powerlevel10k + the same as in Powerlevel9k, remove `POWERLEVEL9K_MODE`. + - Powerlevel9k doesn't respect `ZLE_RPROMPT_INDENT`. As a result, right prompt in Powerlevel10k + can have an extra space at the end compared to Powerlevel9k. Set `ZLE_RPROMPT_INDENT=0` if you + don't want that space. More details in + [troubleshooting](#extra-space-without-background-on-the-right-side-of-right-prompt). + - Powerlevel9k has inconsistent spacing around icons. This was fixed in Powerlevel10k. Set + `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to get the same spacing as in Powerlevel9k. More + details in [troubleshooting](#extra-or-missing-spaces-around-icons). + - There are dozens more bugs in Powerlevel9k that don't exist in Powerlevel10k. + +If you notice any other changes in prompt appearance when switching from Powerlevel9k to +Powerlevel10k, please [open an issue](https://github.com/romkatv/powerlevel10k/issues). + +### What is the best prompt style in the configuration wizard? + +There are as many opinions on what constitutes the best prompt as there are people. It mostly comes +down to personal preference. There are, however, a few hidden implications of different choices. + +Pure style is an exact replication of [Pure Zsh theme](https://github.com/sindresorhus/pure). It +exists to ease the migration for users of this theme. Unless you are one of them, choose Lean +style over Pure. + +If you want to confine prompt colors to the selected terminal color palette (say, *Solarized Dark*), +use *Rainbow*, *Lean* โ†’ *8 colors* or *Pure* โ†’ *Original*. Other styles use fixed colors and thus +look the same in any terminal color palette. + +All styles except Pure have an option to use *ASCII* charset. Prompt will look less pretty but will +render correctly with all fonts and in all locales. + +If you enable transient prompt, take advantage of two-line prompt. You'll get the benefit of +extra space for typing commands without the usual drawback of reduced scrollback density. Having +all commands start from the same offset is also nice. + +Similarly, if you enable transient prompt, sparse prompt (with an empty line before prompt) is a +great choice. + +If you are using vi keymap, choose prompt with `prompt_char` in it (shown as green `โฏ` in the +wizard). This symbol changes depending on vi mode: `โฏ`, `โฎ`, `V`, `โ–ถ` for insert, command, visual +and replace mode respectively. When a command fails, the symbol turns red. *Lean* style always has +`prompt_char` in it. *Rainbow* and *Classic* styles have it only in the two-line configuration +without left frame. + +If you value horizontal space or prefer minimalist aesthetics: + +- Use a monospace font, such as [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). + Non-monospace fonts require extra space after icons that are larger than a single column. +- Use Lean style. Compared to Classic and Rainbow, it saves two characters per prompt segment. +- Disable *current time* and *frame*. +- Use *few icons*. The extra icons enabled by the *many icons* option primarily serve decorative + function. Informative icons, such as background job indicator, will be shown either way. + +*Note*: You can run configuration wizard as many times as you like. Type `p10k configure` to try new +prompt style. + +### How to make Powerlevel10k look like robbyrussell Oh My Zsh theme? + +Use [this config]( + https://github.com/romkatv/powerlevel10k/blob/master/config/p10k-robbyrussell.zsh). + +You can either download it, save as `~/.p10k.zsh` and `source ~/.p10k.zsh` from `~/.zshrc`, or +source `p10k-robbyrussell.zsh` directly from your cloned `powerlevel10k` repository. + +### Can prompts for completed commands display error status for *those* commands instead of the commands preceding them? + +No. When you hit *ENTER* and the command you've typed starts running, its error status isn't yet +known, so it cannot be shown in prompt. When the command completes, the error status gets known but +it's no longer possible to update prompt for *that* command. This is why the error status for every +command is reflected in the *next* prompt. + +For details, see [this post on /r/zsh]( +https://www.reddit.com/r/zsh/comments/eg49ff/powerlevel10k_prompt_history_exit_code_colors/fc5huku). + +### What is the minimum supported Zsh version? + +Zsh 5.3 or newer should work. Fast startup requires Zsh >= 5.4. + +### How were these screenshots and animated gifs created? + +All screenshots and animated gifs were recorded in GNOME Terminal with +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) and Tango Dark color palette with +custom background color (`#171A1B` instead of `#2E3436` -- twice as dark). + +![GNOME Terminal Color Settings]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/gnome-terminal-colors.png) + +Syntax highlighting, where present, was provided by [zsh-syntax-highlighting]( + https://github.com/zsh-users/zsh-syntax-highlighting). + +### How was the recommended font created? + +[The recommended font](#meslo-nerd-font-patched-for-powerlevel10k) is the product of many +individuals. Its origin is *Bitstream Vera Sans Mono*, which has given birth to *Menlo*, which in +turn has spawned *Meslo*. Finally, extra glyphs have been added to *Meslo* with scripts forked +from Nerd Fonts. The final font is released under the terms of +[Apache License]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20License.txt). + +MesloLGS NF font can be recreated with the following command (requires `git` and `docker`): + +```zsh +git clone --depth=1 https://github.com/romkatv/nerd-fonts.git +cd nerd-fonts +./build 'Meslo/S/*' +``` + +If everything goes well, four `ttf` files will appear in `./out`. + +### How to package Powerlevel10k for distribution? + +It's currently neither easy nor recommended to package and distribute Powerlevel10k. There are no +instructions you can follow that would allow you to easily update your package when new versions of +Powerlevel10k are released. This may change in the future but not soon. + +## Troubleshooting + +- [`[oh-my-zsh] theme 'powerlevel10k/powerlevel10k' not found`](#oh-my-zsh-theme-powerlevel10kpowerlevel10k-not-found) +- [Question mark in prompt](#question-mark-in-prompt) +- [Icons, glyphs or powerline symbols don't render](#icons-glyphs-or-powerline-symbols-dont-render) +- [Sub-pixel imperfections around powerline symbols](#sub-pixel-imperfections-around-powerline-symbols) +- [Error: character not in range](#error-character-not-in-range) +- [Cursor is in the wrong place](#cursor-is-in-the-wrong-place) +- [Prompt wrapping around in a weird way](#prompt-wrapping-around-in-a-weird-way) +- [Right prompt is in the wrong place](#right-prompt-is-in-the-wrong-place) +- [Configuration wizard runs automatically every time Zsh is started](#configuration-wizard-runs-automatically-every-time-zsh-is-started) +- [Some prompt styles are missing from the configuration wizard](#some-prompt-styles-are-missing-from-the-configuration-wizard) +- [Cannot install the recommended font](#cannot-install-the-recommended-font) +- [Extra or missing spaces in prompt compared to Powerlevel9k](#extra-or-missing-spaces-in-prompt-compared-to-powerlevel9k) + - [Extra space without background on the right side of right prompt](#extra-space-without-background-on-the-right-side-of-right-prompt) + - [Extra or missing spaces around icons](#extra-or-missing-spaces-around-icons) +- [Weird things happen after typing `source ~/.zshrc`](#weird-things-happen-after-typing-source-zshrc) +- [Transient prompt stops working after some time](#transient-prompt-stops-working-after-some-time) +- [Cannot make Powerlevel10k work with my plugin manager](#cannot-make-powerlevel10k-work-with-my-plugin-manager) +- [Directory is difficult to see in prompt when using Rainbow style](#directory-is-difficult-to-see-in-prompt-when-using-rainbow-style) +- [Incorrect foreground color in VSCode Terminal.](#incorrect-foreground-color-in-vscode-terminal) +- [Horrific mess when resizing terminal window](#horrific-mess-when-resizing-terminal-window) +- [Icons cut off in Konsole](#icons-cut-off-in-konsole) +- [Arch Linux logo has a dot in the bottom right corner](#arch-linux-logo-has-a-dot-in-the-bottom-right-corner) +- [Incorrect git status in prompt](#incorrect-git-status-in-prompt) + +### `[oh-my-zsh] theme 'powerlevel10k/powerlevel10k' not found` + +When opening a terminal, or starting zsh manually, you may encounter this error message: + +```text +[oh-my-zsh] theme 'powerlevel10k/powerlevel10k' not found +``` + +1. First, run `typeset -p P9K_VERSION` to check whether Powerlevel10k has been loaded. + - If `typeset -p P9K_VERSION` succeeds and prints something like `typeset P9K_VERSION=1.19.14` + (the version could be different), remove the following line from `~/.zshrc`: + ```zsh + ZSH_THEME="powerlevel10k/powerlevel10k" + ``` + - If `typeset -p P9K_VERSION` fails with the error `typeset: no such variable: P9K_VERSION`, run + the following command: + ```zsh + git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k + ``` +2. Restart Zsh with `exec zsh`. + +### Question mark in prompt + +If it looks like a regular `?`, that's normal. It means you have untracked files in the current Git +repository. Type `git status` to see these files. You can change this symbol or disable the display +of untracked files altogether. Search for `untracked files` in `~/.p10k.zsh`. + +*FAQ*: [What do different symbols in Git status mean?]( + #what-do-different-symbols-in-git-status-mean) + +You can also get a weird-looking question mark in your prompt if your terminal's font is missing +some glyphs. See [icons, glyphs or powerline symbols don't render]( + #icons-glyphs-or-powerline-symbols-dont-render). + +### Icons, glyphs or powerline symbols don't render + +Restart your terminal, [install the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) +and run `p10k configure`. + +### Sub-pixel imperfections around powerline symbols + +![Powerline Prompt Imperfections]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/powerline-imperfections.png) + +There are three imperfections on the screenshot. From left to right: + +1. A thin blue line (a sub-pixel gap) between the content of a prompt segment and the following +powerline connection. +1. Incorrect alignment of a powerline connection and the following prompt segment. The connection +appears shifted to the right. +1. A thin red line below a powerline connection. The connection appears shifted up. + +Zsh themes don't have down-to-pixel control over the terminal content. Everything you see on the +screen is made of monospace characters. A white powerline prompt segment is made of text on white +background followed by U+E0B0 (a right-pointing triangle). + +![Powerline Prompt Imperfections]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/powerline-anatomy.png) + +If Powerlevel10k prompt has imperfections around powerline symbols, you'll see exactly the same +imperfections with all powerline themes (Agnoster, Powerlevel9k, Powerline, etc.) + +There are several things you can try to deal with these imperfections: + +- Try [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). If you are already using + it, switching to another font may help but is unlikely. +- Change terminal font size one point up or down. For example, in iTerm2 powerline prompt looks + perfect at font sizes 11 and 13 but breaks down at 12. +- Enable builtin powerline glyphs in terminal settings if your terminal supports it (iTerm2 does). +- Change font hinting and/or anti-aliasing mode in the terminal settings. +- Shift all text one pixel up/down/left/right if your terminal has an option to do so. +- Try a different terminal. + +A more radical solution is to switch to prompt style without background. Type `p10k configure` and +select *Lean*. This style has a modern lightweight look. As a bonus, it doesn't suffer from +rendering imperfections that afflict powerline-style prompt. + +### Error: character not in range + +Type `echo '\u276F'`. If you get an error saying "zsh: character not in range", your locale +doesn't support UTF-8. You need to fix it. If you are running Zsh over SSH, see +[this](https://github.com/romkatv/powerlevel10k/issues/153#issuecomment-518347833). If you are +running Zsh locally, Google "set UTF-8 locale in *your OS*". + +### Cursor is in the wrong place + +Type `echo '\u276F'`. If you get an error saying "zsh: character not in range", see the +[previous section](#zsh-character-not-in-range). + +If the `echo` command prints `โฏ` but the cursor is still in the wrong place, install +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k) and run +`p10k configure`. + +If this doesn't help, add `unset ZLE_RPROMPT_INDENT` at the bottom of `~/.zshrc`. + +Still having issues? Run the following command to diagnose the problem: + +```zsh +() { + emulate -L zsh + setopt err_return no_unset + local text + print -rl -- 'Select a part of your prompt from the terminal window and paste it below.' '' + read -r '?Prompt: ' text + local -i len=${(m)#text} + local frame="+-${(pl.$len..-.):-}-+" + print -lr -- $frame "| $text |" $frame +} +``` + +#### If the prompt line aligns with the frame + +```text ++------------------------------+ +| romka@adam โœ“ ~/powerlevel10k | ++------------------------------+ +``` + +If the output of the command is aligned for every part of your prompt (left and right), this +indicates a bug in the theme or your config. Use this command to diagnose it: + +```zsh +print -rl -- ${(eq+)PROMPT} ${(eq+)RPROMPT} +``` + +Look for `%{...%}` and backslash escapes in the output. If there are any, they are the likely +culprits. Open an issue if you get stuck. + +#### If the prompt line is longer than the frame + +```text ++-----------------------------+ +| romka@adam โœ“ ~/powerlevel10k | ++-----------------------------+ +``` + +This is usually caused by a terminal bug or misconfiguration that makes it print ambiguous-width +characters as double-width instead of single width. For example, +[this issue](https://github.com/romkatv/powerlevel10k/issues/165). + +#### If the prompt line is shorter than the frame and is mangled + +```text ++------------------------------+ +| romka@adam โœ“~/powerlevel10k | ++------------------------------+ +``` + +Note that this prompt is different from the original as it's missing a space after the check mark. + +This can be caused by a low-level bug in macOS. See +[this issue](https://github.com/romkatv/powerlevel10k/issues/241). + +This can also happen if prompt contains glyphs designated as "wide" in the Unicode standard and your +terminal incorrectly displays them as non-wide. Terminals suffering from this limitation include +Konsole, Hyper and the integrated VSCode Terminal. The solution is to use a different terminal or +remove all wide glyphs from prompt. + +#### If the prompt line is shorter than the frame and is not mangled + +```text ++--------------------------------+ +| romka@adam โœ“ ~/powerlevel10k | ++--------------------------------+ +``` + +This can be caused by misconfigured locale. See +[this issue](https://github.com/romkatv/powerlevel10k/issues/251). + +### Prompt wrapping around in a weird way + +See [cursor is in the wrong place](#cursor-is-in-the-wrong-place). + +### Right prompt is in the wrong place + +See [cursor is in the wrong place](#cursor-is-in-the-wrong-place). + +### Configuration wizard runs automatically every time Zsh is started + +When Powerlevel10k starts, it automatically runs `p10k configure` if no `POWERLEVEL9K_*` +parameters are defined. Based on your prompt style choices, the configuration wizard creates +`~/.p10k.zsh` with a bunch of `POWERLEVEL9K_*` parameters in it and adds a line to `~/.zshrc` to +source this file. The next time you start Zsh, the configuration wizard shouldn't run automatically. +If it does, this means the evaluation of `~/.zshrc` terminates prematurely before it reaches the +line that sources `~/.p10k.zsh`. This most often happens due to syntax errors in `~/.zshrc`. These +errors get hidden by the configuration wizard screen, so you don't notice them. When you exit +configuration wizard, look for error messages. You can also use +`POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true zsh` to start Zsh without automatically running the +configuration wizard. Once you can see the errors, fix `~/.zshrc` to get rid of them. + +### Some prompt styles are missing from the configuration wizard + +If Zsh version is below 5.7.1 or `COLORTERM` environment variable is neither `24bit` nor +`truecolor`, configuration wizard won't offer Pure style with Snazzy color scheme. *Fix*: Install +Zsh >= 5.7.1 and use a terminal with truecolor support. Verify with `print -P '%F{#ff0000}red%f'`. + +If the terminal can display fewer than 256 colors, configuration wizard preselects Lean style with +8 colors. All other styles require at least 256 colors. *Fix*: Use a terminal with 256 color support +and make sure that `TERM` environment variable is set correctly. Verify with +`print $terminfo[colors]`. + +If there is no UTF-8 locale on the system, configuration wizard won't offer prompt styles that use +Unicode characters. *Fix*: Install a UTF-8 locale. Verify with `locale -a`. + +Another case in which configuration wizard may not offer Unicode prompt styles is when the +`MULTIBYTE` shell option is disabled. *Fix*: Enable the `MULTIBYTE` option, or rather don't disable +it (this option is enabled in Zsh by default). Verify with `print -r -- ${options[MULTIBYTE]}`. + +When `MULTIBYTE` is enabled and a UTF-8 locale is available, the first few questions asked by the +configuration wizard assess capabilities of the terminal font. If your answers indicate that some +glyphs don't render correctly, configuration wizard won't offer prompt styles that use them. *Fix*: +Restart your terminal and install +[the recommended font](#meslo-nerd-font-patched-for-powerlevel10k). Verify by running +`p10k configure` and checking that all glyphs render correctly. + +### Cannot install the recommended font + +Once you download [the recommended font](#meslo-nerd-font-patched-for-powerlevel10k), +you can install it just like any other font. Google "how to install fonts on *your OS*". + +### Extra or missing spaces in prompt compared to Powerlevel9k + +tl;dr: Add `ZLE_RPROMPT_INDENT=0` and `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get +the same prompt spacing as in Powerlevel9k. + +When using Powerlevel10k with a Powerlevel9k config, you might get additional spaces in prompt here +and there. These come in two flavors. + +#### Extra space without background on the right side of right prompt + +tl;dr: Add `ZLE_RPROMPT_INDENT=0` to `~/.zshrc` to get rid of that space. + +From [Zsh documentation]( + http://zsh.sourceforge.net/Doc/Release/Parameters.html#index-ZLE_005fRPROMPT_005fINDENT): + +> `ZLE_RPROMPT_INDENT ` +> +> If set, used to give the indentation between the right hand side of the right prompt in the line +> editor as given by `RPS1` or `RPROMPT` and the right hand side of the screen. If not set, the +> value `1` is used. +> +> Typically this will be used to set the value to `0` so that the prompt appears flush with the +> right hand side of the screen. + +Powerlevel10k respects this parameter. If you set `ZLE_RPROMPT_INDENT=1` (or leave it unset, which +is the same thing as setting it to `1`), you'll get an empty space to the right of right prompt. If +you set `ZLE_RPROMPT_INDENT=0`, your prompt will go to the edge of the terminal. This is how it +works in every theme except Powerlevel9k. + +![ZLE_RPROMPT_INDENT: Powerlevel10k vs Powerlevel9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/p9k-vs-p10k-zle-rprompt-indent.png) + +Powerlevel9k issue: [powerlevel9k#1292](https://github.com/Powerlevel9k/powerlevel9k/issues/1292). +It's been fixed in the development branch of Powerlevel9k but the fix hasn't yet made it to +`master`. + +Add `ZLE_RPROMPT_INDENT=0` to `~/.zshrc` to get the same spacing on the right edge of prompt as in +Powerlevel9k. + +*Note:* Several versions of Zsh have bugs that get triggered when you set `ZLE_RPROMPT_INDENT=0`. +Powerlevel10k can work around these bugs when using powerline prompt style. If you notice visual +artifacts in prompt, or wrong cursor position, try removing `ZLE_RPROMPT_INDENT` from `~/.zshrc`. + +#### Extra or missing spaces around icons + +tl;dr: Add `POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get the same spacing around +icons as in Powerlevel9k. + +Spacing around icons in Powerlevel9k is inconsistent. + +![ZLE_RPROMPT_INDENT: Powerlevel10k vs Powerlevel9k]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/p9k-vs-p10k-icon-spacing.png) + +This inconsistency is a constant source of annoyance, so it was fixed in Powerlevel10k. You can add +`POWERLEVEL9K_LEGACY_ICON_SPACING=true` to `~/.zshrc` to get the same spacing around icons as in +Powerlevel9k. + +*Note:* It's not a good idea to define `POWERLEVEL9K_LEGACY_ICON_SPACING` when using +`p10k configure`. + +### Weird things happen after typing `source ~/.zshrc` + +It's almost always a bad idea to run `source ~/.zshrc`, whether you are using Powerlevel10k or not. +This command may result in random errors, misbehaving code and progressive slowdown of Zsh. + +If you've made changes to `~/.zshrc` or to files sourced by it, restart Zsh to apply them. The most +reliable way to do this is to type `exit` and then start a new Zsh session. You can also use +`exec zsh`. While not exactly equivalent to complete Zsh restart, this command is much more reliable +than `source ~/.zshrc`. + +### Transient prompt stops working after some time + +See [weird things happen after typing `source ~/.zshrc`]( + #weird-things-happen-after-typing-source-zshrc). + +### Cannot make Powerlevel10k work with my plugin manager + +If the [installation instructions](#installation) didn't work for you, try disabling your current +theme (so that you end up with no theme) and then installing Powerlevel10k manually. + +1. Disable the current theme in your framework / plugin manager. + +- **oh-my-zsh:** Open `~/.zshrc` and remove the line that sets `ZSH_THEME`. It might look like this: + `ZSH_THEME="powerlevel9k/powerlevel9k"`. +- **zplug:** Open `~/.zshrc` and remove the `zplug` command that refers to your current theme. For + example, if you are currently using Powerlevel9k, look for + `zplug bhilburn/powerlevel9k, use:powerlevel9k.zsh-theme`. +- **prezto:** Open `~/.zpreztorc` and put `zstyle :prezto:module:prompt theme off` in it. Remove + any other command that sets `theme` such as `zstyle :prezto:module:prompt theme powerlevel9k`. +- **antigen:** Open `~/.zshrc` and remove the line that sets `antigen theme`. It might look like + this: `antigen theme powerlevel9k/powerlevel9k`. + +2. Install Powerlevel10k manually. + +```zsh +git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k +echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc +``` + +This method of installation won't make anything slower or otherwise sub-par. + +### Directory is difficult to see in prompt when using Rainbow style + +In Rainbow style the current working directory is shown with bright white text on blue background. +The white is fixed and always looks the same but the appearance of "blue" is defined by your +terminal color palette. If it's very light, it may be difficult to see white text on it. + +There are several ways to fix this. + +- Type `p10k configure` and choose a more readable prompt style. +- [Change terminal color palette](#change-the-color-palette-used-by-your-terminal). Try Tango Dark + or Solarized Dark, or change just the "blue" color. +- [Change directory background and/or foreground color](#set-colors-through-Powerlevel10k-configuration-parameters). + The parameters you are looking for are called `POWERLEVEL9K_DIR_BACKGROUND`, + `POWERLEVEL9K_DIR_FOREGROUND`, `POWERLEVEL9K_DIR_SHORTENED_FOREGROUND`, + `POWERLEVEL9K_DIR_ANCHOR_FOREGROUND` and `POWERLEVEL9K_DIR_ANCHOR_BOLD`. You can find them in + `~/.p10k.zsh`. + +*Related*: [Incorrect foreground color in VSCode Terminal.](#incorrect-foreground-color-in-vscode-terminal) + +### Incorrect foreground color in VSCode Terminal + +By default, VSCode Terminal may arbitrarily replace the foreground color of your choice with a +different color. This behavior can be +[turned off](https://code.visualstudio.com/docs/terminal/appearance#_minimum-contrast-ratio) in +VSCode settings. + +### Horrific mess when resizing terminal window + +When you resize a terminal window horizontally back and forth a few times, you might see this ugly +picture. + +![Powerlevel10k Resizing Mess]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resizing-mess.png) + +tl;dr: This issue arises when a terminal reflows Zsh prompt upon resizing. It isn't specific to +Powerlevel10k. See [mitigation](#mitigation). + +*Note: This section [used to say]( + https://github.com/romkatv/powerlevel10k/blob/dce00cdb5daaa8a519df234a7012ba3257b644d4/README.md#horrific-mess-when-resizing-terminal-window) +that the problem is caused by a bug in Zsh. While it's true that it's possible to avoid the problem +in many circumstances by modifying Zsh, it cannot be completely resolved this way. Thus it's unfair +to pin the blame on Zsh.* + +#### The anatomy of the problem + +The issue is manifested when the vertical distance between the start of the current prompt and the +cursor (henceforth `VD`) changes when the terminal window is resized. + +When a terminal window gets shrunk horizontally, there are two ways for a terminal to handle long +lines that no longer fit: *reflow* or *truncate*. + +Terminal content before shrinking: + +![Terminal Content Before Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-original.png) + +Terminal reflows text when shrinking: + +![Terminal Reflows Text When Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-reflow.png) + +Terminal truncates text when shrinking: + +![Terminal Truncates Text When Shrinking]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-truncate.png) + +Reflowing strategy can change the height of terminal content. If such content happens to be between +the start of the current prompt and the cursor, Zsh will print prompt on the wrong line. Truncation +strategy never changes the height of terminal content, so it doesn't trigger this issue. + +Let's see how the issue plays out in slow motion. We'll start by launching `zsh -f` and pasting +the following code: + +```zsh +function pause() { read -s } +functions -M pause 0 + +reset +print -l {1..3} +setopt prompt_subst +PROMPT=$'${$((pause()))+}left>${(pl.$((COLUMNS-12))..-.)} ' +``` + +When `PROMPT` gets expanded, it calls `pause` to let us observe the state of the terminal. Here's +the initial state: + +![Terminal Resizing Bug 1]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-1.png) + +Zsh keeps track of the cursor position relative to the start of the current prompt. In this case it +knows that the cursor is one line below. When we shrink the terminal window, it looks like this: + +![Terminal Resizing Bug 2]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-2.png) + +At this point the terminal sends `SIGWINCH` to Zsh to notify it about changes in the terminal +dimensions. Note that this signal is sent *after* the content of the terminal has been reflown. + +When Zsh receives `SIGWINCH`, it attempts to erase the current prompt and print it anew. It goes to +the position where it *thinks* the current prompt is -- one line above the cursor (!) -- erases all +terminal content that follows and prints reexpanded prompt there. However, after resizing prompt is +no longer one line above the cursor. It's two lines above! Zsh ends up printing new prompt one line +too low. + +![Terminal Resizing Bug 3]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-bug-3.png) + +In this case we ended up with unwanted junk content because `VD` has *increased*. When you make +terminal window wider, `VD` can also *decrease*, which would result in the new prompt being printed +higher than intended, potentially erasing useful content in the process. + +Here are a few more examples where shrinking terminal window increased `VD`. + +- Simple one-line left prompt with right prompt. No `prompt_subst`. Note that the cursor is below + the prompt line (hit *ESC-ENTER* to get it there). + ![Zsh Prompt That Breaks on Terminal Shrinking 1]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-breakable-1.png) +- Simple one-line left prompt. No `prompt_subst`, no right prompt. Here `VD` is bound to increase + upon terminal shrinking due to the command line wrapping around. + ![Zsh Prompt That Breaks on Terminal Shrinking 2]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/resize-breakable-2.png) + +#### Zsh patch + +[This Zsh patch](https://github.com/romkatv/zsh/tree/fix-winchanged) fixes the issue on some +terminals. The idea behind the patch is to use `sc` (save cursor) terminal capability before +printing prompt and `rc` (restore cursor) to move cursor back to the original position when prompt +needs to be refreshed. + +The patch works only on terminals that reflow saved cursor position together with text when the +terminal window is resized. The patch has no observable effect on terminals that don't reflow text +on resize (both patched and unpatched Zsh behave correctly) and on terminals that reflow text but +not the saved cursor position (both patched and unpatched Zsh redraw prompt at the same incorrect +position). In other words, the patch fixes the resizing issue on some terminals while keeping the +behavior unchanged on others. + +There are two alternative approaches to patching Zsh that may seem to work at first glance but in +fact don't: + +- Instead of `sc`, use `u7` terminal capability to query the current cursor position and then `cup` + to go back to it. This doesn't work because the absolute position of the start of the current + prompt changes when text gets reflown. +- Recompute `VD` based on new terminal dimensions before attempting to refresh prompt. This doesn't + work because Zsh doesn't know whether terminal reflows text or truncates it. If Zsh could somehow + know that the terminal reflows text, this approach still wouldn't work on terminals that + continuously reflow text and rapid-fire `SIGWINCH` when the window is being resized. In such + environment real terminal dimensions go out of sync with what Zsh thinks the dimensions are. + +There is no ETA for the patch making its way into upstream Zsh. See [discussion]( + https://www.zsh.org/mla/workers//2019/msg00561.html). + +#### Mitigation + +There are a few mitigation options for this issue. + +- Use [kitty](https://sw.kovidgoyal.net/kitty/) terminal version >= 0.24.0 and enable terminal-shell + integration in Powerlevel10k by defining `POWERLEVEL9K_TERM_SHELL_INTEGRATION=true` in + `~/.p10k.zsh`. +- Apply [the patch](#zsh-patch) and [rebuild Zsh from source]( + https://github.com/zsh-users/zsh/blob/master/INSTALL). It won't help if you are using Alacritty, + kitty or some other terminal that reflows text on resize but doesn't reflow saved cursor position. + On such terminals the patch will have no visible effect. +- Disable text reflowing on window resize in terminal settings. If your terminal doesn't have this + setting, try a different terminal. +- Avoid long lines between the start of prompt and cursor. + 1. Disable ruler with `POWERLEVEL9K_SHOW_RULER=false`. + 2. Disable prompt connection with `POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' '`. + 3. Disable right frame with `POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX=''`, + `POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX=''` and + `POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX=''`. + 4. Set `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=()`. Right prompt on the last prompt line will cause + resizing issues only when the cursor is below it. This isn't very common, so you might want to + keep some elements in `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS` provided that none of them are + succeeded by `newline`. + +### Icons cut off in Konsole + +When using Konsole with a non-monospace font, icons may be cut off on the right side. Here +"non-monospace" refers to any font with glyphs wider than a single column, or wider than two columns +for glyphs designated as "wide" in the Unicode standard. + +![Icons cut off in Konsole]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/konsole-non-monospace-font.png) + +The last line on the screenshot shows a cut off Arch Linux logo. + +There are several mitigation options for this issue. + +1. Use a different terminal. Konsole is the only terminal that exhibits this behavior. +2. Use a monospace font. +3. Manually add an extra space after the icon that gets cut off. For example, if the content of + `os_icon` prompt segment gets cut off, open `~/.p10k.zsh`, search for + `POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION` and change it as follows: +```zsh +typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT} ' # extra space at the end +``` +4. Use a different icon that is monospace. For example, if Arch Linux logo gets cut off, add + the following parameter to `~/.p10k.zsh`: +```zsh +typeset -g POWERLEVEL9K_LINUX_ARCH_ICON='Arch' # plain "Arch" in place of a logo +``` +5. Disable the display of the icon that gets cut off. For example, if the content of + `os_icon` prompt segment gets cut off, open `~/.p10k.zsh` and remove `os_icon` from + `POWERLEVEL9K_LEFT_PROMPT_ELEMENTS` and `POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS`. + +*Note*: [Non-monospace fonts are not officially supported by Konsole]( + https://bugs.kde.org/show_bug.cgi?id=418553#c5). + +### Arch Linux logo has a dot in the bottom right corner + +![Arch Linux Logo with a dot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/arch-linux-logo-dot.png) + +Some fonts have this incorrect dotted icon in bold typeface. There are two ways to fix this issue. + +1. Use a font with a correct Arch Linux logo in bold typeface. For example, + [the recommended Powerlevel10k font](#meslo-nerd-font-patched-for-powerlevel10k). +2. Display the icon in regular (non-bold) typeface. To do this, open `~/.p10k.zsh`, search for + `POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION` and remove `%B` from its value. +```zsh +typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='${P9K_CONTENT}' # not bold +``` + +### Incorrect git status in prompt + +Powerlevel10k uses [gitstatusd](https://github.com/romkatv/gitstatus) to inspect the state of git +repositories. The project relies on the [libgit2](https://github.com/libgit2/libgit2) library, which +has some gaps in its implementation. Under some conditions, this may result in discrepancies between +the real state of a git repository (reflected by `git status`) and what gets shown in the +Powerlevel10k prompt. + +Most notably, [libgit2 does not support `skipHash`](https://github.com/libgit2/libgit2/issues/6531). +If you see incorrect git status in prompt, run `git config -l` and check whether `skipHash` is +enabled. If it is, consider disabling it. Keep in mind that `skipHash` may be implicitly enabled +when activating certain git features, such as `manyFiles`. diff --git a/src/powerlevel10k/config/p10k-classic.zsh b/src/powerlevel10k/config/p10k-classic.zsh new file mode 100644 index 0000000..d7be672 --- /dev/null +++ b/src/powerlevel10k/config/p10k-classic.zsh @@ -0,0 +1,1737 @@ +# Config for Powerlevel10k with classic powerline 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. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + # 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=( + # =========================[ Line #1 ]========================= + 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) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + 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) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + 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) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # 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/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # =========================[ Line #2 ]========================= + newline # \n + # 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=nerdfont-complete + # 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 + + # 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= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%242Fโ•ญโ”€' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%242Fโ”œโ”€' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%242Fโ•ฐโ”€' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX='%242Fโ”€โ•ฎ' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%242Fโ”€โ”ค' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%242Fโ”€โ•ฏ' + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', 'ยท' or + # 'โ”€'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # 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 + + # Default background color. + typeset -g POWERLEVEL9K_BACKGROUND=238 + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='%246F\uE0B1' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='%246F\uE0B3' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B0' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B2' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # 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= + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=255 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='โญ' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # 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= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ 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-versions + .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='%248Fin ' + + #####################################[ vcs: git status ]###################################### + # Branch icon. Set this parameter to '\UE0A0 ' 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='%248F' # grey 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 + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # โ‡ฃ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}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # โ‡ 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='%248Fon ' + + # 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=true + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='โœ”' + + # 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='โœ”' + + # 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=true + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='โœ˜' + + # 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='โœ˜' + + ###################[ 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=248 + # 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='%248Ftook ' + + #######################[ 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=37 + # 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_CORE_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='โญ' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_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='โญ' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_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 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # 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='โญ' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=33 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_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='โญ' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_FOREGROUND=106 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_FOREGROUND=68 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_FOREGROUND=172 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=66 + # Custom icon. + # typeset -g POWERLEVEL9K_VI_MODE_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='โญ' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=135 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=130 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=172 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_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='%248Fwith ' + + ###[ 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 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # 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='โญ' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_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='โญ' + + ################[ 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='โญ' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when 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|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # 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='%248Fat ' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when 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|cdk|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 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' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name 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_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account 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_AZURE_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=32 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when 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|gsutil' + # 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 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='%248Fin ' + + ###############################[ 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]*|(zt.*)' + # 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_RX_RATE:+%70Fโ‡ฃ$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+%215Fโ‡ก$P9K_IP_TX_RATE }%38F$P9K_IP_IP' + # 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=('%K{232}โ–' '%K{232}โ–‚' '%K{232}โ–ƒ' '%K{232}โ–„' '%K{232}โ–…' '%K{232}โ–†' '%K{232}โ–‡' '%K{232}โ–ˆ') + # 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='%248Fat ' + + # 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#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=off + + # 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#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/src/powerlevel10k/config/p10k-lean-8colors.zsh b/src/powerlevel10k/config/p10k-lean-8colors.zsh new file mode 100644 index 0000000..bf469df --- /dev/null +++ b/src/powerlevel10k/config/p10k-lean-8colors.zsh @@ -0,0 +1,1712 @@ +# Config for Powerlevel10k with 8-color 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. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + 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=( + # =========================[ Line #1 ]========================= + 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) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + 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) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + 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) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # 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/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # =========================[ Line #2 ]========================= + newline # \n + # 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=nerdfont-complete + # 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=true + + # 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=7 + + # 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=7 + # 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=2 + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=1 + # 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=4 + # 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=4 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=4 + # Set to true to display anchor directory segments in bold. + typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=false + # 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-versions + .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=4 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=4 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=4# + # + # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=4 + # + # 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 '\UE0A0 ' 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='%2F' # green foreground + local modified='%3F' # yellow foreground + local untracked='%4F' # blue foreground + local conflicted='%1F' # red foreground + else + # Styling for incomplete and stale Git status. + local meta='%f' # default foreground + local clean='%f' # default foreground + local modified='%f' # default foreground + local untracked='%f' # default foreground + local conflicted='%f' # default 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 + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # โ‡ฃ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}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # โ‡ 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=2 + typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR= + # 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 repository. + 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=2 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=3 + + ##########################[ 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=2 + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='โœ”' + + # 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=2 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='โœ”' + + # 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=1 + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='โœ˜' + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=1 + # 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=1 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='โœ˜' + + ###################[ 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=3 + # 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=1 + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + # 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=6 + + # 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=1 + # 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=6 + # 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=6 + # 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=2 + # 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=4 + # 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=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=4 + # 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=4 + # 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=4 + # 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=6 + # 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=1 + # 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=5 + # 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=6 + # 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=5 + # 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=3 + # 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=2 + # 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=6 + # 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=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=3 + # 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=3 + # 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=3 + # 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=4 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # 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='โญ' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_SHELL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=2 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=1 + # 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=2 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=3 + # 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=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=1 + # 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=4 + # 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=4 + # 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=6 + + # 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='โญ' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=3 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=3 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=7 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=7 + + # 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=6 + # 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=6 + + # 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=6 + # 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=6 + # 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=2 + # 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=2 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # 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=2 + # 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=2 + # 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=6 + # 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=4 + # 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=5 + # 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=5 + # 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=1 + # 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=4 + # 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=6 + # 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=1 + # 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=1 + # 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=4 + # 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=4 + # 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=4 + # 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=6 + # 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='โญ' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=5 + # 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=1 + # 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=3 + # 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 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|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # 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=3 + # 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=5 + # 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=2 + # 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=4 + # 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=4 + # 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 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|cdk|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=2 + # 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=3 + # 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=2 + # 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 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' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name 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_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account 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_AZURE_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when 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|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=4 + + # 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 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=3 + # 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=5 + # 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=3 + # 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=6 + # 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=3 + # 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]*|(zt.*)' + # 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=4 + # 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:+ %2Fโ‡ฃ$P9K_IP_RX_RATE}${P9K_IP_TX_RATE:+ %3Fโ‡ก$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=2 + # 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=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES=('%K{0}โ–' '%K{0}โ–‚' '%K{0}โ–ƒ' '%K{0}โ–„' '%K{0}โ–…' '%K{0}โ–†' '%K{0}โ–‡' '%K{0}โ–ˆ') + # 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=4 + # 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=(4 4 4 4 4) # <-- 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=6 + # 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 green text greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -f 2 -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#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=off + + # 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#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/src/powerlevel10k/config/p10k-lean.zsh b/src/powerlevel10k/config/p10k-lean.zsh new file mode 100644 index 0000000..1595a37 --- /dev/null +++ b/src/powerlevel10k/config/p10k-lean.zsh @@ -0,0 +1,1712 @@ +# 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. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + 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=( + # =========================[ Line #1 ]========================= + 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) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + 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) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + 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) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # 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/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # =========================[ Line #2 ]========================= + newline + # 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=nerdfont-complete + # 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=true + + # 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=240 + + # 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=240 + # 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-versions + .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 '\UE0A0 ' 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 + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # โ‡ฃ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}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # โ‡ 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 repository. + 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='โœ”' + + # 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='โœ”' + + # 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='โœ˜' + + # 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='โœ˜' + + ###################[ 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='โญ' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=178 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_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='โญ' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=72 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_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 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # 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='โญ' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=33 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_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='โญ' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=135 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=130 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=172 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_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 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # 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='โญ' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_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 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|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # 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 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|cdk|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 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' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name 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_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account 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_AZURE_TEST_FOREGROUND=28 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=32 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when 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|gsutil' + # 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 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]*|(zt.*)' + # 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=('%K{232}โ–' '%K{232}โ–‚' '%K{232}โ–ƒ' '%K{232}โ–„' '%K{232}โ–…' '%K{232}โ–†' '%K{232}โ–‡' '%K{232}โ–ˆ') + # 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#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=off + + # 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#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/src/powerlevel10k/config/p10k-pure.zsh b/src/powerlevel10k/config/p10k-pure.zsh new file mode 100644 index 0000000..7a4d244 --- /dev/null +++ b/src/powerlevel10k/config/p10k-pure.zsh @@ -0,0 +1,193 @@ +# Config file for Powerlevel10k with the style of Pure (https://github.com/sindresorhus/pure). +# +# Differences from Pure: +# +# - Git: +# - `@c4d3ec2c` instead of something like `v1.4.0~11` when in detached HEAD state. +# - No automatic `git fetch` (the same as in Pure with `PURE_GIT_PULL=0`). +# +# Apart from the differences listed above, the replication of Pure prompt is exact. This includes +# even the questionable parts. For example, just like in Pure, there is no indication of Git status +# being stale; prompt symbol is the same in command, visual and overwrite vi modes; when prompt +# doesn't fit on one line, it wraps around with no attempt to shorten it. +# +# If you like the general style of Pure but not particularly attached to all its quirks, type +# `p10k configure` and pick "Lean" style. This will give you slick minimalist prompt while taking +# advantage of Powerlevel10k features that aren't present in Pure. + +# 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. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # Prompt colors. + local grey=242 + local red=1 + local yellow=3 + local blue=4 + local magenta=5 + local cyan=6 + local white=7 + + # Left prompt segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + context # user@host + dir # current directory + vcs # git status + command_execution_time # previous command duration + # =========================[ Line #2 ]========================= + newline # \n + virtualenv # python virtual environment + prompt_char # prompt symbol + ) + + # Right prompt segments. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # command_execution_time # previous command duration + # virtualenv # python virtual environment + # context # user@host + # time # current time + # =========================[ Line #2 ]========================= + newline # \n + ) + + # Basic style options that define the overall prompt look. + 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 + typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons + + # Add an empty line before each prompt except the first. This doesn't emulate the bug + # in Pure that makes prompt drift down whenever you use the Alt-C binding from fzf or similar. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Magenta prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=$magenta + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=$red + # 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 is the same as in command mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='โฎ' + # Prompt symbol in overwrite vi mode is the same as in command mode. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false + + # Grey Python Virtual Environment. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=$grey + # Don't show Python version. + typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false + typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= + + # Blue current directory. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=$blue + + # Context format when root: user@host. The first part white, the rest grey. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE="%F{$white}%n%f%F{$grey}@%m%f" + # Context format when not root: user@host. The whole thing grey. + typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE="%F{$grey}%n@%m%f" + # Don't show context unless root or in SSH. + typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION= + + # Show previous command duration only if it's >= 5s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5 + # Don't show fractional seconds. Thus, 7s rather than 7.3s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 + # Duration format: 1d 2h 3m 4s. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' + # Yellow previous command duration. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=$yellow + + # Grey Git prompt. This makes stale prompts indistinguishable from up-to-date ones. + typeset -g POWERLEVEL9K_VCS_FOREGROUND=$grey + + # Disable async loading indicator to make directories that aren't Git repositories + # indistinguishable from large Git repositories without known state. + typeset -g POWERLEVEL9K_VCS_LOADING_TEXT= + + # Don't wait for Git status even for a millisecond, so that prompt always updates + # asynchronously when Git state changes. + typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0 + + # Cyan ahead/behind arrows. + typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=$cyan + # Don't show remote branch, current tag or stashes. + typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind) + # Don't show the branch icon. + typeset -g POWERLEVEL9K_VCS_BRANCH_ICON= + # When in detached HEAD state, show @commit where branch normally goes. + typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@' + # Don't show staged, unstaged, untracked indicators. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON= + # Show '*' when there are staged, unstaged or untracked files. + typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*' + # Show 'โ‡ฃ' if local branch is behind remote. + typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON=':โ‡ฃ' + # Show 'โ‡ก' if local branch is ahead of remote. + typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON=':โ‡ก' + # Don't show the number of commits next to the ahead/behind arrows. + typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1 + # Remove space between 'โ‡ฃ' and 'โ‡ก' and all trailing spaces. + typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${${${P9K_CONTENT/โ‡ฃ* :โ‡ก/โ‡ฃโ‡ก}// }//:/ }' + + # Grey current time. + typeset -g POWERLEVEL9K_TIME_FOREGROUND=$grey + # 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 rather than the end times of + # their preceding commands. + typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false + + # 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=off + + # 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#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/src/powerlevel10k/config/p10k-rainbow.zsh b/src/powerlevel10k/config/p10k-rainbow.zsh new file mode 100644 index 0000000..355ee9b --- /dev/null +++ b/src/powerlevel10k/config/p10k-rainbow.zsh @@ -0,0 +1,1835 @@ +# Config for Powerlevel10k with powerline prompt style with colorful background. +# 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. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # The list of segments shown on the left. Fill it with the most important segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( + # =========================[ Line #1 ]========================= + # os_icon # os identifier + dir # current directory + vcs # git status + # =========================[ Line #2 ]========================= + newline # \n + # 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=( + # =========================[ Line #1 ]========================= + 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) + perlbrew # perl version from perlbrew (https://github.com/gugod/App-perlbrew) + 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) + yazi # yazi shell (https://github.com/sxyazi/yazi) + nnn # nnn shell (https://github.com/jarun/nnn) + lf # lf shell (https://github.com/gokcehan/lf) + 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) + chezmoi_shell # chezmoi shell (https://www.chezmoi.io/) + # vi_mode # vi mode (you don't need this if you've enabled prompt_char) + # 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/) + per_directory_history # Oh My Zsh per-directory-history local/global indicator + # cpu_arch # CPU architecture + # time # current time + # =========================[ Line #2 ]========================= + newline + # 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=nerdfont-complete + # 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 + + # 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= + + # Add an empty line before each prompt. + typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true + + # Connect left prompt lines with these symbols. You'll probably want to use the same color + # as POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND below. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX='%242Fโ•ญโ”€' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX='%242Fโ”œโ”€' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX='%242Fโ•ฐโ”€' + # Connect right prompt lines with these symbols. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX='%242Fโ”€โ•ฎ' + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX='%242Fโ”€โ”ค' + typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX='%242Fโ”€โ•ฏ' + + # Filler between left and right prompt on the first prompt line. You can set it to ' ', 'ยท' or + # 'โ”€'. The last two make it easier to see the alignment between left and right prompt and to + # separate prompt from command output. You might want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false + # for more compact prompt if using this option. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_BACKGROUND= + typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_GAP_BACKGROUND= + if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then + # The color of the filler. You'll probably want to match the color of POWERLEVEL9K_MULTILINE + # ornaments defined above. + typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 + # 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 + + # Separator between same-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR='\uE0B1' + # Separator between same-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR='\uE0B3' + # Separator between different-color segments on the left. + typeset -g POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR='\uE0B0' + # Separator between different-color segments on the right. + typeset -g POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR='\uE0B2' + # To remove a separator between two segments, add "_joined" to the second segment name. + # For example: POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(os_icon context_joined) + + # The right end of left prompt. + typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='\uE0B0' + # The left end of right prompt. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='\uE0B2' + # 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= + # Left prompt terminator for lines without any segments. + typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL= + + #################################[ os_icon: os identifier ]################################## + # OS identifier color. + typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND=232 + typeset -g POWERLEVEL9K_OS_ICON_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='โญ' + + ################################[ prompt_char: prompt symbol ]################################ + # Transparent background. + typeset -g POWERLEVEL9K_PROMPT_CHAR_BACKGROUND= + # 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= + # No surrounding whitespace. + typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_{LEFT,RIGHT}_WHITESPACE= + + ##################################[ dir: current directory ]################################## + # Current directory background color. + typeset -g POWERLEVEL9K_DIR_BACKGROUND=4 + # Default current directory foreground color. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=254 + # 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=250 + # Color of the anchor directory segments. Anchor segments are never shortened. The first + # segment is always an anchor. + typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255 + # 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-versions + .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_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NOT_WRITABLE. + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NOT_WRITABLE_ANCHOR_FOREGROUND=255 + # + # # Styling for WORK_NON_EXISTENT. + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_BACKGROUND=4 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_FOREGROUND=254 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_SHORTENED_FOREGROUND=250 + # typeset -g POWERLEVEL9K_DIR_WORK_NON_EXISTENT_ANCHOR_FOREGROUND=255 + # + # 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='in ' + + #####################################[ vcs: git status ]###################################### + # Version control background colors. + typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=2 + typeset -g POWERLEVEL9K_VCS_CONFLICTED_BACKGROUND=3 + typeset -g POWERLEVEL9K_VCS_LOADING_BACKGROUND=8 + + # Branch icon. Set this parameter to '\UE0A0 ' 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 + + # Styling for different parts of Git status. + local meta='%7F' # white foreground + local clean='%0F' # black foreground + local modified='%0F' # black foreground + local untracked='%0F' # black foreground + local conflicted='%1F' # red foreground + + 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 + + if (( VCS_STATUS_COMMITS_AHEAD || VCS_STATUS_COMMITS_BEHIND )); then + # โ‡ฃ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}" + elif [[ -n $VCS_STATUS_REMOTE_BRANCH ]]; then + # Tip: Uncomment the next line to display '=' if up to date with the remote. + # res+=" ${clean}=" + fi + + # โ‡ 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()))+${my_git_format}}' + # Enable counters for staged, unstaged, etc. + typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 + + # Custom icon. + # typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='โญ' + # Custom prefix. + # typeset -g POWERLEVEL9K_VCS_PREFIX='on ' + + # 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 repository. + typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) + + ##########################[ 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=true + typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='โœ”' + typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_BACKGROUND=0 + + # 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_VISUAL_IDENTIFIER_EXPANSION='โœ”' + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=2 + typeset -g POWERLEVEL9K_STATUS_OK_PIPE_BACKGROUND=0 + + # 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=true + typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='โœ˜' + typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_BACKGROUND=1 + + # Status when the last command was terminated by a signal. + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true + # 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='โœ˜' + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_BACKGROUND=1 + + # 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_VISUAL_IDENTIFIER_EXPANSION='โœ˜' + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=3 + typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_BACKGROUND=1 + + ###################[ command_execution_time: duration of the last command ]################### + # Execution time color. + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=0 + typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_BACKGROUND=3 + # 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 + # 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='took ' + + #######################[ background_jobs: presence of background jobs ]####################### + # Background jobs color. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=6 + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_BACKGROUND=0 + # Don't show the number of background jobs. + typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false + # Custom icon. + # typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #######################[ direnv: direnv status (https://direnv.net/) ]######################## + # Direnv color. + typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=3 + typeset -g POWERLEVEL9K_DIRENV_BACKGROUND=0 + # 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 these parameters for ${TOOL} with POWERLEVEL9K_ASDF_${TOOL}_FOREGROUND and + # POWERLEVEL9K_ASDF_${TOOL}_BACKGROUND. + typeset -g POWERLEVEL9K_ASDF_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_BACKGROUND=7 + + # 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=0 + typeset -g POWERLEVEL9K_ASDF_RUBY_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PYTHON_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_GOLANG_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_NODEJS_BACKGROUND=2 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_RUST_BACKGROUND=208 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_BACKGROUND=5 + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_ASDF_DOTNET_CORE_SHOW_ON_UPGLOB='*.foo|*.bar' + + # Flutter version from asdf. + typeset -g POWERLEVEL9K_ASDF_FLUTTER_FOREGROUND=0 + typeset -g POWERLEVEL9K_ASDF_FLUTTER_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_LUA_BACKGROUND=4 + # 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=1 + typeset -g POWERLEVEL9K_ASDF_JAVA_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PERL_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_ERLANG_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_ELIXIR_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_POSTGRES_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_PHP_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_HASKELL_BACKGROUND=3 + # 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=0 + typeset -g POWERLEVEL9K_ASDF_JULIA_BACKGROUND=2 + # 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=7 + typeset -g POWERLEVEL9K_NORDVPN_BACKGROUND=4 + # 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=3 + typeset -g POWERLEVEL9K_RANGER_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ####################[ yazi: yazi shell (https://github.com/sxyazi/yazi) ]##################### + # Yazi shell color. + typeset -g POWERLEVEL9K_YAZI_FOREGROUND=3 + typeset -g POWERLEVEL9K_YAZI_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_YAZI_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### + # Nnn shell color. + typeset -g POWERLEVEL9K_NNN_FOREGROUND=0 + typeset -g POWERLEVEL9K_NNN_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ######################[ lf: lf shell (https://github.com/gokcehan/lf) ]####################### + # lf shell color. + typeset -g POWERLEVEL9K_LF_FOREGROUND=0 + typeset -g POWERLEVEL9K_LF_BACKGROUND=6 + # Custom icon. + # typeset -g POWERLEVEL9K_LF_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################[ xplr: xplr shell (https://github.com/sayanarijit/xplr) ]################## + # xplr shell color. + typeset -g POWERLEVEL9K_XPLR_FOREGROUND=0 + typeset -g POWERLEVEL9K_XPLR_BACKGROUND=6 + # 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=0 + typeset -g POWERLEVEL9K_VIM_SHELL_BACKGROUND=2 + # 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=3 + typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4 + + # Display the icon of nix_shell if PATH contains a subdirectory of /nix/store. + # typeset -g POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH=false + + # 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='โญ' + + ##################[ chezmoi_shell: chezmoi shell (https://www.chezmoi.io/) ]################## + # chezmoi shell color. + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_FOREGROUND=0 + typeset -g POWERLEVEL9K_CHEZMOI_SHELL_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_CHEZMOI_SHELL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################################[ disk_usage: disk usage ]################################## + # Colors for different levels of disk usage. + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_BACKGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_BACKGROUND=3 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=7 + typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_BACKGROUND=1 + # 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='โญ' + + ###########[ vi_mode: vi mode (you don't need this if you've enabled prompt_char) ]########### + # Foreground color. + typeset -g POWERLEVEL9K_VI_MODE_FOREGROUND=0 + # Text and color for normal (a.k.a. command) vi mode. + typeset -g POWERLEVEL9K_VI_COMMAND_MODE_STRING=NORMAL + typeset -g POWERLEVEL9K_VI_MODE_NORMAL_BACKGROUND=2 + # Text and color for visual vi mode. + typeset -g POWERLEVEL9K_VI_VISUAL_MODE_STRING=VISUAL + typeset -g POWERLEVEL9K_VI_MODE_VISUAL_BACKGROUND=4 + # Text and color for overtype (a.k.a. overwrite and replace) vi mode. + typeset -g POWERLEVEL9K_VI_OVERWRITE_MODE_STRING=OVERTYPE + typeset -g POWERLEVEL9K_VI_MODE_OVERWRITE_BACKGROUND=3 + # Text and color for insert vi mode. + typeset -g POWERLEVEL9K_VI_INSERT_MODE_STRING= + typeset -g POWERLEVEL9K_VI_MODE_INSERT_FOREGROUND=8 + # Custom icon. + # typeset -g POWERLEVEL9K_VI_MODE_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ######################################[ ram: free RAM ]####################################### + # RAM color. + typeset -g POWERLEVEL9K_RAM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RAM_BACKGROUND=3 + # Custom icon. + # typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #####################################[ swap: used swap ]###################################### + # Swap color. + typeset -g POWERLEVEL9K_SWAP_FOREGROUND=0 + typeset -g POWERLEVEL9K_SWAP_BACKGROUND=3 + # 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=0 + typeset -g POWERLEVEL9K_LOAD_NORMAL_BACKGROUND=2 + # Load color when load is between 50% and 70%. + typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_WARNING_BACKGROUND=3 + # Load color when load is over 70%. + typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_LOAD_CRITICAL_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_TODO_BACKGROUND=8 + # 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=255 + typeset -g POWERLEVEL9K_TIMEWARRIOR_BACKGROUND=8 + + # 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=0 + typeset -g POWERLEVEL9K_TASKWARRIOR_BACKGROUND=6 + + # 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='โญ' + + ######[ per_directory_history: Oh My Zsh per-directory-history local/global indicator ]####### + # Color when using local/global history. + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_BACKGROUND=5 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_FOREGROUND=0 + typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_BACKGROUND=3 + + # Tip: Uncomment the next two lines to hide "local"/"global" text and leave just the icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_CONTENT_EXPANSION='' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_CONTENT_EXPANSION='' + + # Custom icon. + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_LOCAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_PER_DIRECTORY_HISTORY_GLOBAL_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ################################[ cpu_arch: CPU architecture ]################################ + # CPU architecture color. + typeset -g POWERLEVEL9K_CPU_ARCH_FOREGROUND=0 + typeset -g POWERLEVEL9K_CPU_ARCH_BACKGROUND=3 + + # Hide the segment when on a specific CPU architecture. + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_CONTENT_EXPANSION= + # typeset -g POWERLEVEL9K_CPU_ARCH_X86_64_VISUAL_IDENTIFIER_EXPANSION= + + # Custom icon. + # typeset -g POWERLEVEL9K_CPU_ARCH_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##################################[ context: user@hostname ]################################## + # Context color when running with privileges. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=1 + typeset -g POWERLEVEL9K_CONTEXT_ROOT_BACKGROUND=0 + # Context color in SSH without privileges. + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_BACKGROUND=0 + # Default context color (no privileges, no SSH). + typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=3 + typeset -g POWERLEVEL9K_CONTEXT_BACKGROUND=0 + + # Context format when running with privileges: user@hostname. + typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%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='with ' + + ###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### + # Python virtual environment color. + typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_VIRTUALENV_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_ANACONDA_BACKGROUND=4 + + # 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=0 + typeset -g POWERLEVEL9K_PYENV_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_GOENV_BACKGROUND=4 + # 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=2 + typeset -g POWERLEVEL9K_NODENV_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_NVM_BACKGROUND=5 + # If set to false, hide node version if it's the same as default: + # $(nvm version current) == $(nvm version default). + typeset -g POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW=false + # If set to false, hide node version if it's equal to "system". + typeset -g POWERLEVEL9K_NVM_SHOW_SYSTEM=true + # 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=2 + typeset -g POWERLEVEL9K_NODEENV_BACKGROUND=0 + # 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=7 + typeset -g POWERLEVEL9K_NODE_VERSION_BACKGROUND=2 + # 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=255 + typeset -g POWERLEVEL9K_GO_VERSION_BACKGROUND=2 + # 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=0 + typeset -g POWERLEVEL9K_RUST_VERSION_BACKGROUND=208 + # 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=7 + typeset -g POWERLEVEL9K_DOTNET_VERSION_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_PHP_VERSION_BACKGROUND=5 + # 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=1 + typeset -g POWERLEVEL9K_LARAVEL_VERSION_BACKGROUND=7 + # Custom icon. + # typeset -g POWERLEVEL9K_LARAVEL_VERSION_VISUAL_IDENTIFIER_EXPANSION='โญ' + + #############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## + # Rbenv color. + typeset -g POWERLEVEL9K_RBENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_RBENV_BACKGROUND=1 + # 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='โญ' + + ####################[ java_version: java version (https://www.java.com/) ]#################### + # Java version color. + typeset -g POWERLEVEL9K_JAVA_VERSION_FOREGROUND=1 + typeset -g POWERLEVEL9K_JAVA_VERSION_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_PACKAGE_BACKGROUND=6 + + # 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='โญ' + + #######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## + # Rvm color. + typeset -g POWERLEVEL9K_RVM_FOREGROUND=0 + typeset -g POWERLEVEL9K_RVM_BACKGROUND=240 + # 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=0 + typeset -g POWERLEVEL9K_FVM_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_LUAENV_BACKGROUND=4 + # 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=1 + typeset -g POWERLEVEL9K_JENV_BACKGROUND=7 + # 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=0 + typeset -g POWERLEVEL9K_PLENV_BACKGROUND=4 + # 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='โญ' + + ###########[ perlbrew: perl version from perlbrew (https://github.com/gugod/App-perlbrew) ]############ + # Perlbrew color. + typeset -g POWERLEVEL9K_PERLBREW_FOREGROUND=67 + # Show perlbrew version only when in a perl project subdirectory. + typeset -g POWERLEVEL9K_PERLBREW_PROJECT_ONLY=true + # Don't show "perl-" at the front. + typeset -g POWERLEVEL9K_PERLBREW_SHOW_PREFIX=false + # Custom icon. + # typeset -g POWERLEVEL9K_PERLBREW_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ############[ phpenv: php version from phpenv (https://github.com/phpenv/phpenv) ]############ + # PHP color. + typeset -g POWERLEVEL9K_PHPENV_FOREGROUND=0 + typeset -g POWERLEVEL9K_PHPENV_BACKGROUND=5 + # 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=0 + typeset -g POWERLEVEL9K_SCALAENV_BACKGROUND=1 + # 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=0 + typeset -g POWERLEVEL9K_HASKELL_STACK_BACKGROUND=3 + + # 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='โญ' + + ################[ 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=2 + # typeset -g POWERLEVEL9K_TERRAFORM_TEST_BACKGROUND=0 + # 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=4 + typeset -g POWERLEVEL9K_TERRAFORM_OTHER_BACKGROUND=0 + # 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=4 + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_BACKGROUND=0 + # Custom icon. + # typeset -g POWERLEVEL9K_TERRAFORM_VERSION_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ################[ terraform_version: It shows active terraform version (https://www.terraform.io) ]################# + typeset -g POWERLEVEL9K_TERRAFORM_VERSION_SHOW_ON_COMMAND='terraform|tf' + + #############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# + # Show kubecontext only when 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|kubeseal|skaffold|kubent|kubecolor|cmctl|sparkctl' + + # 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=0 + # typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_BACKGROUND=2 + # 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=7 + typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_BACKGROUND=5 + # 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='at ' + + #[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# + # Show aws only when 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|cdk|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=7 + typeset -g POWERLEVEL9K_AWS_DEFAULT_BACKGROUND=1 + # 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=2 + typeset -g POWERLEVEL9K_AWS_EB_ENV_BACKGROUND=0 + # 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 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' + + # POWERLEVEL9K_AZURE_CLASSES is an array with even number of elements. The first element + # in each pair defines a pattern against which the current azure account name 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_AZURE_*CONTENT_EXPANSION parameters, + # you'll see this value in your prompt. The second element of each pair in + # POWERLEVEL9K_AZURE_CLASSES defines the account class. Patterns are tried in order. The + # first match wins. + # + # For example, given these settings: + # + # typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD + # '*test*' TEST + # '*' OTHER) + # + # If your current azure account 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_AZURE_TEST_FOREGROUND=2 + # typeset -g POWERLEVEL9K_AZURE_TEST_BACKGROUND=0 + # typeset -g POWERLEVEL9K_AZURE_TEST_VISUAL_IDENTIFIER_EXPANSION='โญ' + # typeset -g POWERLEVEL9K_AZURE_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' + typeset -g POWERLEVEL9K_AZURE_CLASSES=( + # '*prod*' PROD # These values are examples that are unlikely + # '*test*' TEST # to match your needs. Customize them as needed. + '*' OTHER) + + # Azure account name color. + typeset -g POWERLEVEL9K_AZURE_OTHER_FOREGROUND=7 + typeset -g POWERLEVEL9K_AZURE_OTHER_BACKGROUND=4 + # Custom icon. + # typeset -g POWERLEVEL9K_AZURE_OTHER_VISUAL_IDENTIFIER_EXPANSION='โญ' + + ##########[ gcloud: google cloud account and project (https://cloud.google.com/) ]########### + # Show gcloud only when 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|gsutil' + # Google cloud color. + typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=7 + typeset -g POWERLEVEL9K_GCLOUD_BACKGROUND=4 + + # 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 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=7 + typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_BACKGROUND=4 + # 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=0 + typeset -g POWERLEVEL9K_TOOLBOX_BACKGROUND=3 + # 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='in ' + + ###############################[ public_ip: public IP address ]############################### + # Public IP color. + typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=7 + typeset -g POWERLEVEL9K_PUBLIC_IP_BACKGROUND=0 + # 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=0 + typeset -g POWERLEVEL9K_VPN_IP_BACKGROUND=6 + # 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]*|(zt.*)' + # 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_BACKGROUND=4 + typeset -g POWERLEVEL9K_IP_FOREGROUND=0 + # 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_RX_RATE:+โ‡ฃ$P9K_IP_RX_RATE }${P9K_IP_TX_RATE:+โ‡ก$P9K_IP_TX_RATE }$P9K_IP_IP' + # 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=4 + typeset -g POWERLEVEL9K_PROXY_BACKGROUND=0 + # 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=1 + # Show battery in green when it's charging or fully charged. + typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=2 + # Show battery in yellow when it's discharging. + typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=3 + # Battery pictograms going from low to high level of charge. + typeset -g POWERLEVEL9K_BATTERY_STAGES=('%K{232}โ–' '%K{232}โ–‚' '%K{232}โ–ƒ' '%K{232}โ–„' '%K{232}โ–…' '%K{232}โ–†' '%K{232}โ–‡' '%K{232}โ–ˆ') + # Don't show the remaining time to charge/discharge. + typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false + typeset -g POWERLEVEL9K_BATTERY_BACKGROUND=0 + + #####################################[ wifi: wifi speed ]##################################### + # WiFi color. + typeset -g POWERLEVEL9K_WIFI_FOREGROUND=0 + typeset -g POWERLEVEL9K_WIFI_BACKGROUND=4 + # 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=(0 0 0 0 0) # <-- 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=0 + typeset -g POWERLEVEL9K_TIME_BACKGROUND=7 + # 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='at ' + + # 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 yellow text on red background + # greeting the user. + # + # Type `p10k help segment` for documentation and a more sophisticated example. + function prompt_example() { + p10k segment -b 1 -f 3 -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#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=3 + typeset -g POWERLEVEL9K_EXAMPLE_BACKGROUND=1 + # 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=off + + # 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#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/src/powerlevel10k/config/p10k-robbyrussell.zsh b/src/powerlevel10k/config/p10k-robbyrussell.zsh new file mode 100644 index 0000000..6a204d2 --- /dev/null +++ b/src/powerlevel10k/config/p10k-robbyrussell.zsh @@ -0,0 +1,111 @@ +# Config file for Powerlevel10k with the style of robbyrussell theme from Oh My Zsh. +# +# Original: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#robbyrussell. +# +# Replication of robbyrussell theme is exact. The only observable difference is in +# performance. Powerlevel10k prompt is very fast everywhere, even in large Git repositories. +# +# Usage: Source this file either before or after loading Powerlevel10k. +# +# source ~/powerlevel10k/config/p10k-robbyrussell.zsh +# source ~/powerlevel10k/powerlevel10k.zsh-theme + +# 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. + unset -m '(POWERLEVEL9K_*|DEFAULT_USER)~POWERLEVEL9K_GITSTATUS_DIR' + + # Zsh >= 5.1 is required. + [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]] || return + + # Left prompt segments. + typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(prompt_char dir vcs) + # Right prompt segments. + typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=() + + # Basic style options that define the overall prompt look. + 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 + typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons + + # Green prompt symbol if the last command succeeded. + typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=green + # Red prompt symbol if the last command failed. + typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=red + # Prompt symbol: bold arrow. + typeset -g POWERLEVEL9K_PROMPT_CHAR_CONTENT_EXPANSION='%Bโžœ ' + + # Cyan current directory. + typeset -g POWERLEVEL9K_DIR_FOREGROUND=cyan + # Show only the last segment of the current directory. + typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_last + # Bold directory. + typeset -g POWERLEVEL9K_DIR_CONTENT_EXPANSION='%B$P9K_CONTENT' + + # Git status formatter. + function my_git_formatter() { + emulate -L zsh + if [[ -n $P9K_CONTENT ]]; then + # If P9K_CONTENT is not empty, 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 + else + # Use VCS_STATUS_* parameters to assemble Git status. See reference: + # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. + typeset -g my_git_format="${1+%B%4F}git:(${1+%1F}" + my_git_format+=${${VCS_STATUS_LOCAL_BRANCH:-${VCS_STATUS_COMMIT[1,8]}}//\%/%%} + my_git_format+="${1+%4F})" + if (( VCS_STATUS_NUM_CONFLICTED || VCS_STATUS_NUM_STAGED || + VCS_STATUS_NUM_UNSTAGED || VCS_STATUS_NUM_UNTRACKED )); then + my_git_format+=" ${1+%3F}โœ—" + fi + fi + } + functions -M my_git_formatter 2>/dev/null + + # 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()))+${my_git_format}}' + # Grey Git status when loading. + typeset -g POWERLEVEL9K_VCS_LOADING_FOREGROUND=246 + + # 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#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/src/powerlevel10k/font.md b/src/powerlevel10k/font.md new file mode 100644 index 0000000..7a7cb00 --- /dev/null +++ b/src/powerlevel10k/font.md @@ -0,0 +1,167 @@ +# Recommended font: Meslo Nerd Font patched for Powerlevel10k + +Gorgeous monospace font designed by Jim Lyles for Bitstream, customized by the same for Apple, +further customized by Andrรฉ Berg, and finally patched by yours truly with customized scripts +originally developed by Ryan L McIntyre of Nerd Fonts. Contains all glyphs and symbols that +Powerlevel10k may need. Battle-tested in dozens of different terminals on all major operating +systems. + +*FAQ*: [How was the recommended font created?](README.md#how-was-the-recommended-font-created) + +## Automatic font installation + +If you are using iTerm2 or Termux, `p10k configure` can install the recommended font for you. +Simply answer `Yes` when asked whether to install *Meslo Nerd Font*. + +If you are using a different terminal, proceed with manual font installation. ๐Ÿ‘‡ + +## Manual font installation + +1. Download these four ttf files: + - [MesloLGS NF Regular.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Regular.ttf) + - [MesloLGS NF Bold.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold.ttf) + - [MesloLGS NF Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Italic.ttf) + - [MesloLGS NF Bold Italic.ttf]( + https://github.com/romkatv/powerlevel10k-media/raw/master/MesloLGS%20NF%20Bold%20Italic.ttf) +1. Double-click on each file and click "Install". This will make `MesloLGS NF` font available to all + applications on your system. +1. Configure your terminal to use this font: + - **iTerm2**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. Alternatively, open *iTerm2 โ†’ Preferences โ†’ Profiles โ†’ Text* and set *Font* to + `MesloLGS NF`. + - **Apple Terminal**: Open *Terminal โ†’ Preferences โ†’ Profiles โ†’ Text*, click *Change* under *Font* + and select `MesloLGS NF` family. + - **Hyper**: Open *Hyper โ†’ Edit โ†’ Preferences* and change the value of `fontFamily` under + `module.exports.config` to `MesloLGS NF`. + - **Visual Studio Code**: Open *File โ†’ Preferences โ†’ Settings* (PC) or + *Code โ†’ Preferences โ†’ Settings* (Mac), enter `terminal.integrated.fontFamily` in the search box at + the top of *Settings* tab and set the value below to `MesloLGS NF`. + Consult [this screenshot]( + https://raw.githubusercontent.com/romkatv/powerlevel10k-media/389133fb8c9a2347929a23702ce3039aacc46c3d/visual-studio-code-font-settings.jpg) + to see how it should look like or see [this issue]( + https://github.com/romkatv/powerlevel10k/issues/671) for extra information. + - **GNOME Terminal** (the default Ubuntu terminal): Open *Terminal โ†’ Preferences* and click on the + selected profile under *Profiles*. Check *Custom font* under *Text Appearance* and select + `MesloLGS NF Regular`. + - **Konsole**: Open *Settings โ†’ Edit Current Profile โ†’ Appearance*, click *Select Font* and select + `MesloLGS NF Regular`. + - **Tilix**: Open *Tilix โ†’ Preferences* and click on the selected profile under *Profiles*. Check + *Custom font* under *Text Appearance* and select `MesloLGS NF Regular`. + - **Windows Console Host** (the old thing): Click the icon in the top left corner, then + *Properties โ†’ Font* and set *Font* to `MesloLGS NF`. + - **Windows Terminal** by Microsoft (the new thing): Open *Settings* (Ctrl+,), click + either on the selected profile under *Profiles* or on *Defaults*, click *Appearance* and set + *Font face* to `MesloLGS NF`. + - **Conemu**: Open *Setup โ†’ General โ†’ Fonts* and set *Main console font* to `MesloLGS NF`. + - **IntelliJ** (and other IDEs by Jet Brains): Open *IDE โ†’ Edit โ†’ Preferences โ†’ Editor โ†’ + Color Scheme โ†’ Console Font*. Select *Use console font instead of the default* and set the font + name to `MesloLGS NF`. + - **Termux**: Type `p10k configure` and answer `Yes` when asked whether to install + *Meslo Nerd Font*. + - **Blink**: Type `config`, go to *Appearance*, tap *Add a new font*, tap *Open Gallery*, select + *MesloLGS NF.css*, tap *import* and type `exit` in the home view to reload the font. + - **Tabby** (formerly **Terminus**): Open *Settings โ†’ Appearance* and set *Font* to `MesloLGS NF`. + - **Terminator**: Open *Preferences* using the context menu. Under *Profiles* select the *General* + tab (should be selected already), uncheck *Use the system fixed width font* (if not already) + and select `MesloLGS NF Regular`. Exit the Preferences dialog by clicking *Close*. + - **Guake**: Right Click on an open terminal and open *Preferences*. Under *Appearance* + tab, uncheck *Use the system fixed width font* (if not already) and select `MesloLGS NF Regular`. + Exit the Preferences dialog by clicking *Close*. + - **MobaXterm**: Open *Settings* โ†’ *Configuration* โ†’ *Terminal* โ†’ (under *Terminal look and feel*) + and change *Font* to `MesloLGS NF`. If you have *sessions*, you need to change the font in each + of them through *Settings* โ†’ right click on an individual session โ†’ *Edit Session* โ†’ *Terminal + Settings* โ†’ *Font settings*. + - **Asbrรบ Connection Manager**: Open *Preferences โ†’ Local Shell Options โ†’ Look and Feel*, enable + *Use these personal options* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + To change the font for the remote host connections, go to *Preferences โ†’ Terminal Options โ†’ + Look and Feel* and change *Font:* under *Terminal UI* to `MesloLGS NF Regular`. + - **WSLtty**: Right click on an open terminal and then on *Options*. In the *Text* section, under + *Font*, click *"Select..."* and set Font to `MesloLGS NF Regular`. + - **Yakuake**: Click *โ‰ก* โ†’ *Manage Profiles* โ†’ *New* โ†’ *Appearance*. Click *Choose* next to the + *Font* dropdown, select `MesloLGS NF` and click *OK*. Click *OK* to save the profile. Select the + new profile and click *Set as Default*. + - **Alacritty**: Create or open `~/.config/alacritty/alacritty.toml` and add the following + section to it: + ```toml + [font.normal] + family = "MesloLGS NF" + ``` + - **foot**: Create or open `~/.config/foot/foot.ini` and add the following section to it: + ```ini + font=MesloLGS NF:size=12 + ``` + - **kitty**: Create or open `~/.config/kitty/kitty.conf` and add the following line to it: + ```text + font_family MesloLGS NF + ``` + Restart kitty by closing all sessions and opening a new session. + - **puTTY**: Set *Window* โ†’ *Appearance* โ†’ *Font* to `MesloLGS NF`. Requires puTTY + version >= 0.75. + - **WezTerm**: Create or open `$HOME/.config/wezterm/wezterm.lua` and add the following: + ```lua + local wezterm = require 'wezterm'; + return { + font = wezterm.font("MesloLGS NF"), + } + ``` + If the file already exists, only add the line with the font to the existing return. + Also add the first line if it is not already present. + - **urxvt**: Create or open `~/.Xresources` and add the following line to it: + ```text + URxvt.font: xft:MesloLGS NF:size=11 + ``` + You can adjust the font size to your preference. After changing the config run + `xrdb ~/.Xresources` to reload it. The new config is applied to all new terminals. + - **xterm**: Create or open `~/.Xresources` and add the following line to it: + ```text + xterm*faceName: MesloLGS NF + ``` + After changing the config run `xrdb ~/.Xresources` to reload it. The new config is applied to + all new terminals. + - **Zed**: Open `~/.config/zed/settings.json` and set `terminal.font_family` to `"MesloLGS NF"`. + ```jsonc + { + "terminal": { + "font_family": "MesloLGS NF" + }, + // Other settings. + } + ``` + - Crostini (Linux on Chrome OS): Open + chrome-untrusted://terminal/html/nassh_preferences_editor.html, set *Text font family* to + `'MesloLGS NF'` (including the quotes) and *Custom CSS (inline text)* to the following: + ```css + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Regular.ttf"); + font-weight: normal; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold.ttf"); + font-weight: bold; + font-style: normal; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Italic.ttf"); + font-weight: normal; + font-style: italic; + } + @font-face { + font-family: "MesloLGS NF"; + src: url("https://raw.githubusercontent.com/romkatv/powerlevel10k-media/master/MesloLGS%20NF%20Bold%20Italic.ttf"); + font-weight: bold; + font-style: italic; + } + ``` + **_CAVEAT_**: If you open the normal terminal preferences these settings will be overwritten. +1. Run `p10k configure` to generate a new `~/.p10k.zsh`. The old config may work + incorrectly with the new font. + +_Using a different terminal and know how to set the font for it? Share your knowledge by sending a +PR to expand the list!_ diff --git a/src/powerlevel10k/internal/configure.zsh b/src/powerlevel10k/internal/configure.zsh new file mode 100644 index 0000000..0e13bde --- /dev/null +++ b/src/powerlevel10k/internal/configure.zsh @@ -0,0 +1,84 @@ +# Fewer than 47 columns will probably work. Haven't tried it. +typeset -gr __p9k_wizard_columns=47 +# The bottleneck is ask_tails with nerd fonts. Everything else works fine with 12 lines. +typeset -gr __p9k_wizard_lines=14 +typeset -gr __p9k_zd=${ZDOTDIR:-$HOME} +typeset -gr __p9k_zd_u=${${${(q)__p9k_zd}/#(#b)${(q)HOME}(|\/*)/'~'$match[1]}//\%/%%} +typeset -gr __p9k_zshrc=${${:-$__p9k_zd/.zshrc}:A} +typeset -gr __p9k_zshrc_u=$__p9k_zd_u/.zshrc +typeset -gr __p9k_root_dir_u=${${${(q)__p9k_root_dir}/#(#b)${(q)HOME}(|\/*)/'~'$match[1]}//\%/%%} + +function _p9k_can_configure() { + [[ $1 == '-q' ]] && local -i q=1 || local -i q=0 + function $0_error() { + (( q )) || print -rP "%1F[ERROR]%f %Bp10k configure%b: $1" >&2 + } + typeset -g __p9k_cfg_path_o=${POWERLEVEL9K_CONFIG_FILE:=${ZDOTDIR:-~}/.p10k.zsh} + typeset -g __p9k_cfg_basename=${__p9k_cfg_path_o:t} + typeset -g __p9k_cfg_path=${__p9k_cfg_path_o:A} + typeset -g __p9k_cfg_path_u=${${${(q)__p9k_cfg_path_o}/#(#b)${(q)HOME}(|\/*)/'~'$match[1]}//\%/%%} + { + [[ -e $__p9k_zd ]] || { $0_error "$__p9k_zd_u does not exist"; return 1 } + [[ -d $__p9k_zd ]] || { $0_error "$__p9k_zd_u is not a directory"; return 1 } + [[ ! -d $__p9k_cfg_path ]] || { $0_error "$__p9k_cfg_path_u is a directory"; return 1 } + [[ ! -d $__p9k_zshrc ]] || { $0_error "$__p9k_zshrc_u is a directory"; return 1 } + + local dir=${__p9k_cfg_path:h} + while [[ ! -e $dir && $dir != ${dir:h} ]]; do dir=${dir:h}; done + if [[ ! -d $dir ]]; then + $0_error "cannot create $__p9k_cfg_path_u because ${dir//\%/%%} is not a directory" + return 1 + fi + if [[ ! -w $dir ]]; then + $0_error "cannot create $__p9k_cfg_path_u because ${dir//\%/%%} is readonly" + return 1 + fi + + [[ ! -e $__p9k_cfg_path || -f $__p9k_cfg_path || -h $__p9k_cfg_path ]] || { + $0_error "$__p9k_cfg_path_u is a special file" + return 1 + } + [[ ! -e $__p9k_zshrc || -f $__p9k_zshrc || -h $__p9k_zshrc ]] || { + $0_error "$__p9k_zshrc_u a special file" + return 1 + } + [[ ! -e $__p9k_zshrc || -r $__p9k_zshrc ]] || { + $0_error "$__p9k_zshrc_u is not readable" + return 1 + } + local style + for style in lean lean-8colors classic rainbow pure; do + [[ -r $__p9k_root_dir/config/p10k-$style.zsh ]] || { + $0_error "$__p9k_root_dir_u/config/p10k-$style.zsh is not readable" + return 1 + } + done + + (( LINES >= __p9k_wizard_lines && COLUMNS >= __p9k_wizard_columns )) || { + $0_error "terminal size too small; must be at least $__p9k_wizard_columns columns by $__p9k_wizard_lines lines" + return 1 + } + [[ -t 0 && -t 1 ]] || { + $0_error "no TTY" + return 2 + } + return 0 + } always { + unfunction $0_error + } +} + +function p9k_configure() { + eval "$__p9k_intro" + _p9k_can_configure || return + ( + set -- -f + builtin source $__p9k_root_dir/internal/wizard.zsh + ) + local ret=$? + case $ret in + 0) builtin source $__p9k_cfg_path; _p9k__force_must_init=1;; + 69) return 0;; + *) return $ret;; + esac +} diff --git a/src/powerlevel10k/internal/configure.zsh.zwc b/src/powerlevel10k/internal/configure.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..bd09b83d2e0d7dbb92b870689747306b0ff0cc89 GIT binary patch literal 8488 zcmeHLUu+b|8K2#~^FM53h=Y_gNmoQR3dTO5sRV{rK3~iq;b7uIEBZ&L^LZVga=tz8 z_5$`pg*dDd%WYjlqy}myBrlOrB!Ywl5)YA_JRs$TD3KDG*Sz&1MCn6bP=CMKnZ3R9 z8I`JUW$d|``Q|sj@0;(Not>S=hG;}w>JUHg+bjN))CJJPjXv_jW+9$I^`FSGNq5SL zr3BA5K1#$41wh${Q4%MybkUY;J!tU zBTK#O;C4WM5?SLcv%cQrkk2A(Tw)#EcaXniRdD5Xa2_zXiR)|^t*~*!9wA_c_&g%S z0aPYYVyH~ixpj-*UPQfT-jG;!4%$MLQPNkP$g9Ja?4wWTz&{5r(|$DO95C@aLI5tV zK`EM|7nyuJkadcqZ?N6B<0%Nuw=6?*e~LjIw}_t!HDL8p+2mSciX%%b`ej^EuI{hc zYNPES#}#e`^?JBHupu0WAYQqWfNbZvjK6j!HH)Wdp9pJRhT3(MEW(V9|jXrm|4mV|*`y_Ch zTgz*?&F3(G_--5czXqPJ!gR&fBNwd)9DhlOO=!0R6F=(LcjtXu7@K$#VuXH{Cy+Tl z-sj^q&otzirXRCocqYKL3H#m0kjJ}yF6}q+Fis|82%MhF66IVgkXs<8T+c<~$qRXy z7mu#=+4pc>6|Wl4HFFns1iUb^mUj^A@h9LJJzJSGV>>z^#21)9>zfgH9q$#i*Q_P@ zk-XIRO-n^zLdo?!0P)u-bp90euujHY>tvle^*UHVdyP)`OY1y^2T9K{q2z0Hz97Vl z)CoT_7L2Xb3Eu^JFm{a|_)qJ35Z0sQwR%i!ZY$_J2pwE+9`rED7@kFJ;h!CNCvqLJ zk85ZiZO3h=C3z zrw;D@OuBC+)JGlRz6A7<&jT0NqwITVibJSe!yE~}g$L&jcrT-l?L?+He(AF^N{(lG z8kzDz*u8?X8yU+-n4$JR(3WGNfQODI#EnVHuoigUm_Yk-&j;4({fJn7+4ARsKAthy zcMJJzu9Zdb^xTQ~9Pfc2m<|}W1i((%Puw~FAjOfn9{KK} zp6ifP&pnjf!>~LgX9xNjqXx8hV(p?TZXi%B1D^wP0Bz2f{2I3pK1Nr7v*1vTqfI(_ z(|M=pcp{n1?|mbAIx~|hj3?7>wltM1RtvM4oTEiE<6`!&zkOxo_$!A;`>)I%8hLeS zL7`{HlO=TW@4~4$pLS+^A$I=4`LQ`EljsY7c{lc_x!BSlmu9C@UV8FxyA~H>v3I*- zU0nfFak7w>R8XObVmx3L(hL3ZDj0QYNV23r%A$hnddcxjVXa-d=P|9Lr_!k$+@ub@ zVyXAklE}L0R94LHOge>vTM+pIPRC-oYuAC_4ULYDjQ*i(!tNT(VX0;2LsmxH|TL6&y7L6DlS`|uf)(Ecb%f0b3NNR zlPP-3qTqO?Laq{KQH9R<*p!VxJ891?OfPGwHZT~V1<8_)VfBW{H5TAys}5KNyvDWt zh`=nYfIIOkTe`B0Rl^yj3r@;&Y&F}EIb%*bRVt!~BVw`N%g2F6a#WR}|2-9SkGr`n z{G%NhGC=yHn0L~dRMwuzWSt61dm&{%x?fpKHK{QY6us%JBeG5^Cx5Q&!S>=7iXxp& z6^og)D5NsEG555{W?41vg+Ibao?BT;l zhkj-M@)x$h*wmgUw>P`H+fIxOpLq4?T7cRVZLy4R-l+_}dhKFn#<4xuwTn}!Y<8bL zg->OB%&}9Rjp?GUB3!+#;_;W;t35Vd1MqE-zwmp`wT~Y^xhzV#iBc}@W!#*QJ5R9d zIB#OV(VoC&Q*f7s+{UXnC-vZrl`>f`lM_X^R7kINbnq$f8!Nr67B~om9<82Qy<~iS z$q5&fNlrhR$z?peTq4niM)NW5Brv2)h>Z{Z_fqqRDCM=p|Ljh}CyonY^R>uh1CN5j zy10K81>cA~^4Y?;{XR;CGZLuR!+FBEIv2u~*TH=P`L`k5I(m&AFyUkcXIiM&(Q6*Z zTYWZ!TgN{0JIstnR5cHC9s4YV%DOGuJAvcp=^mWK=!?kbC~#beOrlMHF#)q>D@wK( zg)!fQ5?CgC5I6PR}Dqa9Bf z)>|kwxA7@t7-uY^oIn<4`4VjjT}u#aC_4bP!tpn3^f|yohs3R*jyTlfOx)g7#Q`?g z#odPj>Q;PaqCU>b19uagaS=TO`xvjDw}sda8OO@`A~vn~<@_gTUi!fS+{a zZot~6%~qlgH)NW-;hhk-lGo+N*M#P7>{8t2I^2+H?nc-E|4M&YN?yzT9BhnO7_&`? zMjpux`Y=l&P}m1nL;yr*N95X&UkdWXO+E zA8cs`XVb^{k|7pcdTx>rGR8Kt0=bH9(^6$FQQ8Z6Fc-xet>snM67AnBI~8v<#M_MZ zq*(o3T${ney@Ttmm9I`F%=;|*TEMpv?*^_T*%w7Qk9-yROXMFgckGXhncO3==hMbE zlziS=ptsilEoJbjb=3A*#l{xe5ne}V2783MmT153^KJmPmbcZa@NUGurPonwqCW4l z^f9g_26n^dMevFzLQ_HEt99&h^Ny zhwvq@B{ryc(3V?xw(dYyb1lJVQoi%xGnt;oFUGbGqNL7lpToF&1AWj* zJ@kuy5Aj-p{0b)``+#G=!s+*i#K9&%ReudvAD*AwNz}hFd2%NazHri?C&?#w67nYL X$(@9}L8)8' + VCS_TAG_ICON '' + VCS_BOOKMARK_ICON '^' + VCS_COMMIT_ICON '@' + VCS_BRANCH_ICON '' + VCS_REMOTE_BRANCH_ICON ':' + VCS_LOADING_ICON '' + VCS_GIT_ICON '' + VCS_GIT_GITHUB_ICON '' + VCS_GIT_BITBUCKET_ICON '' + VCS_GIT_GITLAB_ICON '' + VCS_GIT_AZURE_ICON '' + VCS_GIT_ARCHLINUX_ICON '' + VCS_GIT_CODEBERG_ICON '' + VCS_GIT_DEBIAN_ICON '' + VCS_GIT_FREEBSD_ICON '' + VCS_GIT_FREEDESKTOP_ICON '' + VCS_GIT_GNOME_ICON '' + VCS_GIT_GNU_ICON '' + VCS_GIT_KDE_ICON '' + VCS_GIT_LINUX_ICON '' + VCS_GIT_GITEA_ICON '' + VCS_GIT_SOURCEHUT_ICON '' + VCS_HG_ICON '' + VCS_SVN_ICON '' + RUST_ICON 'rust' + PYTHON_ICON 'py' + CHEZMOI_ICON 'chezmoi' + SWIFT_ICON 'swift' + GO_ICON 'go' + GOLANG_ICON 'go' + PUBLIC_IP_ICON 'ip' + LOCK_ICON '!w' + NORDVPN_ICON 'nordvpn' + EXECUTION_TIME_ICON '' + SSH_ICON 'ssh' + VPN_ICON 'vpn' + KUBERNETES_ICON 'kube' + DROPBOX_ICON 'dropbox' + DATE_ICON '' + TIME_ICON '' + JAVA_ICON 'java' + LARAVEL_ICON '' + RANGER_ICON 'ranger' + YAZI_ICON 'yazi' + MIDNIGHT_COMMANDER_ICON 'mc' + VIM_ICON 'vim' + TERRAFORM_ICON 'tf' + PROXY_ICON 'proxy' + DOTNET_ICON '.net' + DOTNET_CORE_ICON '.net' + AZURE_ICON 'az' + DIRENV_ICON 'direnv' + FLUTTER_ICON 'flutter' + GCLOUD_ICON 'gcloud' + LUA_ICON 'lua' + PERL_ICON 'perl' + NNN_ICON 'nnn' + LF_ICON 'lf' + XPLR_ICON 'xplr' + TIMEWARRIOR_ICON 'tw' + TASKWARRIOR_ICON 'task' + NIX_SHELL_ICON 'nix' + WIFI_ICON 'wifi' + ERLANG_ICON 'erlang' + ELIXIR_ICON 'elixir' + POSTGRES_ICON 'postgres' + PHP_ICON 'php' + HASKELL_ICON 'hs' + PACKAGE_ICON 'pkg' + JULIA_ICON 'jl' + SCALA_ICON 'scala' + TOOLBOX_ICON 'toolbox' + ARCH_ICON 'arch' + HISTORY_ICON 'hist' + ) + ;; + *) + # Powerline-Patched Font required! + # See https://github.com/Lokaltog/powerline-fonts + icons=( + RULER_CHAR '\u2500' # โ”€ + LEFT_SEGMENT_SEPARATOR '\uE0B0' # ๎‚ฐ + RIGHT_SEGMENT_SEPARATOR '\uE0B2' # ๎‚ฒ + LEFT_SEGMENT_END_SEPARATOR ' ' # Whitespace + LEFT_SUBSEGMENT_SEPARATOR '\uE0B1' # ๎‚ฑ + RIGHT_SUBSEGMENT_SEPARATOR '\uE0B3' # ๎‚ณ + CARRIAGE_RETURN_ICON '\u21B5' # โ†ต + ROOT_ICON '\u26A1' # โšก + SUDO_ICON '' + RUBY_ICON 'Ruby' + AWS_ICON 'AWS' + AWS_EB_ICON '\U1F331'$q # ๐ŸŒฑ + BACKGROUND_JOBS_ICON '\u2699' # โš™ + TEST_ICON '' + TODO_ICON '\u2206' # โˆ† + BATTERY_ICON '\U1F50B' # ๐Ÿ”‹ + DISK_ICON 'hdd' + OK_ICON '\u2714' # โœ” + FAIL_ICON '\u2718' # โœ˜ + SYMFONY_ICON 'SF' + NODE_ICON 'Node' + NODEJS_ICON 'Node' + MULTILINE_FIRST_PROMPT_PREFIX '\u256D\U2500' # โ•ญโ”€ + MULTILINE_NEWLINE_PROMPT_PREFIX '\u251C\U2500' # โ”œโ”€ + MULTILINE_LAST_PROMPT_PREFIX '\u2570\U2500 ' # โ•ฐโ”€ + APPLE_ICON 'OSX' + WINDOWS_ICON 'WIN' + FREEBSD_ICON 'BSD' + ANDROID_ICON 'And' + LINUX_ICON 'Lx' + LINUX_ARCH_ICON 'Arc' + LINUX_DEBIAN_ICON 'Deb' + LINUX_RASPBIAN_ICON 'RPi' + LINUX_UBUNTU_ICON 'Ubu' + LINUX_KALI_ICON 'Kal' + LINUX_CENTOS_ICON 'Cen' + LINUX_COREOS_ICON 'Cor' + LINUX_ELEMENTARY_ICON 'Elm' + LINUX_MINT_ICON 'LMi' + LINUX_FEDORA_ICON 'Fed' + LINUX_GENTOO_ICON 'Gen' + LINUX_MAGEIA_ICON 'Mag' + LINUX_NIXOS_ICON 'Nix' + LINUX_MANJARO_ICON 'Man' + LINUX_DEVUAN_ICON 'Dev' + LINUX_ALPINE_ICON 'Alp' + LINUX_AOSC_ICON 'Aos' + LINUX_OPENSUSE_ICON 'OSu' + LINUX_SABAYON_ICON 'Sab' + LINUX_SLACKWARE_ICON 'Sla' + LINUX_VOID_ICON 'Vo' + LINUX_ARTIX_ICON 'Art' + LINUX_RHEL_ICON 'RH' + LINUX_AMZN_ICON 'Amzn' + LINUX_ENDEAVOUROS_ICON 'Edv' + LINUX_ROCKY_ICON 'Roc' + LINUX_GUIX_ICON 'Guix' + LINUX_NEON_ICON 'Neon' + SUNOS_ICON 'Sun' + HOME_ICON '' + HOME_SUB_ICON '' + FOLDER_ICON '' + ETC_ICON '\u2699' # โš™ + NETWORK_ICON 'IP' + LOAD_ICON 'L' + SWAP_ICON 'SWP' + RAM_ICON 'RAM' + SERVER_ICON '' + VCS_UNTRACKED_ICON '?' + VCS_UNSTAGED_ICON '\u25CF' # โ— + VCS_STAGED_ICON '\u271A' # โœš + VCS_STASH_ICON '\u235F' # โŸ + VCS_INCOMING_CHANGES_ICON '\u2193' # โ†“ + VCS_OUTGOING_CHANGES_ICON '\u2191' # โ†‘ + VCS_TAG_ICON '' + VCS_BOOKMARK_ICON '\u263F' # โ˜ฟ + VCS_COMMIT_ICON '' + VCS_BRANCH_ICON '\uE0A0 ' # ๎‚  + VCS_REMOTE_BRANCH_ICON '\u2192' # โ†’ + VCS_LOADING_ICON '' + VCS_GIT_ICON '' + VCS_GIT_GITHUB_ICON '' + VCS_GIT_BITBUCKET_ICON '' + VCS_GIT_GITLAB_ICON '' + VCS_GIT_AZURE_ICON '' + VCS_GIT_ARCHLINUX_ICON '' + VCS_GIT_CODEBERG_ICON '' + VCS_GIT_DEBIAN_ICON '' + VCS_GIT_FREEBSD_ICON '' + VCS_GIT_FREEDESKTOP_ICON '' + VCS_GIT_GNOME_ICON '' + VCS_GIT_GNU_ICON '' + VCS_GIT_KDE_ICON '' + VCS_GIT_LINUX_ICON '' + VCS_GIT_GITEA_ICON '' + VCS_GIT_SOURCEHUT_ICON '' + VCS_HG_ICON '' + VCS_SVN_ICON '' + RUST_ICON 'R' + PYTHON_ICON 'Py' + CHEZMOI_ICON 'Chez' + SWIFT_ICON 'Swift' + GO_ICON 'Go' + GOLANG_ICON 'Go' + PUBLIC_IP_ICON 'IP' + LOCK_ICON '\UE0A2' + NORDVPN_ICON '\UE0A2' + EXECUTION_TIME_ICON '' + SSH_ICON 'ssh' + VPN_ICON 'vpn' + KUBERNETES_ICON '\U2388' # โŽˆ + DROPBOX_ICON 'Dropbox' + DATE_ICON '' + TIME_ICON '' + JAVA_ICON '\U2615' # โ˜•๏ธŽ + LARAVEL_ICON '' + RANGER_ICON '\u2B50' # โญ + YAZI_ICON '\u2B50' # โญ + MIDNIGHT_COMMANDER_ICON 'mc' + VIM_ICON 'vim' + TERRAFORM_ICON 'tf' + PROXY_ICON '\u2194' # โ†” + DOTNET_ICON '.NET' + DOTNET_CORE_ICON '.NET' + AZURE_ICON '\u2601' # โ˜ + DIRENV_ICON '\u25BC' # โ–ผ + FLUTTER_ICON 'F' + GCLOUD_ICON 'G' + LUA_ICON 'lua' + PERL_ICON 'perl' + NNN_ICON 'nnn' + LF_ICON 'lf' + XPLR_ICON 'xplr' + TIMEWARRIOR_ICON 'tw' + TASKWARRIOR_ICON 'task' + NIX_SHELL_ICON 'nix' + WIFI_ICON 'WiFi' + ERLANG_ICON 'erl' + ELIXIR_ICON 'elixir' + POSTGRES_ICON 'postgres' + PHP_ICON 'php' + HASKELL_ICON 'hs' + PACKAGE_ICON 'pkg' + JULIA_ICON 'jl' + SCALA_ICON 'scala' + TOOLBOX_ICON '\u2B22' # โฌข + ARCH_ICON 'arch' + HISTORY_ICON 'hist' + ) + ;; + esac + + # Override the above icon settings with any user-defined variables. + case $POWERLEVEL9K_MODE in + 'flat') + icons[LEFT_SEGMENT_SEPARATOR]='' + icons[RIGHT_SEGMENT_SEPARATOR]='' + icons[LEFT_SUBSEGMENT_SEPARATOR]='|' + icons[RIGHT_SUBSEGMENT_SEPARATOR]='|' + ;; + 'compatible') + icons[LEFT_SEGMENT_SEPARATOR]='\u2B80' # โฎ€ + icons[RIGHT_SEGMENT_SEPARATOR]='\u2B82' # โฎ‚ + icons[VCS_BRANCH_ICON]='@' + ;; + esac + + if [[ $POWERLEVEL9K_ICON_PADDING == none && $POWERLEVEL9K_MODE != ascii ]]; then + icons=("${(@kv)icons%% #}") + icons[LEFT_SEGMENT_END_SEPARATOR]+=' ' + icons[MULTILINE_LAST_PROMPT_PREFIX]+=' ' + icons[VCS_TAG_ICON]+=' ' + icons[VCS_BOOKMARK_ICON]+=' ' + icons[VCS_COMMIT_ICON]+=' ' + icons[VCS_BRANCH_ICON]+=' ' + icons[VCS_REMOTE_BRANCH_ICON]+=' ' + fi +} + +# Sadly, this is a part of public API. Its use is emphatically discouraged. +function print_icon() { + eval "$__p9k_intro" + _p9k_init_icons + local var=POWERLEVEL9K_$1 + if (( $+parameters[$var] )); then + echo -n - ${(P)var} + else + echo -n - $icons[$1] + fi +} + +# Prints a list of configured icons. +# +# * $1 string - If "original", then the original icons are printed, +# otherwise "print_icon" is used, which takes the users +# overrides into account. +function get_icon_names() { + eval "$__p9k_intro" + _p9k_init_icons + local key + for key in ${(@kon)icons}; do + echo -n - "POWERLEVEL9K_$key: " + print -nP "%K{red} %k" + if [[ $1 == original ]]; then + echo -n - $icons[$key] + else + print_icon $key + fi + print -P "%K{red} %k" + done +} diff --git a/src/powerlevel10k/internal/icons.zsh.zwc b/src/powerlevel10k/internal/icons.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..1b98ebe4e82587afb853039f292833597aecbdbd GIT binary patch literal 63544 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 Lv*M&2 print -P "" + >&2 print -P "[%F{1}ERROR%f]: Corrupted powerlevel10k installation." + >&2 print -P "" + if (( ${+functions[antigen]} )); then + >&2 print -P "If using %Bantigen%b, run the following command to fix:" + >&2 print -P "" + >&2 print -P " %F{2}antigen%f reset" + if [[ -d ~/.antigen ]]; then + >&2 print -P "" + >&2 print -P "If it doesn't help, try this:" + >&2 print -P "" + >&2 print -P " %F{2}rm%f -rf %U~/.antigen%u" + fi + else + >&2 print -P "Try resetting cache in your plugin manager or" + >&2 print -P "reinstalling powerlevel10k from scratch." + fi + >&2 print -P "" + return 1 +fi + +if [[ $ZSH_VERSION != (5.<1->*|<6->.*) ]]; then + () { + >&2 echo -E "You are using ZSH version $ZSH_VERSION. The minimum required version for Powerlevel10k is 5.1." + >&2 echo -E "Type 'echo \$ZSH_VERSION' to see your current zsh version." + local def=${SHELL:c:A} + local cur=${${ZSH_ARGZERO#-}:c:A} + local cur_v="$($cur -c 'echo -E $ZSH_VERSION' 2>/dev/null)" + if [[ $cur_v == $ZSH_VERSION && $cur != $def ]]; then + >&2 echo -E "The shell you are currently running is likely $cur." + fi + local other=${${:-zsh}:c} + if [[ -n $other ]] && $other -fc '[[ $ZSH_VERSION == (5.<1->*|<6->.*) ]]' &>/dev/null; then + local other_v="$($other -fc 'echo -E $ZSH_VERSION' 2>/dev/null)" + if [[ -n $other_v && $other_v != $ZSH_VERSION ]]; then + >&2 echo -E "You have $other with version $other_v but this is not what you are using." + if [[ -n $def && $def != ${other:A} ]]; then + >&2 echo -E "To change your user shell, type the following command:" + >&2 echo -E "" + if [[ "$(grep -F $other /etc/shells 2>/dev/null)" != $other ]]; then + >&2 echo -E " echo ${(q-)other} | sudo tee -a /etc/shells" + fi + >&2 echo -E " chsh -s ${(q-)other}" + fi + fi + fi + } + return 1 +fi + +builtin source "${__p9k_root_dir}/internal/configure.zsh" +builtin source "${__p9k_root_dir}/internal/worker.zsh" +builtin source "${__p9k_root_dir}/internal/parser.zsh" +builtin source "${__p9k_root_dir}/internal/icons.zsh" + +# For compatibility with Powerlevel9k. It's not recommended to use mnemonic color +# names in the configuration except for colors 0-7 as these are standard. +typeset -grA __p9k_colors=( + black 000 red 001 green 002 yellow 003 + blue 004 magenta 005 cyan 006 white 007 + grey 008 maroon 009 lime 010 olive 011 + navy 012 fuchsia 013 aqua 014 teal 014 + silver 015 grey0 016 navyblue 017 darkblue 018 + blue3 020 blue1 021 darkgreen 022 deepskyblue4 025 + dodgerblue3 026 dodgerblue2 027 green4 028 springgreen4 029 + turquoise4 030 deepskyblue3 032 dodgerblue1 033 darkcyan 036 + lightseagreen 037 deepskyblue2 038 deepskyblue1 039 green3 040 + springgreen3 041 cyan3 043 darkturquoise 044 turquoise2 045 + green1 046 springgreen2 047 springgreen1 048 mediumspringgreen 049 + cyan2 050 cyan1 051 purple4 055 purple3 056 + blueviolet 057 grey37 059 mediumpurple4 060 slateblue3 062 + royalblue1 063 chartreuse4 064 paleturquoise4 066 steelblue 067 + steelblue3 068 cornflowerblue 069 darkseagreen4 071 cadetblue 073 + skyblue3 074 chartreuse3 076 seagreen3 078 aquamarine3 079 + mediumturquoise 080 steelblue1 081 seagreen2 083 seagreen1 085 + darkslategray2 087 darkred 088 darkmagenta 091 orange4 094 + lightpink4 095 plum4 096 mediumpurple3 098 slateblue1 099 + wheat4 101 grey53 102 lightslategrey 103 mediumpurple 104 + lightslateblue 105 yellow4 106 darkseagreen 108 lightskyblue3 110 + skyblue2 111 chartreuse2 112 palegreen3 114 darkslategray3 116 + skyblue1 117 chartreuse1 118 lightgreen 120 aquamarine1 122 + darkslategray1 123 deeppink4 125 mediumvioletred 126 darkviolet 128 + purple 129 mediumorchid3 133 mediumorchid 134 darkgoldenrod 136 + rosybrown 138 grey63 139 mediumpurple2 140 mediumpurple1 141 + darkkhaki 143 navajowhite3 144 grey69 145 lightsteelblue3 146 + lightsteelblue 147 darkolivegreen3 149 darkseagreen3 150 lightcyan3 152 + lightskyblue1 153 greenyellow 154 darkolivegreen2 155 palegreen1 156 + darkseagreen2 157 paleturquoise1 159 red3 160 deeppink3 162 + magenta3 164 darkorange3 166 indianred 167 hotpink3 168 + hotpink2 169 orchid 170 orange3 172 lightsalmon3 173 + lightpink3 174 pink3 175 plum3 176 violet 177 + gold3 178 lightgoldenrod3 179 tan 180 mistyrose3 181 + thistle3 182 plum2 183 yellow3 184 khaki3 185 + lightyellow3 187 grey84 188 lightsteelblue1 189 yellow2 190 + darkolivegreen1 192 darkseagreen1 193 honeydew2 194 lightcyan1 195 + red1 196 deeppink2 197 deeppink1 199 magenta2 200 + magenta1 201 orangered1 202 indianred1 204 hotpink 206 + mediumorchid1 207 darkorange 208 salmon1 209 lightcoral 210 + palevioletred1 211 orchid2 212 orchid1 213 orange1 214 + sandybrown 215 lightsalmon1 216 lightpink1 217 pink1 218 + plum1 219 gold1 220 lightgoldenrod2 222 navajowhite1 223 + mistyrose1 224 thistle1 225 yellow1 226 lightgoldenrod1 227 + khaki1 228 wheat1 229 cornsilk1 230 grey100 231 + grey3 232 grey7 233 grey11 234 grey15 235 + grey19 236 grey23 237 grey27 238 grey30 239 + grey35 240 grey39 241 grey42 242 grey46 243 + grey50 244 grey54 245 grey58 246 grey62 247 + grey66 248 grey70 249 grey74 250 grey78 251 + grey82 252 grey85 253 grey89 254 grey93 255) + +# For compatibility with Powerlevel9k. +# +# Type `getColorCode background` or `getColorCode foreground` to see the list of predefined colors. +function getColorCode() { + eval "$__p9k_intro" + if (( ARGC == 1 )); then + case $1 in + foreground) + local k + for k in "${(k@)__p9k_colors}"; do + local v=${__p9k_colors[$k]} + print -rP -- "%F{$v}$v - $k%f" + done + return 0 + ;; + background) + local k + for k in "${(k@)__p9k_colors}"; do + local v=${__p9k_colors[$k]} + print -rP -- "%K{$v}$v - $k%k" + done + return 0 + ;; + esac + fi + echo "Usage: getColorCode background|foreground" >&2 + return 1 +} + +# _p9k_declare [default]... +function _p9k_declare() { + local -i set=$+parameters[$2] + (( ARGC > 2 || set )) || return 0 + case $1 in + -b) + if (( set )); then + [[ ${(P)2} == true ]] && typeset -gi _$2=1 || typeset -gi _$2=0 + else + typeset -gi _$2=$3 + fi + ;; + -a) + local -a v=("${(@P)2}") + if (( set )); then + eval "typeset -ga _${(q)2}=(${(@qq)v})"; + else + if [[ $3 != '--' ]]; then + echo "internal error in _p9k_declare " "${(qqq)@}" >&2 + fi + eval "typeset -ga _${(q)2}=(${(@qq)*[4,-1]})" + fi + ;; + -i) + (( set )) && typeset -gi _$2=$2 || typeset -gi _$2=$3 + ;; + -F) + (( set )) && typeset -gF _$2=$2 || typeset -gF _$2=$3 + ;; + -s) + (( set )) && typeset -g _$2=${(P)2} || typeset -g _$2=$3 + ;; + -e) + if (( set )); then + local v=${(P)2} + typeset -g _$2=${(g::)v} + else + typeset -g _$2=${(g::)3} + fi + ;; + *) + echo "internal error in _p9k_declare " "${(qqq)@}" >&2 + esac +} + +function _p9k_read_word() { + local -a stat + zstat -A stat +mtime -- $1 2>/dev/null || stat=(-1) + local cached=$_p9k__read_word_cache[$1] + if [[ $cached == $stat[1]:* ]]; then + _p9k__ret=${cached#*:} + else + local rest + _p9k__ret= + { read _p9k__ret rest <$1 } 2>/dev/null + _p9k__ret=${_p9k__ret%$'\r'} + _p9k__read_word_cache[$1]=$stat[1]:$_p9k__ret + fi + [[ -n $_p9k__ret ]] +} + +function _p9k_fetch_cwd() { + if [[ $PWD == /* && $PWD -ef . ]]; then + _p9k__cwd=$PWD + else + _p9k__cwd=${${${:-.}:a}:-.} + fi + _p9k__cwd_a=${${_p9k__cwd:A}:-.} + + case $_p9k__cwd in + /|.) + _p9k__parent_dirs=() + _p9k__parent_mtimes=() + _p9k__parent_mtimes_i=() + _p9k__parent_mtimes_s= + return + ;; + ~|~/*) + local parent=${${${:-~/..}:a}%/}/ + local parts=(${(s./.)_p9k__cwd#$parent}) + ;; + *) + local parent=/ + local parts=(${(s./.)_p9k__cwd}) + ;; + esac + local MATCH + _p9k__parent_dirs=(${(@)${:-{$#parts..1}}/(#m)*/$parent${(pj./.)parts[1,MATCH]}}) + if ! zstat -A _p9k__parent_mtimes +mtime -- $_p9k__parent_dirs 2>/dev/null; then + _p9k__parent_mtimes=(${(@)parts/*/-1}) + fi + _p9k__parent_mtimes_i=(${(@)${:-{1..$#parts}}/(#m)*/$MATCH:$_p9k__parent_mtimes[MATCH]}) + _p9k__parent_mtimes_s="$_p9k__parent_mtimes_i" +} + +# Usage: _p9k_glob parent_dir_index pattern [glob_qual] +# +# parent_dir_index indexes _p9k__parent_dirs. +# +# Returns the number of matches. +# +# Pattern cannot have slashes. +# +# Example: _p9k_glob 3 '*.csproj' +function _p9k_glob() { + local dir=$_p9k__parent_dirs[$1] + local cached=$_p9k__glob_cache[$dir/$2] + if [[ $cached == $_p9k__parent_mtimes[$1]:* ]]; then + return ${cached##*:} + fi + local -a stat + zstat -A stat +mtime -- $dir 2>/dev/null || stat=(-1) + eval 'local files=($dir/$~2('$3'N:t))' + _p9k__glob_cache[$dir/$2]="$stat[1]:$#files" + return $#files +} + +# Usage: _p9k_upglob pattern [glob_qual] +# +# Returns index within _p9k__parent_dirs or 0 if there is no match. +# +# Search stops before reaching ~/../ or / and never matches in those directories. +# +# Example: _p9k_upglob '*.csproj' +function _p9k_upglob() { + local cached=$_p9k__upsearch_cache[$_p9k__cwd/$1] + if [[ -n $cached ]]; then + if [[ $_p9k__parent_mtimes_s == ${cached% *}(| *) ]]; then + return ${cached##* } + fi + cached=(${(s: :)cached}) + local last_idx=$cached[-1] + cached[-1]=() + local -i i + for i in ${(@)${cached:|_p9k__parent_mtimes_i}%:*}; do + _p9k_glob $i "$@" && continue + _p9k__upsearch_cache[$_p9k__cwd/$1]="${_p9k__parent_mtimes_i[1,i]} $i" + return i + done + if (( i != last_idx )); then + _p9k__upsearch_cache[$_p9k__cwd/$1]="${_p9k__parent_mtimes_i[1,$#cached]} $last_idx" + return last_idx + fi + i=$(($#cached + 1)) + else + local -i i=1 + fi + for ((; i <= $#_p9k__parent_mtimes; ++i)); do + _p9k_glob $i "$@" && continue + _p9k__upsearch_cache[$_p9k__cwd/$1]="${_p9k__parent_mtimes_i[1,i]} $i" + return i + done + _p9k__upsearch_cache[$_p9k__cwd/$1]="$_p9k__parent_mtimes_s 0" + return 0 +} + +# If we execute `print -P $1`, how many characters will be printed on the last line? +# Assumes that `%{%}` and `%G` don't lie. +# +# _p9k_prompt_length '' => 0 +# _p9k_prompt_length 'abc' => 3 +# _p9k_prompt_length $'abc\nxy' => 2 +# _p9k_prompt_length $'\t' => 8 +# _p9k_prompt_length '%F{red}abc' => 3 +# _p9k_prompt_length $'%{a\b%Gb%}' => 1 +function _p9k_prompt_length() { + local -i COLUMNS=1024 + local -i x y=${#1} m + if (( y )); then + while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do + x=y + (( y *= 2 )) + done + while (( y > x + 1 )); do + (( m = x + (y - x) / 2 )) + (( ${${(%):-$1%$m(l.x.y)}[-1]} = m )) + done + fi + typeset -g _p9k__ret=$x +} + +typeset -gr __p9k_byte_suffix=('B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y') + +# 512 => 512B +# 1800 => 1.76K +# 18000 => 17.6K +function _p9k_human_readable_bytes() { + typeset -F n=$1 + local suf + for suf in $__p9k_byte_suffix; do + (( n < 1024 )) && break + (( n /= 1024 )) + done + if (( n >= 100 )); then + printf -v _p9k__ret '%.0f.' $n + elif (( n >= 10 )); then + printf -v _p9k__ret '%.1f' $n + else + printf -v _p9k__ret '%.2f' $n + fi + _p9k__ret=${${_p9k__ret%%0#}%.}$suf +} + +if [[ $ZSH_VERSION == (5.<4->*|<6->.*) ]]; then + function _p9k_print_params() { typeset -p -- "$@" } +else + # Cannot use `typeset -p` unconditionally because of bugs in zsh. + function _p9k_print_params() { + local name + for name; do + case $parameters[$name] in + array*) + print -r -- "$name=(" "${(@q)${(@P)name}}" ")" + ;; + association*) + # Cannot use "${(@q)${(@kvP)name}}" because of bugs in zsh. + local kv=("${(@kvP)name}") + print -r -- "$name=(" "${(@q)kv}" ")" + ;; + *) + print -r -- "$name=${(q)${(P)name}}" + ;; + esac + done + } +fi + +# Determine if the passed segment is used in the prompt +# +# Pass the name of the segment to this function to test for its presence in +# either the LEFT or RIGHT prompt arrays. +# * $1: The segment to be tested. +_p9k_segment_in_use() { + (( $_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(I)$1(|_joined)] || + $_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(I)$1(|_joined)] )) +} + +# Caching allows storing array-to-array associations. It should be used like this: +# +# if ! _p9k_cache_get "$key1" "$key2"; then +# # Compute val1 and val2 and then store them in the cache. +# _p9k_cache_set "$val1" "$val2" +# fi +# # Here ${_p9k__cache_val[1]} and ${_p9k__cache_val[2]} are $val1 and $val2 respectively. +# +# Limitations: +# +# * Calling _p9k_cache_set without arguments clears the cache entry. Subsequent calls to +# _p9k_cache_get for the same key will return an error. +# * There must be no intervening _p9k_cache_get calls between the associated _p9k_cache_get +# and _p9k_cache_set. +_p9k_cache_set() { + # Uncomment to see cache misses. + # echo "caching: ${(@0q)_p9k__cache_key} => (${(q)@})" >&2 + _p9k_cache[$_p9k__cache_key]="${(pj:\0:)*}0" + _p9k__cache_val=("$@") + _p9k__state_dump_scheduled=1 +} + +_p9k_cache_get() { + _p9k__cache_key="${(pj:\0:)*}" + local v=$_p9k_cache[$_p9k__cache_key] + [[ -n $v ]] && _p9k__cache_val=("${(@0)${v[1,-2]}}") +} + +_p9k_cache_ephemeral_set() { + # Uncomment to see cache misses. + # echo "caching: ${(@0q)_p9k__cache_key} => (${(q)@})" >&2 + _p9k__cache_ephemeral[$_p9k__cache_key]="${(pj:\0:)*}0" + _p9k__cache_val=("$@") +} + +_p9k_cache_ephemeral_get() { + _p9k__cache_key="${(pj:\0:)*}" + local v=$_p9k__cache_ephemeral[$_p9k__cache_key] + [[ -n $v ]] && _p9k__cache_val=("${(@0)${v[1,-2]}}") +} + +_p9k_cache_stat_get() { + local -H stat + local label=$1 f + shift + + _p9k__cache_stat_meta= + _p9k__cache_stat_fprint= + + for f; do + if zstat -H stat -- $f 2>/dev/null; then + _p9k__cache_stat_meta+="${(q)f} $stat[inode] $stat[mtime] $stat[size] $stat[mode]; " + fi + done + + if _p9k_cache_get $0 $label meta "$@"; then + if [[ $_p9k__cache_val[1] == $_p9k__cache_stat_meta ]]; then + _p9k__cache_stat_fprint=$_p9k__cache_val[2] + local -a key=($0 $label fprint "$@" "$_p9k__cache_stat_fprint") + _p9k__cache_fprint_key="${(pj:\0:)key}" + shift 2 _p9k__cache_val + return 0 + else + local -a key=($0 $label fprint "$@" "$_p9k__cache_val[2]") + _p9k__cache_ephemeral[${(pj:\0:)key}]="${(pj:\0:)_p9k__cache_val[3,-1]}0" + fi + fi + + if (( $+commands[md5] )); then + _p9k__cache_stat_fprint="$(md5 -- $* 2>&1)" + elif (( $+commands[md5sum] )); then + _p9k__cache_stat_fprint="$(md5sum -b -- $* 2>&1)" + else + return 1 + fi + + local meta_key=$_p9k__cache_key + if _p9k_cache_ephemeral_get $0 $label fprint "$@" "$_p9k__cache_stat_fprint"; then + _p9k__cache_fprint_key=$_p9k__cache_key + _p9k__cache_key=$meta_key + _p9k_cache_set "$_p9k__cache_stat_meta" "$_p9k__cache_stat_fprint" "$_p9k__cache_val[@]" + shift 2 _p9k__cache_val + return 0 + fi + + _p9k__cache_fprint_key=$_p9k__cache_key + _p9k__cache_key=$meta_key + return 1 +} + +_p9k_cache_stat_set() { + _p9k_cache_set "$_p9k__cache_stat_meta" "$_p9k__cache_stat_fprint" "$@" + _p9k__cache_key=$_p9k__cache_fprint_key + _p9k_cache_ephemeral_set "$@" +} + +# _p9k_param prompt_foo_BAR BACKGROUND red +_p9k_param() { + local key="_p9k_param ${(pj:\0:)*}" + _p9k__ret=$_p9k_cache[$key] + if [[ -n $_p9k__ret ]]; then + _p9k__ret[-1,-1]='' + else + if [[ ${1//-/_} == (#b)prompt_([a-z0-9_]#)(*) ]]; then + local var=_POWERLEVEL9K_${${(U)match[1]}//ฤฐ/I}$match[2]_$2 + if (( $+parameters[$var] )); then + _p9k__ret=${(P)var} + else + var=_POWERLEVEL9K_${${(U)match[1]%_}//ฤฐ/I}_$2 + if (( $+parameters[$var] )); then + _p9k__ret=${(P)var} + else + var=_POWERLEVEL9K_$2 + if (( $+parameters[$var] )); then + _p9k__ret=${(P)var} + else + _p9k__ret=$3 + fi + fi + fi + else + local var=_POWERLEVEL9K_$2 + if (( $+parameters[$var] )); then + _p9k__ret=${(P)var} + else + _p9k__ret=$3 + fi + fi + _p9k_cache[$key]=${_p9k__ret}. + fi +} + +# _p9k_get_icon prompt_foo_BAR BAZ_ICON quix +_p9k_get_icon() { + local key="_p9k_get_icon ${(pj:\0:)*}" + _p9k__ret=$_p9k_cache[$key] + if [[ -n $_p9k__ret ]]; then + _p9k__ret[-1,-1]='' + else + if [[ $2 == $'\1'* ]]; then + _p9k__ret=${2[2,-1]} + else + _p9k_param "$1" "$2" ${icons[$2]-$'\1'$3} + if [[ $_p9k__ret == $'\1'* ]]; then + _p9k__ret=${_p9k__ret[2,-1]} + else + _p9k__ret=${(g::)_p9k__ret} + [[ $_p9k__ret != $'\b'? ]] || _p9k__ret="%{$_p9k__ret%}" # penance for past sins + fi + fi + _p9k_cache[$key]=${_p9k__ret}. + fi +} + +_p9k_translate_color() { + if [[ $1 == <-> ]]; then # decimal color code: 255 + _p9k__ret=${(l.3..0.)1} + elif [[ $1 == '#'[[:xdigit:]]## ]]; then # hexadecimal color code: #ffffff + _p9k__ret=${${(L)1}//ฤฑ/i} + else # named color: red + # Strip prifixes if there are any. + _p9k__ret=$__p9k_colors[${${${1#bg-}#fg-}#br}] + fi +} + +# _p9k_color prompt_foo_BAR BACKGROUND red +_p9k_color() { + local key="_p9k_color ${(pj:\0:)*}" + _p9k__ret=$_p9k_cache[$key] + if [[ -n $_p9k__ret ]]; then + _p9k__ret[-1,-1]='' + else + _p9k_param "$@" + _p9k_translate_color $_p9k__ret + _p9k_cache[$key]=${_p9k__ret}. + fi +} + +# _p9k_vcs_style CLEAN REMOTE_BRANCH +_p9k_vcs_style() { + local key="$0 ${(pj:\0:)*}" + _p9k__ret=$_p9k_cache[$key] + if [[ -n $_p9k__ret ]]; then + _p9k__ret[-1,-1]='' + else + local style=%b # TODO: support bold + _p9k_color prompt_vcs_$1 BACKGROUND "${__p9k_vcs_states[$1]}" + _p9k_background $_p9k__ret + style+=$_p9k__ret + + local var=_POWERLEVEL9K_VCS_${1}_${2}FORMAT_FOREGROUND + if (( $+parameters[$var] )); then + _p9k_translate_color "${(P)var}" + else + var=_POWERLEVEL9K_VCS_${2}FORMAT_FOREGROUND + if (( $+parameters[$var] )); then + _p9k_translate_color "${(P)var}" + else + _p9k_color prompt_vcs_$1 FOREGROUND "$_p9k_color1" + fi + fi + + _p9k_foreground $_p9k__ret + _p9k__ret=$style$_p9k__ret + _p9k_cache[$key]=${_p9k__ret}. + fi +} + +_p9k_background() { + [[ -n $1 ]] && _p9k__ret="%K{$1}" || _p9k__ret="%k" +} + +_p9k_foreground() { + # Note: This code used to produce `%1F` instead of `%F{1}` because it's more efficient. + # Unfortunately, this triggers a bug in zsh. Namely, `%1F{2}` gets percent-expanded as if + # it was `%F{2}`. + [[ -n $1 ]] && _p9k__ret="%F{$1}" || _p9k__ret="%f" +} + +_p9k_escape_style() { + [[ $1 == *'}'* ]] && _p9k__ret='${:-"'$1'"}' || _p9k__ret=$1 +} + +_p9k_escape() { + [[ $1 == *["~!#\`\$^&*()\\\"'<>?{}[]"]* ]] && _p9k__ret="\${(Q)\${:-${(qqq)${(q)1}}}}" || _p9k__ret=$1 +} + +# * $1: Name of the function that was originally invoked. +# Necessary, to make the dynamic color-overwrite mechanism work. +# * $2: Background color. +# * $3: Foreground color. +# * $4: An identifying icon. +# * $5: 1 to to perform parameter expansion and process substitution. +# * $6: If not empty but becomes empty after parameter expansion and process substitution, +# the segment isn't rendered. +# * $7: Content. +_p9k_left_prompt_segment() { + if ! _p9k_cache_get "$0" "$1" "$2" "$3" "$4" "$_p9k__segment_index"; then + _p9k_color $1 BACKGROUND $2 + local bg_color=$_p9k__ret + _p9k_background $bg_color + local bg=$_p9k__ret + + _p9k_color $1 FOREGROUND $3 + local fg_color=$_p9k__ret + _p9k_foreground $fg_color + local fg=$_p9k__ret + + local style=%b$bg$fg + local style_=${style//\}/\\\}} + + _p9k_get_icon $1 LEFT_SEGMENT_SEPARATOR + local sep=$_p9k__ret + _p9k_escape $_p9k__ret + local sep_=$_p9k__ret + + _p9k_get_icon $1 LEFT_SUBSEGMENT_SEPARATOR + _p9k_escape $_p9k__ret + local subsep_=$_p9k__ret + + local icon_ + if [[ -n $4 ]]; then + _p9k_get_icon $1 $4 + _p9k_escape $_p9k__ret + icon_=$_p9k__ret + fi + + _p9k_get_icon $1 LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL + local start_sep=$_p9k__ret + [[ -n $start_sep ]] && start_sep="%b%k%F{$bg_color}$start_sep" + + _p9k_get_icon $1 LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL $sep + _p9k_escape $_p9k__ret + local end_sep_=$_p9k__ret + + _p9k_get_icon $1 WHITESPACE_BETWEEN_LEFT_SEGMENTS ' ' + local space=$_p9k__ret + + _p9k_get_icon $1 LEFT_LEFT_WHITESPACE $space + local left_space=$_p9k__ret + [[ $left_space == *%* ]] && left_space+=$style + + _p9k_get_icon $1 LEFT_RIGHT_WHITESPACE $space + _p9k_escape $_p9k__ret + local right_space_=$_p9k__ret + [[ $right_space_ == *%* ]] && right_space_+=$style_ + + local s='<_p9k__s>' ss='<_p9k__ss>' + + local -i non_hermetic=0 + + # Segment separator logic: + # + # if [[ $_p9k__bg == NONE ]]; then + # 1 + # elif (( joined )); then + # 2 + # elif [[ $bg_color == (${_p9k__bg}|${_p9k__bg:-0}) ]]; then + # 3 + # else + # 4 + # fi + + local t=$(($#_p9k_t - __p9k_ksh_arrays)) + _p9k_t+=$start_sep$style$left_space # 1 + _p9k_t+=$style # 2 + if [[ -n $fg_color && $fg_color == $bg_color ]]; then + if [[ $fg_color == $_p9k_color1 ]]; then + _p9k_foreground $_p9k_color2 + else + _p9k_foreground $_p9k_color1 + fi + _p9k_t+=%b$bg$_p9k__ret$ss$style$left_space # 3 + else + _p9k_t+=%b$bg$ss$style$left_space # 3 + fi + _p9k_t+=%b$bg$s$style$left_space # 4 + + local join="_p9k__i>=$_p9k_left_join[$_p9k__segment_index]" + _p9k_param $1 SELF_JOINED false + if [[ $_p9k__ret == false ]]; then + if (( _p9k__segment_index > $_p9k_left_join[$_p9k__segment_index] )); then + join+="&&_p9k__i<$_p9k__segment_index" + else + join= + fi + fi + + local p= + p+="\${_p9k__n::=}" + p+="\${\${\${_p9k__bg:-0}:#NONE}:-\${_p9k__n::=$((t+1))}}" # 1 + if [[ -n $join ]]; then + p+="\${_p9k__n:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 + fi + if (( __p9k_sh_glob )); then + p+="\${_p9k__n:=\${\${(M)\${:-x$bg_color}:#x\$_p9k__bg}:+$((t+3))}}" # 3 + p+="\${_p9k__n:=\${\${(M)\${:-x$bg_color}:#x\$${_p9k__bg:-0}}:+$((t+3))}}" # 3 + else + p+="\${_p9k__n:=\${\${(M)\${:-x$bg_color}:#x(\$_p9k__bg|\${_p9k__bg:-0})}:+$((t+3))}}" # 3 + fi + p+="\${_p9k__n:=$((t+4))}" # 4 + + _p9k_param $1 VISUAL_IDENTIFIER_EXPANSION '${P9K_VISUAL_IDENTIFIER}' + [[ $_p9k__ret == (|*[^\\])'$('* ]] && non_hermetic=1 + local icon_exp_=${_p9k__ret:+\"$_p9k__ret\"} + + _p9k_param $1 CONTENT_EXPANSION '${P9K_CONTENT}' + [[ $_p9k__ret == (|*[^\\])'$('* ]] && non_hermetic=1 + local content_exp_=${_p9k__ret:+\"$_p9k__ret\"} + + if [[ ( $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ) || + ( $content_exp_ != '"${P9K_CONTENT}"' && $content_exp_ == *'$'* ) ]]; then + p+="\${P9K_VISUAL_IDENTIFIER::=$icon_}" + fi + + local -i has_icon=-1 # maybe + + if [[ $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ]]; then + p+='${_p9k__v::='$icon_exp_$style_'}' + else + [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _p9k__ret=$icon_ || _p9k__ret=$icon_exp_ + if [[ -n $_p9k__ret ]]; then + p+="\${_p9k__v::=$_p9k__ret" + [[ $_p9k__ret == *%* ]] && p+=$style_ + p+="}" + has_icon=1 # definitely yes + else + has_icon=0 # definitely no + fi + fi + + p+='${_p9k__c::='$content_exp_'}${_p9k__c::=${_p9k__c//'$'\r''}}' + p+='${_p9k__e::=${${_p9k__'${_p9k__line_index}l${${1#prompt_}%%[A-Z0-9_]#}'+00}:-' + if (( has_icon == -1 )); then + p+='${${(%):-$_p9k__c%1(l.1.0)}[-1]}${${(%):-$_p9k__v%1(l.1.0)}[-1]}}' + else + p+='${${(%):-$_p9k__c%1(l.1.0)}[-1]}'$has_icon'}' + fi + + p+='}}+}' + + p+='${${_p9k__e:#00}:+${${_p9k_t[$_p9k__n]/'$ss'/$_p9k__ss}/'$s'/$_p9k__s}' + + _p9k_param $1 ICON_BEFORE_CONTENT '' + if [[ $_p9k__ret != false ]]; then + _p9k_param $1 PREFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + [[ $_p9k__ret == *%* ]] && local -i need_style=1 || local -i need_style=0 + + if (( has_icon != 0 )); then + _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color + _p9k_foreground $_p9k__ret + _p9k__ret=%b$bg$_p9k__ret + _p9k__ret=${_p9k__ret//\}/\\\}} + if [[ $_p9k__ret != $style_ ]]; then + p+=$_p9k__ret'${_p9k__v}'$style_ + else + (( need_style )) && p+=$style_ + p+='${_p9k__v}' + fi + + _p9k_get_icon $1 LEFT_MIDDLE_WHITESPACE ' ' + if [[ -n $_p9k__ret ]]; then + _p9k_escape $_p9k__ret + [[ _p9k__ret == *%* ]] && _p9k__ret+=$style_ + p+='${${(M)_p9k__e:#11}:+'$_p9k__ret'}' + fi + elif (( need_style )); then + p+=$style_ + fi + + p+='${_p9k__c}'$style_ + else + _p9k_param $1 PREFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + [[ $_p9k__ret == *%* ]] && p+=$style_ + + p+='${_p9k__c}'$style_ + + if (( has_icon != 0 )); then + local -i need_style=0 + _p9k_get_icon $1 LEFT_MIDDLE_WHITESPACE ' ' + if [[ -n $_p9k__ret ]]; then + _p9k_escape $_p9k__ret + [[ $_p9k__ret == *%* ]] && need_style=1 + p+='${${(M)_p9k__e:#11}:+'$_p9k__ret'}' + fi + + _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color + _p9k_foreground $_p9k__ret + _p9k__ret=%b$bg$_p9k__ret + _p9k__ret=${_p9k__ret//\}/\\\}} + [[ $_p9k__ret != $style_ || $need_style == 1 ]] && p+=$_p9k__ret + p+='$_p9k__v' + fi + fi + + _p9k_param $1 SUFFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + [[ $_p9k__ret == *%* && -n $right_space_ ]] && p+=$style_ + p+=$right_space_ + + p+='${${:-' + p+="\${_p9k__s::=%F{$bg_color\}$sep_}\${_p9k__ss::=$subsep_}\${_p9k__sss::=%F{$bg_color\}$end_sep_}" + p+="\${_p9k__i::=$_p9k__segment_index}\${_p9k__bg::=$bg_color}" + p+='}+}' + + p+='}' + + _p9k_param $1 SHOW_ON_UPGLOB '' + _p9k_cache_set "$p" $non_hermetic $_p9k__ret + fi + + if [[ -n $_p9k__cache_val[3] ]]; then + _p9k__has_upglob=1 + _p9k_upglob $_p9k__cache_val[3] && return + fi + + _p9k__non_hermetic_expansion=$_p9k__cache_val[2] + + (( $5 )) && _p9k__ret=\"$7\" || _p9k_escape $7 + if [[ -z $6 ]]; then + _p9k__prompt+="\${\${:-\${P9K_CONTENT::=$_p9k__ret}$_p9k__cache_val[1]" + else + _p9k__prompt+="\${\${:-\"$6\"}:+\${\${:-\${P9K_CONTENT::=$_p9k__ret}$_p9k__cache_val[1]}" + fi +} + +# The same as _p9k_left_prompt_segment above but for the right prompt. +_p9k_right_prompt_segment() { + if ! _p9k_cache_get "$0" "$1" "$2" "$3" "$4" "$_p9k__segment_index"; then + _p9k_color $1 BACKGROUND $2 + local bg_color=$_p9k__ret + _p9k_background $bg_color + local bg=$_p9k__ret + local bg_=${_p9k__ret//\}/\\\}} + + _p9k_color $1 FOREGROUND $3 + local fg_color=$_p9k__ret + _p9k_foreground $fg_color + local fg=$_p9k__ret + + local style=%b$bg$fg + local style_=${style//\}/\\\}} + + _p9k_get_icon $1 RIGHT_SEGMENT_SEPARATOR + local sep=$_p9k__ret + _p9k_escape $_p9k__ret + local sep_=$_p9k__ret + + _p9k_get_icon $1 RIGHT_SUBSEGMENT_SEPARATOR + local subsep=$_p9k__ret + [[ $subsep == *%* ]] && subsep+=$style + + local icon_ + if [[ -n $4 ]]; then + _p9k_get_icon $1 $4 + _p9k_escape $_p9k__ret + icon_=$_p9k__ret + fi + + _p9k_get_icon $1 RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL $sep + local start_sep=$_p9k__ret + [[ -n $start_sep ]] && start_sep="%b%k%F{$bg_color}$start_sep" + + _p9k_get_icon $1 RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL + _p9k_escape $_p9k__ret + local end_sep_=$_p9k__ret + + _p9k_get_icon $1 WHITESPACE_BETWEEN_RIGHT_SEGMENTS ' ' + local space=$_p9k__ret + + _p9k_get_icon $1 RIGHT_LEFT_WHITESPACE $space + local left_space=$_p9k__ret + [[ $left_space == *%* ]] && left_space+=$style + + _p9k_get_icon $1 RIGHT_RIGHT_WHITESPACE $space + _p9k_escape $_p9k__ret + local right_space_=$_p9k__ret + [[ $right_space_ == *%* ]] && right_space_+=$style_ + + local w='<_p9k__w>' s='<_p9k__s>' + + local -i non_hermetic=0 + + # Segment separator logic: + # + # if [[ $_p9k__bg == NONE ]]; then + # 1 + # elif (( joined )); then + # 2 + # elif [[ $_p9k__bg == (${bg_color}|${bg_color:-0}) ]]; then + # 3 + # else + # 4 + # fi + + local t=$(($#_p9k_t - __p9k_ksh_arrays)) + _p9k_t+=$start_sep$style$left_space # 1 + _p9k_t+=$w$style # 2 + _p9k_t+=$w$style$subsep$left_space # 3 + _p9k_t+=$w%F{$bg_color}$sep$style$left_space # 4 + + local join="_p9k__i>=$_p9k_right_join[$_p9k__segment_index]" + _p9k_param $1 SELF_JOINED false + if [[ $_p9k__ret == false ]]; then + if (( _p9k__segment_index > $_p9k_right_join[$_p9k__segment_index] )); then + join+="&&_p9k__i<$_p9k__segment_index" + else + join= + fi + fi + + local p= + p+="\${_p9k__n::=}" + p+="\${\${\${_p9k__bg:-0}:#NONE}:-\${_p9k__n::=$((t+1))}}" # 1 + if [[ -n $join ]]; then + p+="\${_p9k__n:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 + fi + if (( __p9k_sh_glob )); then + p+="\${_p9k__n:=\${\${(M)\${:-x\$_p9k__bg}:#x${(b)bg_color}}:+$((t+3))}}" # 3 + p+="\${_p9k__n:=\${\${(M)\${:-x\$_p9k__bg}:#x${(b)bg_color:-0}}:+$((t+3))}}" # 3 + else + p+="\${_p9k__n:=\${\${(M)\${:-x\$_p9k__bg}:#x(${(b)bg_color}|${(b)bg_color:-0})}:+$((t+3))}}" # 3 + fi + p+="\${_p9k__n:=$((t+4))}" # 4 + + _p9k_param $1 VISUAL_IDENTIFIER_EXPANSION '${P9K_VISUAL_IDENTIFIER}' + [[ $_p9k__ret == (|*[^\\])'$('* ]] && non_hermetic=1 + local icon_exp_=${_p9k__ret:+\"$_p9k__ret\"} + + _p9k_param $1 CONTENT_EXPANSION '${P9K_CONTENT}' + [[ $_p9k__ret == (|*[^\\])'$('* ]] && non_hermetic=1 + local content_exp_=${_p9k__ret:+\"$_p9k__ret\"} + + if [[ ( $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ) || + ( $content_exp_ != '"${P9K_CONTENT}"' && $content_exp_ == *'$'* ) ]]; then + p+="\${P9K_VISUAL_IDENTIFIER::=$icon_}" + fi + + local -i has_icon=-1 # maybe + + if [[ $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ]]; then + p+="\${_p9k__v::=$icon_exp_$style_}" + else + [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _p9k__ret=$icon_ || _p9k__ret=$icon_exp_ + if [[ -n $_p9k__ret ]]; then + p+="\${_p9k__v::=$_p9k__ret" + [[ $_p9k__ret == *%* ]] && p+=$style_ + p+="}" + has_icon=1 # definitely yes + else + has_icon=0 # definitely no + fi + fi + + p+='${_p9k__c::='$content_exp_'}${_p9k__c::=${_p9k__c//'$'\r''}}' + p+='${_p9k__e::=${${_p9k__'${_p9k__line_index}r${${1#prompt_}%%[A-Z0-9_]#}'+00}:-' + if (( has_icon == -1 )); then + p+='${${(%):-$_p9k__c%1(l.1.0)}[-1]}${${(%):-$_p9k__v%1(l.1.0)}[-1]}}' + else + p+='${${(%):-$_p9k__c%1(l.1.0)}[-1]}'$has_icon'}' + fi + + p+='}}+}' + + p+='${${_p9k__e:#00}:+${_p9k_t[$_p9k__n]/'$w'/$_p9k__w}' + + _p9k_param $1 ICON_BEFORE_CONTENT '' + if [[ $_p9k__ret != true ]]; then + _p9k_param $1 PREFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + [[ $_p9k__ret == *%* ]] && p+=$style_ + + p+='${_p9k__c}'$style_ + + if (( has_icon != 0 )); then + local -i need_style=0 + _p9k_get_icon $1 RIGHT_MIDDLE_WHITESPACE ' ' + if [[ -n $_p9k__ret ]]; then + _p9k_escape $_p9k__ret + [[ $_p9k__ret == *%* ]] && need_style=1 + p+='${${(M)_p9k__e:#11}:+'$_p9k__ret'}' + fi + + _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color + _p9k_foreground $_p9k__ret + _p9k__ret=%b$bg$_p9k__ret + _p9k__ret=${_p9k__ret//\}/\\\}} + [[ $_p9k__ret != $style_ || $need_style == 1 ]] && p+=$_p9k__ret + p+='$_p9k__v' + fi + else + _p9k_param $1 PREFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + [[ $_p9k__ret == *%* ]] && local -i need_style=1 || local -i need_style=0 + + if (( has_icon != 0 )); then + _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color + _p9k_foreground $_p9k__ret + _p9k__ret=%b$bg$_p9k__ret + _p9k__ret=${_p9k__ret//\}/\\\}} + if [[ $_p9k__ret != $style_ ]]; then + p+=$_p9k__ret'${_p9k__v}'$style_ + else + (( need_style )) && p+=$style_ + p+='${_p9k__v}' + fi + + _p9k_get_icon $1 RIGHT_MIDDLE_WHITESPACE ' ' + if [[ -n $_p9k__ret ]]; then + _p9k_escape $_p9k__ret + [[ _p9k__ret == *%* ]] && _p9k__ret+=$style_ + p+='${${(M)_p9k__e:#11}:+'$_p9k__ret'}' + fi + elif (( need_style )); then + p+=$style_ + fi + + p+='${_p9k__c}'$style_ + fi + + _p9k_param $1 SUFFIX '' + _p9k__ret=${(g::)_p9k__ret} + _p9k_escape $_p9k__ret + p+=$_p9k__ret + + p+='${${:-' + + if [[ -n $fg_color && $fg_color == $bg_color ]]; then + if [[ $fg_color == $_p9k_color1 ]]; then + _p9k_foreground $_p9k_color2 + else + _p9k_foreground $_p9k_color1 + fi + else + _p9k__ret=$fg + fi + _p9k__ret=${_p9k__ret//\}/\\\}} + p+="\${_p9k__w::=${right_space_:+$style_}$right_space_%b$bg_$_p9k__ret}" + + p+='${_p9k__sss::=' + p+=$style_$right_space_ + [[ $right_space_ == *%* ]] && p+=$style_ + if [[ -n $end_sep_ ]]; then + p+="%k%F{$bg_color\}$end_sep_$style_" + fi + p+='}' + + p+="\${_p9k__i::=$_p9k__segment_index}\${_p9k__bg::=$bg_color}" + + p+='}+}' + p+='}' + + _p9k_param $1 SHOW_ON_UPGLOB '' + _p9k_cache_set "$p" $non_hermetic $_p9k__ret + fi + + if [[ -n $_p9k__cache_val[3] ]]; then + _p9k__has_upglob=1 + _p9k_upglob $_p9k__cache_val[3] && return + fi + + _p9k__non_hermetic_expansion=$_p9k__cache_val[2] + + (( $5 )) && _p9k__ret=\"$7\" || _p9k_escape $7 + if [[ -z $6 ]]; then + _p9k__prompt+="\${\${:-\${P9K_CONTENT::=$_p9k__ret}$_p9k__cache_val[1]" + else + _p9k__prompt+="\${\${:-\"$6\"}:+\${\${:-\${P9K_CONTENT::=$_p9k__ret}$_p9k__cache_val[1]}" + fi +} + +function _p9k_prompt_segment() { "_p9k_${_p9k__prompt_side}_prompt_segment" "$@" } +function p9k_prompt_segment() { p10k segment "$@" } + +function _p9k_python_version() { + case $commands[python] in + "") + return 1 + ;; + ${PYENV_ROOT:-~/.pyenv}/shims/python) + local P9K_PYENV_PYTHON_VERSION _p9k__pyenv_version + local -i _POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=1 _POWERLEVEL9K_PYENV_SHOW_SYSTEM=1 + local _POWERLEVEL9K_PYENV_SOURCES=(shell local global) + if _p9k_pyenv_compute && [[ $P9K_PYENV_PYTHON_VERSION == ([[:digit:].]##)* ]]; then + _p9k__ret=$P9K_PYENV_PYTHON_VERSION + return 0 + fi + ;& # fall through + *) + _p9k_cached_cmd 1 '' python --version || return + [[ $_p9k__ret == (#b)Python\ ([[:digit:].]##)* ]] && _p9k__ret=$match[1] + ;; + esac +} + +################################################################ +# Prompt Segment Definitions +################################################################ + +################################################################ +# Anaconda Environment +prompt_anaconda() { + local msg + if _p9k_python_version; then + P9K_ANACONDA_PYTHON_VERSION=$_p9k__ret + if (( _POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION )); then + msg="${P9K_ANACONDA_PYTHON_VERSION//\%/%%} " + fi + else + unset P9K_ANACONDA_PYTHON_VERSION + fi + local p=${CONDA_PREFIX:-$CONDA_ENV_PATH} + msg+="$_POWERLEVEL9K_ANACONDA_LEFT_DELIMITER${${p:t}//\%/%%}$_POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "$msg" +} + +_p9k_prompt_anaconda_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${CONDA_PREFIX:-$CONDA_ENV_PATH}' +} + +# Populates array `reply` with "$#profile:$profile:$region" where $profile and $region +# come from the AWS config (~/.aws/config). +function _p9k_parse_aws_config() { + local cfg=$1 + typeset -ga reply=() + [[ -f $cfg && -r $cfg ]] || return + + local -a lines + lines=(${(f)"$(<$cfg)"}) || return + + local line profile + local -a match mbegin mend + for line in $lines; do + if [[ $line == [[:space:]]#'[default]'[[:space:]]#(|'#'*) ]]; then + # example: [default] + profile=default + elif [[ $line == (#b)'[profile'[[:space:]]##([^[:space:]]|[^[:space:]]*[^[:space:]])[[:space:]]#']'[[:space:]]#(|'#'*) ]]; then + # example: [profile prod] + profile=${(Q)match[1]} + elif [[ $line == (#b)[[:space:]]#region[[:space:]]#=[[:space:]]#([^[:space:]]|[^[:space:]]*[^[:space:]])[[:space:]]# ]]; then + # example: region = eu-west-1 + if [[ -n $profile ]]; then + reply+=$#profile:$profile:$match[1] + profile= + fi + fi + done +} + +################################################################ +# AWS Profile +prompt_aws() { + typeset -g P9K_AWS_PROFILE="${AWS_VAULT:-${AWSUME_PROFILE:-${AWS_PROFILE:-$AWS_DEFAULT_PROFILE}}}" + local pat class state + for pat class in "${_POWERLEVEL9K_AWS_CLASSES[@]}"; do + if [[ $P9K_AWS_PROFILE == ${~pat} ]]; then + [[ -n $class ]] && state=_${${(U)class}//ฤฐ/I} + break + fi + done + + if [[ -n ${AWS_REGION:-$AWS_DEFAULT_REGION} ]]; then + typeset -g P9K_AWS_REGION=${AWS_REGION:-$AWS_DEFAULT_REGION} + else + local cfg=${AWS_CONFIG_FILE:-~/.aws/config} + if ! _p9k_cache_stat_get $0 $cfg; then + local -a reply + _p9k_parse_aws_config $cfg + _p9k_cache_stat_set $reply + fi + local prefix=$#P9K_AWS_PROFILE:$P9K_AWS_PROFILE: + local kv=$_p9k__cache_val[(r)${(b)prefix}*] + typeset -g P9K_AWS_REGION=${kv#$prefix} + fi + + _p9k_prompt_segment "$0$state" red white 'AWS_ICON' 0 '' "${P9K_AWS_PROFILE//\%/%%}" +} + +_p9k_prompt_aws_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${AWS_VAULT:-${AWSUME_PROFILE:-${AWS_PROFILE:-$AWS_DEFAULT_PROFILE}}}' +} + +################################################################ +# Current Elastic Beanstalk environment +prompt_aws_eb_env() { + _p9k_upglob .elasticbeanstalk -/ && return + local dir=$_p9k__parent_dirs[$?] + + if ! _p9k_cache_stat_get $0 $dir/.elasticbeanstalk/config.yml; then + local env + env="$(command eb list 2>/dev/null)" || env= + env="${${(@M)${(@f)env}:#\* *}#\* }" + _p9k_cache_stat_set "$env" + fi + [[ -n $_p9k__cache_val[1] ]] || return + _p9k_prompt_segment "$0" black green 'AWS_EB_ICON' 0 '' "${_p9k__cache_val[1]//\%/%%}" +} + +_p9k_prompt_aws_eb_env_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[eb]' +} + +################################################################ +# Segment to indicate background jobs with an icon. +prompt_background_jobs() { + local -i len=$#_p9k__prompt _p9k__has_upglob + local msg + if (( _POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE )); then + if (( _POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS )); then + msg='${(%):-%j}' + else + msg='${${(%):-%j}:#1}' + fi + fi + _p9k_prompt_segment $0 "$_p9k_color1" cyan BACKGROUND_JOBS_ICON 1 '${${(%):-%j}:#0}' "$msg" + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +################################################################ +# Segment that indicates usage level of current partition. +prompt_disk_usage() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0_CRITICAL red white DISK_ICON 1 '$_p9k__disk_usage_critical' '$_p9k__disk_usage_pct%%' + _p9k_prompt_segment $0_WARNING yellow $_p9k_color1 DISK_ICON 1 '$_p9k__disk_usage_warning' '$_p9k__disk_usage_pct%%' + if (( ! _POWERLEVEL9K_DISK_USAGE_ONLY_WARNING )); then + _p9k_prompt_segment $0_NORMAL $_p9k_color1 yellow DISK_ICON 1 '$_p9k__disk_usage_normal' '$_p9k__disk_usage_pct%%' + fi + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_disk_usage_init() { + typeset -g _p9k__disk_usage_pct= + typeset -g _p9k__disk_usage_normal= + typeset -g _p9k__disk_usage_warning= + typeset -g _p9k__disk_usage_critical= + _p9k__async_segments_compute+='_p9k_worker_invoke disk_usage "_p9k_prompt_disk_usage_compute ${(q)_p9k__cwd_a}"' +} + +_p9k_prompt_disk_usage_compute() { + (( $+commands[df] )) || return + _p9k_worker_async "_p9k_prompt_disk_usage_async ${(q)1}" _p9k_prompt_disk_usage_sync +} + +_p9k_prompt_disk_usage_async() { + local pct=${${=${(f)"$(df -P $1 2>/dev/null)"}[2]}[5]%%%} + [[ $pct == <0-100> && $pct != $_p9k__disk_usage_pct ]] || return + _p9k__disk_usage_pct=$pct + _p9k__disk_usage_normal= + _p9k__disk_usage_warning= + _p9k__disk_usage_critical= + if (( _p9k__disk_usage_pct >= _POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL )); then + _p9k__disk_usage_critical=1 + elif (( _p9k__disk_usage_pct >= _POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL )); then + _p9k__disk_usage_warning=1 + elif (( ! _POWERLEVEL9K_DISK_USAGE_ONLY_WARNING )); then + _p9k__disk_usage_normal=1 + fi + _p9k_print_params \ + _p9k__disk_usage_pct \ + _p9k__disk_usage_normal \ + _p9k__disk_usage_warning \ + _p9k__disk_usage_critical + echo -E - 'reset=1' +} + +_p9k_prompt_disk_usage_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +function _p9k_read_file() { + _p9k__ret='' + [[ -n $1 ]] && IFS='' read -r _p9k__ret <$1 + [[ -n $_p9k__ret ]] +} + +function _p9k_fvm_old() { + _p9k_upglob fvm @ && return 1 + local fvm=$_p9k__parent_dirs[$?]/fvm + if [[ ${fvm:A} == (#b)*/versions/([^/]##)/bin/flutter ]]; then + _p9k_prompt_segment prompt_fvm blue $_p9k_color1 FLUTTER_ICON 0 '' ${match[1]//\%/%%} + return 0 + fi + return 1 +} + +function _p9k_fvm_new() { + _p9k_upglob .fvm/flutter_sdk @ && return 1 + local sdk=$_p9k__parent_dirs[$?]/.fvm/flutter_sdk + if [[ ${sdk:A} == (#b)*/versions/([^/]##) ]]; then + _p9k_prompt_segment prompt_fvm blue $_p9k_color1 FLUTTER_ICON 0 '' ${match[1]//\%/%%} + return 0 + fi + return 1 +} + +prompt_fvm() { + _p9k_fvm_new || _p9k_fvm_old +} + +_p9k_prompt_fvm_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[fvm]' +} + +################################################################ +# Segment that displays the battery status in levels and colors +prompt_battery() { + [[ $_p9k_os == (Linux|Android) ]] && _p9k_prompt_battery_set_args + (( $#_p9k__battery_args )) && _p9k_prompt_segment "${_p9k__battery_args[@]}" +} + +_p9k_prompt_battery_init() { + typeset -ga _p9k__battery_args=() + if [[ $_p9k_os == OSX && $+commands[pmset] == 1 ]]; then + _p9k__async_segments_compute+='_p9k_worker_invoke battery _p9k_prompt_battery_compute' + return + fi + if [[ $_p9k_os != (Linux|Android) || + -z /sys/class/power_supply/(CMB*|BAT*|*battery)/(energy_full|charge_full|charge_counter)(#qN) ]]; then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi +} + +_p9k_prompt_battery_compute() { + _p9k_worker_async _p9k_prompt_battery_async _p9k_prompt_battery_sync +} + +_p9k_prompt_battery_async() { + local prev="${(pj:\0:)_p9k__battery_args}" + _p9k_prompt_battery_set_args + [[ "${(pj:\0:)_p9k__battery_args}" == $prev ]] && return 1 + _p9k_print_params _p9k__battery_args + echo -E - 'reset=2' +} + +_p9k_prompt_battery_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +_p9k_prompt_battery_set_args() { + _p9k__battery_args=() + + local state remain + local -i bat_percent + + case $_p9k_os in + OSX) + (( $+commands[pmset] )) || return + local raw_data=${${(Af)"$(pmset -g batt 2>/dev/null)"}[2]} + [[ $raw_data == *InternalBattery* ]] || return + remain=${${(s: :)${${(s:; :)raw_data}[3]}}[1]} + [[ $remain == *no* ]] && remain="..." + [[ $raw_data =~ '([0-9]+)%' ]] && bat_percent=$match[1] + + case "${${(s:; :)raw_data}[2]}" in + 'charging'|'finishing charge'|'AC attached') + if (( bat_percent == 100 )); then + state=CHARGED + remain='' + else + state=CHARGING + fi + ;; + 'discharging') + (( bat_percent < _POWERLEVEL9K_BATTERY_LOW_THRESHOLD )) && state=LOW || state=DISCONNECTED + ;; + *) + state=CHARGED + remain='' + ;; + esac + ;; + + Linux|Android) + # See https://sourceforge.net/projects/acpiclient. + local -a bats=( /sys/class/power_supply/(CMB*|BAT*|*battery)/(FN) ) + (( $#bats )) || return + + local -i energy_now energy_full power_now + local -i is_full=1 is_calculating is_charching + local dir + for dir in $bats; do + _p9k_read_file $dir/status(N) && local bat_status=$_p9k__ret || continue + # Skip batteries with "Unknown" status: https://github.com/romkatv/powerlevel10k/pull/2562. + [[ $bat_status == Unknown ]] && continue + local -i pow=0 full=0 + if _p9k_read_file $dir/(energy_full|charge_full|charge_counter)(N); then + (( energy_full += ${full::=_p9k__ret} )) + fi + if _p9k_read_file $dir/(power|current)_now(N) && (( $#_p9k__ret < 9 )); then + (( power_now += ${pow::=$_p9k__ret} )) + fi + if _p9k_read_file $dir/capacity(N); then + (( energy_now += _p9k__ret * full / 100. + 0.5 )) + elif _p9k_read_file $dir/(energy|charge)_now(N); then + (( energy_now += _p9k__ret )) + fi + [[ $bat_status != Full ]] && is_full=0 + [[ $bat_status == Charging ]] && is_charching=1 + [[ $bat_status == (Charging|Discharging) && $pow == 0 ]] && is_calculating=1 + done + + (( energy_full )) || return + + bat_percent=$(( 100. * energy_now / energy_full + 0.5 )) + (( bat_percent > 100 )) && bat_percent=100 + + if (( is_full || (bat_percent == 100 && is_charching) )); then + state=CHARGED + else + if (( is_charching )); then + state=CHARGING + elif (( bat_percent < _POWERLEVEL9K_BATTERY_LOW_THRESHOLD )); then + state=LOW + else + state=DISCONNECTED + fi + + if (( power_now > 0 )); then + (( is_charching )) && local -i e=$((energy_full - energy_now)) || local -i e=energy_now + local -i minutes=$(( 60 * e / power_now )) + (( minutes > 0 )) && remain=$((minutes/60)):${(l#2##0#)$((minutes%60))} + elif (( is_calculating )); then + remain="..." + fi + fi + ;; + + *) + return 0 + ;; + esac + + (( bat_percent >= _POWERLEVEL9K_BATTERY_${state}_HIDE_ABOVE_THRESHOLD )) && return + + local msg="$bat_percent%%" + [[ $_POWERLEVEL9K_BATTERY_VERBOSE == 1 && -n $remain ]] && msg+=" ($remain)" + + local icon=BATTERY_ICON + local var=_POWERLEVEL9K_BATTERY_${state}_STAGES + local -i idx="${#${(@P)var}}" + if (( idx )); then + (( bat_percent < 100 )) && idx=$((bat_percent * idx / 100 + 1)) + icon=$'\1'"${${(@P)var}[idx]}" + fi + + local bg=$_p9k_color1 + local var=_POWERLEVEL9K_BATTERY_${state}_LEVEL_BACKGROUND + local -i idx="${#${(@P)var}}" + if (( idx )); then + (( bat_percent < 100 )) && idx=$((bat_percent * idx / 100 + 1)) + bg="${${(@P)var}[idx]}" + fi + + local fg=$_p9k_battery_states[$state] + local var=_POWERLEVEL9K_BATTERY_${state}_LEVEL_FOREGROUND + local -i idx="${#${(@P)var}}" + if (( idx )); then + (( bat_percent < 100 )) && idx=$((bat_percent * idx / 100 + 1)) + fg="${${(@P)var}[idx]}" + fi + + _p9k__battery_args=(prompt_battery_$state "$bg" "$fg" $icon 0 '' $msg) +} + +################################################################ +# Public IP segment +prompt_public_ip() { + local -i len=$#_p9k__prompt _p9k__has_upglob + local ip='${_p9k__public_ip:-$_POWERLEVEL9K_PUBLIC_IP_NONE}' + if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]]; then + _p9k_prompt_segment "$0" "$_p9k_color1" "$_p9k_color2" PUBLIC_IP_ICON 1 '${_p9k__public_ip_not_vpn:+'$ip'}' $ip + _p9k_prompt_segment "$0" "$_p9k_color1" "$_p9k_color2" VPN_ICON 1 '${_p9k__public_ip_vpn:+'$ip'}' $ip + else + _p9k_prompt_segment "$0" "$_p9k_color1" "$_p9k_color2" PUBLIC_IP_ICON 1 $ip $ip + fi + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_public_ip_init() { + typeset -g _p9k__public_ip= + typeset -gF _p9k__public_ip_next_time=0 + _p9k__async_segments_compute+='_p9k_worker_invoke public_ip _p9k_prompt_public_ip_compute' +} + +_p9k_prompt_public_ip_compute() { + (( EPOCHREALTIME >= _p9k__public_ip_next_time )) || return + _p9k_worker_async _p9k_prompt_public_ip_async _p9k_prompt_public_ip_sync +} + +_p9k_prompt_public_ip_async() { + local ip method + local -F start=EPOCHREALTIME + local -F next='start + 5' + for method in $_POWERLEVEL9K_PUBLIC_IP_METHODS $_POWERLEVEL9K_PUBLIC_IP_METHODS; do + case $method in + dig) + if (( $+commands[dig] )); then + ip="$(dig +tries=1 +short -4 A myip.opendns.com @resolver1.opendns.com 2>/dev/null)" + [[ $ip == ';'* ]] && ip= + if [[ -z $ip ]]; then + ip="$(dig +tries=1 +short -6 AAAA myip.opendns.com @resolver1.opendns.com 2>/dev/null)" + [[ $ip == ';'* ]] && ip= + fi + fi + ;; + curl) + if (( $+commands[curl] )); then + ip="$(curl --max-time 5 -w '\n' "$_POWERLEVEL9K_PUBLIC_IP_HOST" 2>/dev/null)" + fi + ;; + wget) + if (( $+commands[wget] )); then + ip="$(wget -T 5 -qO- "$_POWERLEVEL9K_PUBLIC_IP_HOST" 2>/dev/null)" + fi + ;; + esac + [[ $ip =~ '^[0-9a-f.:]+$' ]] || ip='' + if [[ -n $ip ]]; then + next=$((start + _POWERLEVEL9K_PUBLIC_IP_TIMEOUT)) + break + fi + done + _p9k__public_ip_next_time=$next + _p9k_print_params _p9k__public_ip_next_time + [[ $_p9k__public_ip == $ip ]] && return + _p9k__public_ip=$ip + _p9k_print_params _p9k__public_ip + echo -E - 'reset=1' +} + +_p9k_prompt_public_ip_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +################################################################ +# Context: user@hostname (who am I and where am I) +prompt_context() { + local -i len=$#_p9k__prompt _p9k__has_upglob + + local content + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_CONTEXT == 0 && -n $DEFAULT_USER && $P9K_SSH == 0 ]]; then + local user="${(%):-%n}" + if [[ $user == $DEFAULT_USER ]]; then + content="${user//\%/%%}" + fi + fi + + local state + if (( P9K_SSH )); then + if [[ -n "$SUDO_COMMAND" ]]; then + state="REMOTE_SUDO" + else + state="REMOTE" + fi + elif [[ -n "$SUDO_COMMAND" ]]; then + state="SUDO" + else + state="DEFAULT" + fi + + local cond + for state cond in $state '${${(%):-%#}:#\#}' ROOT '${${(%):-%#}:#\%}'; do + local text=$content + if [[ -z $text ]]; then + local var=_POWERLEVEL9K_CONTEXT_${state}_TEMPLATE + if (( $+parameters[$var] )); then + text=${(P)var} + text=${(g::)text} + else + text=$_POWERLEVEL9K_CONTEXT_TEMPLATE + fi + fi + _p9k_prompt_segment "$0_$state" "$_p9k_color1" yellow '' 0 "$cond" "$text" + done + + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_context() { + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_CONTEXT == 0 && -n $DEFAULT_USER && $P9K_SSH == 0 ]]; then + if [[ ${(%):-%n} == $DEFAULT_USER ]]; then + if (( ! _POWERLEVEL9K_ALWAYS_SHOW_USER )); then + return + fi + fi + fi + prompt_context +} + +_p9k_prompt_context_init() { + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_CONTEXT == 0 && -n $DEFAULT_USER && $P9K_SSH == 0 ]]; then + if [[ ${(%):-%n} == $DEFAULT_USER ]]; then + if (( ! _POWERLEVEL9K_ALWAYS_SHOW_USER )); then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi + fi + fi +} + +################################################################ +# User: user (who am I) +prompt_user() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "${0}_ROOT" "${_p9k_color1}" yellow ROOT_ICON 0 '${${(%):-%#}:#\%}' "$_POWERLEVEL9K_USER_TEMPLATE" + if [[ -n "$SUDO_COMMAND" ]]; then + _p9k_prompt_segment "${0}_SUDO" "${_p9k_color1}" yellow SUDO_ICON 0 '${${(%):-%#}:#\#}' "$_POWERLEVEL9K_USER_TEMPLATE" + else + _p9k_prompt_segment "${0}_DEFAULT" "${_p9k_color1}" yellow USER_ICON 0 '${${(%):-%#}:#\#}' "%n" + fi + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_user() { + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_USER == 0 && "${(%):-%n}" == $DEFAULT_USER ]]; then + return + fi + prompt_user +} + +_p9k_prompt_user_init() { + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_USER == 0 && "${(%):-%n}" == $DEFAULT_USER ]]; then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi +} + +################################################################ +# Host: machine (where am I) +prompt_host() { + local -i len=$#_p9k__prompt _p9k__has_upglob + if (( P9K_SSH )); then + _p9k_prompt_segment "$0_REMOTE" "${_p9k_color1}" yellow SSH_ICON 0 '' "$_POWERLEVEL9K_HOST_TEMPLATE" + else + _p9k_prompt_segment "$0_LOCAL" "${_p9k_color1}" yellow HOST_ICON 0 '' "$_POWERLEVEL9K_HOST_TEMPLATE" + fi + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_host() { prompt_host; } + +################################################################ +# Toolbox: https://github.com/containers/toolbox +function prompt_toolbox() { + _p9k_prompt_segment $0 $_p9k_color1 yellow TOOLBOX_ICON 0 '' $P9K_TOOLBOX_NAME +} + +_p9k_prompt_toolbox_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$P9K_TOOLBOX_NAME' +} + +function instant_prompt_toolbox() { + _p9k_prompt_segment prompt_toolbox $_p9k_color1 yellow TOOLBOX_ICON 1 '$P9K_TOOLBOX_NAME' '$P9K_TOOLBOX_NAME' +} + +################################################################ +# The 'custom` prompt provides a way for users to invoke commands and display +# the output in a segment. +_p9k_custom_prompt() { + local segment_name=${1:u} + local command=_POWERLEVEL9K_CUSTOM_${segment_name} + command=${(P)command} + local parts=("${(@z)command}") + local cmd="${(Q)parts[1]}" + (( $+functions[$cmd] || $+commands[$cmd] )) || return + local content="$(eval $command)" + [[ -n $content ]] || return + _p9k_prompt_segment "prompt_custom_$1" $_p9k_color2 $_p9k_color1 "CUSTOM_${segment_name}_ICON" 0 '' "$content" +} + +################################################################ +# Display the duration the command needed to run. +prompt_command_execution_time() { + (( $+P9K_COMMAND_DURATION_SECONDS )) || return + (( P9K_COMMAND_DURATION_SECONDS >= _POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD )) || return + + if (( P9K_COMMAND_DURATION_SECONDS < 60 )); then + if (( !_POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION )); then + local -i sec=$((P9K_COMMAND_DURATION_SECONDS + 0.5)) + else + local -F $_POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION sec=P9K_COMMAND_DURATION_SECONDS + fi + local text=${sec}s + else + local -i d=$((P9K_COMMAND_DURATION_SECONDS + 0.5)) + if [[ $_POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT == "H:M:S" ]]; then + local text=${(l.2..0.)$((d % 60))} + if (( d >= 60 )); then + text=${(l.2..0.)$((d / 60 % 60))}:$text + if (( d >= 36000 )); then + text=$((d / 3600)):$text + elif (( d >= 3600 )); then + text=0$((d / 3600)):$text + fi + fi + else + local text="$((d % 60))s" + if (( d >= 60 )); then + text="$((d / 60 % 60))m $text" + if (( d >= 3600 )); then + text="$((d / 3600 % 24))h $text" + if (( d >= 86400 )); then + text="$((d / 86400))d $text" + fi + fi + fi + fi + fi + + _p9k_prompt_segment "$0" "red" "yellow1" 'EXECUTION_TIME_ICON' 0 '' $text +} + +function _p9k_shorten_delim_len() { + local def=$1 + _p9k__ret=${_POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} + (( _p9k__ret >= 0 )) || _p9k_prompt_length $1 +} + +# Percents are duplicated because this function is currently used only +# where the result is going to be percent-expanded. +function _p9k_url_escape() { + emulate -L zsh -o no_multi_byte -o extended_glob + local MATCH MBEGIN MEND + _p9k__ret=${1//(#m)[^a-zA-Z0-9"\/:_.-!'()~"]/%%${(l:2::0:)$(([##16]#MATCH))}} +} + +################################################################ +# Dir: current working directory +prompt_dir() { + if (( _POWERLEVEL9K_DIR_PATH_ABSOLUTE )); then + local p=${(V)_p9k__cwd} + local -a parts=("${(s:/:)p}") + elif [[ -o auto_name_dirs ]]; then + local p=${(V)${_p9k__cwd/#(#b)$HOME(|\/*)/'~'$match[1]}} + local -a parts=("${(s:/:)p}") + else + local p=${(%):-%~} + if [[ $p == '~['* ]]; then + # If "${(%):-%~}" expands to "~[a]/]/b", is the first component "~[a]" or "~[a]/]"? + # One would expect "${(%):-%-1~}" to give the right answer but alas it always simply + # gives the segment before the first slash, which would be "~[a]" in this case. Worse, + # for "~[a/b]" it'll give the nonsensical "~[a". To solve this problem we have to + # repeat what "${(%):-%~}" does and hope that it produces the same result. + local func='' + local -a parts=() + for func in zsh_directory_name $zsh_directory_name_functions; do + local reply=() + if (( $+functions[$func] )) && $func d $_p9k__cwd && [[ $p == '~['${(V)reply[1]}']'* ]]; then + parts+='~['${(V)reply[1]}']' + break + fi + done + if (( $#parts )); then + parts+=(${(s:/:)${p#$parts[1]}}) + else + p=${(V)_p9k__cwd} + parts=("${(s:/:)p}") + fi + else + local -a parts=("${(s:/:)p}") + fi + fi + + local -i fake_first=0 expand=0 shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:--1} + + if (( $+_POWERLEVEL9K_SHORTEN_DELIMITER )); then + local delim=$_POWERLEVEL9K_SHORTEN_DELIMITER + else + if [[ $langinfo[CODESET] == (utf|UTF)(-|)8 ]]; then + local delim=$'\u2026' + else + local delim='..' + fi + fi + + case $_POWERLEVEL9K_SHORTEN_STRATEGY in + truncate_absolute|truncate_absolute_chars) + if (( shortenlen > 0 && $#p > shortenlen )); then + _p9k_shorten_delim_len $delim + if (( $#p > shortenlen + $_p9k__ret )); then + local -i n=shortenlen + local -i i=$#parts + while true; do + local dir=$parts[i] + local -i len=$(( $#dir + (i > 1) )) + if (( len <= n )); then + (( n -= len )) + (( --i )) + else + parts[i]=$'\1'$dir[-n,-1] + parts[1,i-1]=() + break + fi + done + fi + fi + ;; + truncate_with_package_name|truncate_middle|truncate_from_right) + () { + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && + $+commands[jq] == 1 && $#_POWERLEVEL9K_DIR_PACKAGE_FILES > 0 ]] || return + local pats="(${(j:|:)_POWERLEVEL9K_DIR_PACKAGE_FILES})" + local -i i=$#parts + local dir=$_p9k__cwd + for (( ; i > 0; --i )); do + local markers=($dir/${~pats}(N)) + if (( $#markers )); then + local pat= pkg_file= + for pat in $_POWERLEVEL9K_DIR_PACKAGE_FILES; do + for pkg_file in $markers; do + [[ $pkg_file == $dir/${~pat} ]] || continue + if ! _p9k_cache_stat_get $0_pkg $pkg_file; then + local pkg_name='' + pkg_name="$(jq -j '.name | select(. != null)' <$pkg_file 2>/dev/null)" || pkg_name='' + _p9k_cache_stat_set "$pkg_name" + fi + [[ -n $_p9k__cache_val[1] ]] || continue + parts[1,i]=($_p9k__cache_val[1]) + fake_first=1 + return 0 + done + done + fi + dir=${dir:h} + done + } + if (( shortenlen > 0 )); then + _p9k_shorten_delim_len $delim + local -i d=_p9k__ret pref=shortenlen suf=0 i=2 + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_middle ]] && suf=pref + for (( ; i < $#parts; ++i )); do + local dir=$parts[i] + if (( $#dir > pref + suf + d )); then + dir[pref+1,-suf-1]=$'\1' + parts[i]=$dir + fi + done + fi + ;; + truncate_to_last) + shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:-1} + (( shortenlen > 0 )) || shortenlen=1 + local -i i='shortenlen+1' + if [[ $#parts -gt i || $p[1] != / && $#parts -gt shortenlen ]]; then + fake_first=1 + parts[1,-i]=() + fi + ;; + truncate_to_first_and_last) + if (( shortenlen > 0 )); then + local -i i=$(( shortenlen + 1 )) + [[ $p == /* ]] && (( ++i )) + for (( ; i <= $#parts - shortenlen; ++i )); do + parts[i]=$'\1' + done + fi + ;; + truncate_to_unique) + expand=1 + delim=${_POWERLEVEL9K_SHORTEN_DELIMITER-'*'} + shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:-1} + (( shortenlen >= 0 )) || shortenlen=1 + local rp=${(g:oce:)p} + local rparts=("${(@s:/:)rp}") + + local -i i=2 e=$(($#parts - shortenlen)) + if [[ -n $_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER ]]; then + (( e += shortenlen )) + local orig=("$parts[2]" "${(@)parts[$((shortenlen > $#parts ? -$#parts : -shortenlen)),-1]}") + elif [[ $p[1] == / ]]; then + (( ++i )) + fi + if (( i <= e )); then + local mtimes=(${(Oa)_p9k__parent_mtimes:$(($#parts-e)):$((e-i+1))}) + local key="${(pj.:.)mtimes}" + else + local key= + fi + if ! _p9k_cache_ephemeral_get $0 $e $i $_p9k__cwd $p || [[ $key != $_p9k__cache_val[1] ]]; then + local rtail=${(j./.)rparts[i,-1]} + local parent=$_p9k__cwd[1,-2-$#rtail] + _p9k_prompt_length $delim + local -i real_delim_len=_p9k__ret + [[ -n $parts[i-1] ]] && parts[i-1]="\${(Q)\${:-${(qqq)${(q)parts[i-1]}}}}"$'\2' + local -i d=${_POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} + (( d >= 0 )) || d=real_delim_len + local -i m=1 + for (( ; i <= e; ++i, ++m )); do + local sub=$parts[i] + local rsub=$rparts[i] + local dir=$parent/$rsub mtime=$mtimes[m] + local pair=$_p9k__dir_stat_cache[$dir] + if [[ $pair == ${mtime:-x}:* ]]; then + parts[i]=${pair#*:} + else + [[ $sub != *["~!#\`\$^&*()\\\"'<>?{}[]"]* ]] + local -i q=$? + if [[ -n $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER && + -n $dir/${~_POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]]; then + (( q )) && parts[i]="\${(Q)\${:-${(qqq)${(q)sub}}}}" + parts[i]+=$'\2' + else + local -i j=$rsub[(i)[^.]] + for (( ; j + d < $#rsub; ++j )); do + local -a matching=($parent/$rsub[1,j]*/(N)) + (( $#matching == 1 )) && break + done + local -i saved=$((${(m)#${(V)${rsub:$j}}} - d)) + if (( saved > 0 )); then + if (( q )); then + parts[i]='${${${_p9k__d:#-*}:+${(Q)${:-'${(qqq)${(q)sub}}'}}}:-${(Q)${:-' + parts[i]+=$'\3'${(qqq)${(q)${(V)${rsub[1,j]}}}}$'}}\1\3''${$((_p9k__d+='$saved'))+}}' + else + parts[i]='${${${_p9k__d:#-*}:+'$sub$'}:-\3'${(V)${rsub[1,j]}}$'\1\3''${$((_p9k__d+='$saved'))+}}' + fi + else + (( q )) && parts[i]="\${(Q)\${:-${(qqq)${(q)sub}}}}" + fi + fi + [[ -n $mtime ]] && _p9k__dir_stat_cache[$dir]="$mtime:$parts[i]" + fi + parent+=/$rsub + done + if [[ -n $_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER ]]; then + local _2=$'\2' + if [[ $_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER == last* ]]; then + (( e = ${parts[(I)*$_2]} + ${_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER#*:} )) + else + (( e = ${parts[(ib:2:)*$_2]} + ${_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER#*:} )) + fi + if (( e > 1 && e <= $#parts )); then + parts[1,e-1]=() + fake_first=1 + elif [[ $p == /?* ]]; then + parts[2]="\${(Q)\${:-${(qqq)${(q)orig[1]}}}}"$'\2' + fi + for ((i = $#parts < shortenlen ? $#parts : shortenlen; i > 0; --i)); do + [[ $#parts[-i] == *$'\2' ]] && continue + if [[ $orig[-i] == *["~!#\`\$^&*()\\\"'<>?{}[]"]* ]]; then + parts[-i]='${(Q)${:-'${(qqq)${(q)orig[-i]}}'}}'$'\2' + else + parts[-i]=${orig[-i]}$'\2' + fi + done + else + for ((; i <= $#parts; ++i)); do + [[ $parts[i] == *["~!#\`\$^&*()\\\"'<>?{}[]"]* ]] && parts[i]='${(Q)${:-'${(qqq)${(q)parts[i]}}'}}' + parts[i]+=$'\2' + done + fi + _p9k_cache_ephemeral_set "$key" "${parts[@]}" + fi + parts=("${(@)_p9k__cache_val[2,-1]}") + ;; + truncate_with_folder_marker) + if [[ -n $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER ]]; then + local dir=$_p9k__cwd + local -a m=() + local -i i=$(($#parts - 1)) + for (( ; i > 1; --i )); do + dir=${dir:h} + [[ -n $dir/${~_POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]] && m+=$i + done + m+=1 + for (( i=1; i < $#m; ++i )); do + (( m[i] - m[i+1] > 2 )) && parts[m[i+1]+1,m[i]-1]=($'\1') + done + fi + ;; + *) + if (( shortenlen > 0 )); then + local -i len=$#parts + [[ -z $parts[1] ]] && (( --len )) + if (( len > shortenlen )); then + parts[1,-shortenlen-1]=($'\1') + fi + fi + ;; + esac + + # w=0: writable + # w=1: not writable + # w=2: does not exist + (( !_POWERLEVEL9K_DIR_SHOW_WRITABLE )) || [[ -w $_p9k__cwd ]] + local -i w=$? + (( w && _POWERLEVEL9K_DIR_SHOW_WRITABLE > 2 )) && [[ ! -e $_p9k__cwd ]] && w=2 + if ! _p9k_cache_ephemeral_get $0 $_p9k__cwd $p $w $fake_first "${parts[@]}"; then + local state=$0 + local icon='' + local a='' b='' c='' + for a b c in "${_POWERLEVEL9K_DIR_CLASSES[@]}"; do + if [[ $_p9k__cwd == ${~a} ]]; then + [[ -n $b ]] && state+=_${${(U)b}//ฤฐ/I} + icon=$'\1'$c + break + fi + done + if (( w )); then + if (( _POWERLEVEL9K_DIR_SHOW_WRITABLE == 1 )); then + state=${0}_NOT_WRITABLE + elif (( w == 2 )); then + state+=_NON_EXISTENT + else + state+=_NOT_WRITABLE + fi + icon=LOCK_ICON + fi + + local state_u=${${(U)state}//ฤฐ/I} + + local style=%b + _p9k_color $state BACKGROUND blue + _p9k_background $_p9k__ret + style+=$_p9k__ret + _p9k_color $state FOREGROUND "$_p9k_color1" + _p9k_foreground $_p9k__ret + style+=$_p9k__ret + if (( expand )); then + _p9k_escape_style $style + style=$_p9k__ret + fi + + parts=("${(@)parts//\%/%%}") + if [[ $_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION != '~' && $fake_first == 0 && $p == ('~'|'~/'*) ]]; then + (( expand )) && _p9k_escape $_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION || _p9k__ret=$_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION + parts[1]=$_p9k__ret + [[ $_p9k__ret == *%* ]] && parts[1]+=$style + elif [[ $_POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER == 1 && $fake_first == 0 && $#parts > 1 && -z $parts[1] && -n $parts[2] ]]; then + parts[1]=() + fi + + local last_style= + _p9k_param $state PATH_HIGHLIGHT_BOLD '' + [[ $_p9k__ret == true ]] && last_style+=%B + if (( $+parameters[_POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND] || + $+parameters[_POWERLEVEL9K_${state_u}_PATH_HIGHLIGHT_FOREGROUND] )); then + _p9k_color $state PATH_HIGHLIGHT_FOREGROUND '' + _p9k_foreground $_p9k__ret + last_style+=$_p9k__ret + fi + if [[ -n $last_style ]]; then + (( expand )) && _p9k_escape_style $last_style || _p9k__ret=$last_style + parts[-1]=$_p9k__ret${parts[-1]//$'\1'/$'\1'$_p9k__ret}$style + fi + + local anchor_style= + _p9k_param $state ANCHOR_BOLD '' + [[ $_p9k__ret == true ]] && anchor_style+=%B + if (( $+parameters[_POWERLEVEL9K_DIR_ANCHOR_FOREGROUND] || + $+parameters[_POWERLEVEL9K_${state_u}_ANCHOR_FOREGROUND] )); then + _p9k_color $state ANCHOR_FOREGROUND '' + _p9k_foreground $_p9k__ret + anchor_style+=$_p9k__ret + fi + if [[ -n $anchor_style ]]; then + (( expand )) && _p9k_escape_style $anchor_style || _p9k__ret=$anchor_style + if [[ -z $last_style ]]; then + parts=("${(@)parts/%(#b)(*)$'\2'/$_p9k__ret$match[1]$style}") + else + (( $#parts > 1 )) && parts[1,-2]=("${(@)parts[1,-2]/%(#b)(*)$'\2'/$_p9k__ret$match[1]$style}") + parts[-1]=${parts[-1]/$'\2'} + fi + else + parts=("${(@)parts/$'\2'}") + fi + + if (( $+parameters[_POWERLEVEL9K_DIR_SHORTENED_FOREGROUND] || + $+parameters[_POWERLEVEL9K_${state_u}_SHORTENED_FOREGROUND] )); then + _p9k_color $state SHORTENED_FOREGROUND '' + _p9k_foreground $_p9k__ret + (( expand )) && _p9k_escape_style $_p9k__ret + local shortened_fg=$_p9k__ret + (( expand )) && _p9k_escape $delim || _p9k__ret=$delim + [[ $_p9k__ret == *%* ]] && _p9k__ret+=$style$shortened_fg + parts=("${(@)parts/(#b)$'\3'(*)$'\1'(*)$'\3'/$shortened_fg$match[1]$_p9k__ret$match[2]$style}") + parts=("${(@)parts/(#b)(*)$'\1'(*)/$shortened_fg$match[1]$_p9k__ret$match[2]$style}") + else + (( expand )) && _p9k_escape $delim || _p9k__ret=$delim + [[ $_p9k__ret == *%* ]] && _p9k__ret+=$style + parts=("${(@)parts/$'\1'/$_p9k__ret}") + parts=("${(@)parts//$'\3'}") + fi + + if [[ $_p9k__cwd == / && $_POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER == 1 ]]; then + local sep='/' + else + local sep='' + if (( $+parameters[_POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND] || + $+parameters[_POWERLEVEL9K_${state_u}_PATH_SEPARATOR_FOREGROUND] )); then + _p9k_color $state PATH_SEPARATOR_FOREGROUND '' + _p9k_foreground $_p9k__ret + (( expand )) && _p9k_escape_style $_p9k__ret + sep=$_p9k__ret + fi + _p9k_param $state PATH_SEPARATOR / + _p9k__ret=${(g::)_p9k__ret} + (( expand )) && _p9k_escape $_p9k__ret + sep+=$_p9k__ret + [[ $sep == *%* ]] && sep+=$style + fi + + local content="${(pj.$sep.)parts}" + if (( _POWERLEVEL9K_DIR_HYPERLINK && _p9k_term_has_href )) && [[ $_p9k__cwd == /* ]]; then + _p9k_url_escape $_p9k__cwd + local header=$'%{\e]8;;file://'$_p9k__ret$'\a%}' + local footer=$'%{\e]8;;\a%}' + if (( expand )); then + _p9k_escape $header + header=$_p9k__ret + _p9k_escape $footer + footer=$_p9k__ret + fi + content=$header$content$footer + fi + + (( expand )) && _p9k_prompt_length "${(e):-"\${\${_p9k__d::=0}+}$content"}" || _p9k__ret= + _p9k_cache_ephemeral_set "$state" "$icon" "$expand" "$content" $_p9k__ret + fi + + if (( _p9k__cache_val[3] )); then + if (( $+_p9k__dir )); then + _p9k__cache_val[4]='${${_p9k__d::=-1024}+}'$_p9k__cache_val[4] + else + _p9k__dir=$_p9k__cache_val[4] + _p9k__dir_len=$_p9k__cache_val[5] + _p9k__cache_val[4]='%{d%}'$_p9k__cache_val[4]'%{d%}' + fi + fi + _p9k_prompt_segment "$_p9k__cache_val[1]" "blue" "$_p9k_color1" "$_p9k__cache_val[2]" "$_p9k__cache_val[3]" "" "$_p9k__cache_val[4]" +} + +instant_prompt_dir() { prompt_dir; } + +################################################################ +# Docker machine +prompt_docker_machine() { + _p9k_prompt_segment "$0" "magenta" "$_p9k_color1" 'SERVER_ICON' 0 '' "${DOCKER_MACHINE_NAME//\%/%%}" +} + +_p9k_prompt_docker_machine_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$DOCKER_MACHINE_NAME' +} + +################################################################ +# GO prompt +prompt_go_version() { + _p9k_cached_cmd 0 '' go version || return + [[ $_p9k__ret == (#b)*go([[:digit:].]##)* ]] || return + local v=$match[1] + if (( _POWERLEVEL9K_GO_VERSION_PROJECT_ONLY )); then + local p=$GOPATH + if [[ -z $p ]]; then + if [[ -d $HOME/go ]]; then + p=$HOME/go + else + p="$(go env GOPATH 2>/dev/null)" && [[ -n $p ]] || return + fi + fi + if [[ $_p9k__cwd/ != $p/* && $_p9k__cwd_a/ != $p/* ]]; then + _p9k_upglob go.mod -. && return + fi + fi + _p9k_prompt_segment "$0" "green" "grey93" "GO_ICON" 0 '' "${v//\%/%%}" +} + +_p9k_prompt_go_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[go]' +} + +################################################################ +# Command number (in local history) +prompt_history() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "$0" "grey50" "$_p9k_color1" '' 0 '' '%h' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +prompt_package() { + unset P9K_PACKAGE_NAME P9K_PACKAGE_VERSION + _p9k_upglob package.json -. && return + + local file=$_p9k__parent_dirs[$?]/package.json + if ! _p9k_cache_stat_get $0 $file; then + () { + local data field + local -A found + # Redneck json parsing. Yields correct results for any well-formed json document. + # Produces random garbage for invalid json. + { data="$(<$file)" || return } 2>/dev/null + data=${${data//$'\r'}##[[:space:]]#} + [[ $data == '{'* ]] || return + data[1]= + local -i depth=1 + while true; do + data=${data##[[:space:]]#} + [[ -n $data ]] || return + case $data[1] in + '{'|'[') data[1]=; (( ++depth ));; + '}'|']') data[1]=; (( --depth > 0 )) || return;; + ':') data[1]=;; + ',') data[1]=; field=;; + [[:alnum:].]) data=${data##[[:alnum:].]#};; + '"') + local tail=${data##\"([^\"\\]|\\?)#} + [[ $tail == '"'* ]] || return + local s=${data:1:-$#tail} + data=${tail:1} + (( depth == 1 )) || continue + if [[ -z $field ]]; then + field=${s:-x} + elif [[ $field == (name|version) ]]; then + (( ! $+found[$field] )) || return + [[ -n $s ]] || return + [[ $s != *($'\n'|'\')* ]] || return + found[$field]=$s + (( $#found == 2 )) && break + fi + ;; + *) return 1;; + esac + done + _p9k_cache_stat_set 1 $found[name] $found[version] + return 0 + } || _p9k_cache_stat_set 0 + fi + (( _p9k__cache_val[1] )) || return + + P9K_PACKAGE_NAME=$_p9k__cache_val[2] + P9K_PACKAGE_VERSION=$_p9k__cache_val[3] + _p9k_prompt_segment "$0" "cyan" "$_p9k_color1" PACKAGE_ICON 0 '' ${P9K_PACKAGE_VERSION//\%/%%} +} + +################################################################ +# Detection for virtualization (systemd based systems only) +prompt_detect_virt() { + local virt="$(systemd-detect-virt 2>/dev/null)" + if [[ "$virt" == "none" ]]; then + local -a inode + if zstat -A inode +inode / 2>/dev/null && [[ $inode[1] != 2 ]]; then + virt="chroot" + fi + fi + if [[ -n "${virt}" ]]; then + _p9k_prompt_segment "$0" "$_p9k_color1" "yellow" '' 0 '' "${virt//\%/%%}" + fi +} + +_p9k_prompt_detect_virt_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[systemd-detect-virt]' +} + +################################################################ +# Segment to display the current IP address +prompt_ip() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "$0" "cyan" "$_p9k_color1" 'NETWORK_ICON' 1 '$P9K_IP_IP' '$P9K_IP_IP' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +################################################################ +# Segment to display if VPN is active +prompt_vpn_ip() { + typeset -ga _p9k__vpn_ip_segments + _p9k__vpn_ip_segments+=($_p9k__prompt_side $_p9k__line_index $_p9k__segment_index) + local p='${(e)_p9k__vpn_ip_'$_p9k__prompt_side$_p9k__segment_index'}' + _p9k__prompt+=$p + typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$p +} + +_p9k_vpn_ip_render() { + local _p9k__segment_name=vpn_ip _p9k__prompt_side ip + local -i _p9k__has_upglob _p9k__segment_index + for _p9k__prompt_side _p9k__line_index _p9k__segment_index in $_p9k__vpn_ip_segments; do + local _p9k__prompt= + for ip in $_p9k__vpn_ip_ips; do + _p9k_prompt_segment prompt_vpn_ip "cyan" "$_p9k_color1" 'VPN_ICON' 0 '' $ip + done + typeset -g _p9k__vpn_ip_$_p9k__prompt_side$_p9k__segment_index=$_p9k__prompt + done +} + +################################################################ +# Segment to display laravel version +prompt_laravel_version() { + # TODO: add a '-/' or '-.' here depending on whether artisan is a directory or a file. + _p9k_upglob artisan && return + local dir=$_p9k__parent_dirs[$?] + local app=$dir/vendor/laravel/framework/src/Illuminate/Foundation/Application.php + [[ -r $app ]] || return + if ! _p9k_cache_stat_get $0 $dir/artisan $app; then + local v="$(php $dir/artisan --version 2> /dev/null)" + v="${${(M)v:#Laravel Framework *}#Laravel Framework }" + # In some versions the output is colorized. + # https://github.com/romkatv/powerlevel10k/issues/2534 + v=${${v#$'\e['<->m}%$'\e['<->m} + _p9k_cache_stat_set "$v" + fi + [[ -n $_p9k__cache_val[1] ]] || return + _p9k_prompt_segment "$0" "maroon" "white" 'LARAVEL_ICON' 0 '' "${_p9k__cache_val[1]//\%/%%}" +} + +_p9k_prompt_laravel_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[php]' +} + +################################################################ +# Segment to display load +prompt_load() { + if [[ $_p9k_os == (OSX|BSD) ]]; then + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0_CRITICAL red "$_p9k_color1" LOAD_ICON 1 '$_p9k__load_critical' '$_p9k__load_value' + _p9k_prompt_segment $0_WARNING yellow "$_p9k_color1" LOAD_ICON 1 '$_p9k__load_warning' '$_p9k__load_value' + _p9k_prompt_segment $0_NORMAL green "$_p9k_color1" LOAD_ICON 1 '$_p9k__load_normal' '$_p9k__load_value' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] + return + fi + + [[ -r /proc/loadavg ]] || return + _p9k_read_file /proc/loadavg || return + local load=${${(A)=_p9k__ret}[_POWERLEVEL9K_LOAD_WHICH]//,/.} + local -F pct='100. * load / _p9k_num_cpus' + if (( pct > _POWERLEVEL9K_LOAD_CRITICAL_PCT )); then + _p9k_prompt_segment $0_CRITICAL red "$_p9k_color1" LOAD_ICON 0 '' $load + elif (( pct > _POWERLEVEL9K_LOAD_WARNING_PCT )); then + _p9k_prompt_segment $0_WARNING yellow "$_p9k_color1" LOAD_ICON 0 '' $load + else + _p9k_prompt_segment $0_NORMAL green "$_p9k_color1" LOAD_ICON 0 '' $load + fi +} + +_p9k_prompt_load_init() { + if [[ $_p9k_os == (OSX|BSD) ]]; then + typeset -g _p9k__load_value= + typeset -g _p9k__load_normal= + typeset -g _p9k__load_warning= + typeset -g _p9k__load_critical= + _p9k__async_segments_compute+='_p9k_worker_invoke load _p9k_prompt_load_compute' + elif [[ ! -r /proc/loadavg ]]; then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi +} + +_p9k_prompt_load_compute() { + (( $+commands[sysctl] )) || return + _p9k_worker_async _p9k_prompt_load_async _p9k_prompt_load_sync +} + +_p9k_prompt_load_async() { + local load="$(sysctl -n vm.loadavg 2>/dev/null)" || return + load=${${(A)=load}[_POWERLEVEL9K_LOAD_WHICH+1]//,/.} + [[ $load == <->(|.<->) && $load != $_p9k__load_value ]] || return + _p9k__load_value=$load + _p9k__load_normal= + _p9k__load_warning= + _p9k__load_critical= + local -F pct='100. * _p9k__load_value / _p9k_num_cpus' + if (( pct > _POWERLEVEL9K_LOAD_CRITICAL_PCT )); then + _p9k__load_critical=1 + elif (( pct > _POWERLEVEL9K_LOAD_WARNING_PCT )); then + _p9k__load_warning=1 + else + _p9k__load_normal=1 + fi + _p9k_print_params \ + _p9k__load_value \ + _p9k__load_normal \ + _p9k__load_warning \ + _p9k__load_critical + echo -E - 'reset=1' +} + +_p9k_prompt_load_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +# Usage: _p9k_cached_cmd <0|1> [args...] +# +# The first argument says whether to capture stderr (1) or ignore it (0). +# The second argument can be empty or a file. If it's a file, the +# output of the command is presumed to potentially depend on it. +function _p9k_cached_cmd() { + local cmd=$commands[$3] + [[ -n $cmd ]] || return + if ! _p9k_cache_stat_get $0" ${(q)*}" $2 $cmd; then + local out + if (( $1 )); then + out="$($cmd "${@:4}" 2>&1)" + else + out="$($cmd "${@:4}" 2>/dev/null)" + fi + _p9k_cache_stat_set $(( ! $? )) "$out" + fi + (( $_p9k__cache_val[1] )) || return + _p9k__ret=$_p9k__cache_val[2] +} + +################################################################ +# Segment to display Node version +prompt_node_version() { + _p9k_upglob package.json -. + local -i idx=$? + (( idx || ! _POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY )) || return + + local node=$commands[node] + local -a file_deps env_deps + if [[ $node == ${NODENV_ROOT:-$HOME/.nodenv}/shims/node ]]; then + env_deps+=("$NODENV_VERSION") + file_deps+=(${NODENV_ROOT:-$HOME/.nodenv}/version) + if [[ $NODENV_DIR != (|.) ]]; then + [[ $NODENV_DIR == /* ]] && local dir=$NODENV_DIR || local dir="$_p9k__cwd_a/$NODENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if [[ -e $dir/.node-version ]]; then + file_deps+=($dir/.node-version) + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + _p9k_upglob .node-version -. || file_deps+=($_p9k__parent_dirs[idx]/.node-version) + elif (( idx )); then + file_deps+=($_p9k__parent_dirs[idx]/package.json) + fi + + if ! _p9k_cache_stat_get "$0 $#env_deps ${(j: :)${(@q)env_deps}} ${(j: :)${(@q)file_deps}}" $file_deps $node; then + local out + out=$($node --version 2>/dev/null) + _p9k_cache_stat_set $(( ! $? )) "$out" + fi + (( $_p9k__cache_val[1] )) || return + local v=$_p9k__cache_val[2] + [[ $v == v?* ]] || return + _p9k_prompt_segment "$0" "green" "white" 'NODE_ICON' 0 '' "${${v#v}//\%/%%}" +} + +_p9k_prompt_node_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[node]' +} + +# Almost the same as `nvm_version default` but faster. The differences shouldn't affect +# the observable behavior of Powerlevel10k. +function _p9k_nvm_ls_default() { + local v=default + local -a seen=($v) + while [[ -r $NVM_DIR/alias/$v ]]; do + local target= + IFS='' read -r target <$NVM_DIR/alias/$v + target=${target%$'\r'} + [[ -z $target ]] && break + (( $seen[(I)$target] )) && return + seen+=$target + v=$target + done + + case $v in + default|N/A) + return 1 + ;; + system|v) + _p9k__ret=system + return 0 + ;; + iojs-[0-9]*) + v=iojs-v${v#iojs-} + ;; + [0-9]*) + v=v$v + ;; + esac + + if [[ $v == v*.*.* ]]; then + if [[ -x $NVM_DIR/versions/node/$v/bin/node || -x $NVM_DIR/$v/bin/node ]]; then + _p9k__ret=$v + return 0 + elif [[ -x $NVM_DIR/versions/io.js/$v/bin/node ]]; then + _p9k__ret=iojs-$v + return 0 + else + return 1 + fi + fi + + local -a dirs=() + case $v in + node|node-|stable) + dirs=($NVM_DIR/versions/node $NVM_DIR) + v='(v[1-9]*|v0.*[02468].*)' + ;; + unstable) + dirs=($NVM_DIR/versions/node $NVM_DIR) + v='v0.*[13579].*' + ;; + iojs*) + dirs=($NVM_DIR/versions/io.js) + v=v${${${v#iojs}#-}#v}'*' + ;; + *) + dirs=($NVM_DIR/versions/node $NVM_DIR $NVM_DIR/versions/io.js) + v=v${v#v}'*' + ;; + esac + + local -a matches=(${^dirs}/${~v}(/N)) + (( $#matches )) || return + + local max path + for path in ${(Oa)matches}; do + [[ ${path:t} == (#b)v(*).(*).(*) ]] || continue + v=${(j::)${(@l:6::0:)match}} + [[ $v > $max ]] || continue + max=$v + _p9k__ret=${path:t} + [[ ${path:h:t} != io.js ]] || _p9k__ret=iojs-$_p9k__ret + done + + [[ -n $max ]] +} + +# The same as `nvm_version current` but faster. +_p9k_nvm_ls_current() { + local node_path=${commands[node]:A} + [[ -n $node_path ]] || return + + local nvm_dir=${NVM_DIR:A} + if [[ -n $nvm_dir && $node_path == $nvm_dir/versions/io.js/* ]]; then + _p9k_cached_cmd 0 '' iojs --version || return + _p9k__ret=iojs-v${_p9k__ret#v} + elif [[ -n $nvm_dir && $node_path == $nvm_dir/* ]]; then + _p9k_cached_cmd 0 '' node --version || return + _p9k__ret=v${_p9k__ret#v} + else + _p9k__ret=system + fi +} + +################################################################ +# Segment to display Node version from NVM +# Only prints the segment if different than the default value +prompt_nvm() { + [[ -n $NVM_DIR ]] && _p9k_nvm_ls_current || return + local current=$_p9k__ret + (( _POWERLEVEL9K_NVM_SHOW_SYSTEM )) || + [[ $current != system ]] || + return + (( _POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW )) || + ! _p9k_nvm_ls_default || + [[ $_p9k__ret != $current ]] || + return + _p9k_prompt_segment "$0" "magenta" "black" 'NODE_ICON' 0 '' "${${current#v}//\%/%%}" +} + +_p9k_prompt_nvm_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[nvm]:-${${+functions[nvm]}:#0}}' +} + +################################################################ +# Segment to display NodeEnv +prompt_nodeenv() { + local msg + if (( _POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION )) && _p9k_cached_cmd 0 '' node --version; then + msg="${_p9k__ret//\%/%%} " + fi + msg+="$_POWERLEVEL9K_NODEENV_LEFT_DELIMITER${${NODE_VIRTUAL_ENV:t}//\%/%%}$_POWERLEVEL9K_NODEENV_RIGHT_DELIMITER" + _p9k_prompt_segment "$0" "black" "green" 'NODE_ICON' 0 '' "$msg" +} + +_p9k_prompt_nodeenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$NODE_VIRTUAL_ENV' +} + +function _p9k_nodeenv_version_transform() { + local dir=${NODENV_ROOT:-$HOME/.nodenv}/versions + [[ -z $1 || $1 == system ]] && _p9k__ret=$1 && return + [[ -d $dir/$1 ]] && _p9k__ret=$1 && return + [[ -d $dir/${1/v} ]] && _p9k__ret=${1/v} && return + [[ -d $dir/${1#node-} ]] && _p9k__ret=${1#node-} && return + [[ -d $dir/${1#node-v} ]] && _p9k__ret=${1#node-v} && return + return 1 +} + +function _p9k_nodenv_global_version() { + _p9k_read_word ${NODENV_ROOT:-$HOME/.nodenv}/version || _p9k__ret=system +} + +################################################################ +# Segment to display nodenv information +# https://github.com/nodenv/nodenv +prompt_nodenv() { + if [[ -n $NODENV_VERSION ]]; then + (( ${_POWERLEVEL9K_NODENV_SOURCES[(I)shell]} )) || return + local v=$NODENV_VERSION + else + (( ${_POWERLEVEL9K_NODENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $NODENV_DIR != (|.) ]]; then + [[ $NODENV_DIR == /* ]] && local dir=$NODENV_DIR || local dir="$_p9k__cwd_a/$NODENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.node-version; then + (( ${_POWERLEVEL9K_NODENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .node-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.node-version; then + (( ${_POWERLEVEL9K_NODENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_NODENV_SOURCES[(I)global]} )) || return + _p9k_nodenv_global_version + fi + + _p9k_nodeenv_version_transform $_p9k__ret || return + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW )); then + _p9k_nodenv_global_version + _p9k_nodeenv_version_transform $_p9k__ret && [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_NODENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "black" "green" 'NODE_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_nodenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[nodenv]:-${${+functions[nodenv]}:#0}}' +} + +prompt_dotnet_version() { + if (( _POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY )); then + _p9k_upglob 'project.json|global.json|packet.dependencies|*.csproj|*.fsproj|*.xproj|*.sln' -. && return + fi + + local cfg + _p9k_upglob global.json -. || cfg=$_p9k__parent_dirs[$?]/global.json + _p9k_cached_cmd 0 "$cfg" dotnet --version || return + _p9k_prompt_segment "$0" "magenta" "white" 'DOTNET_ICON' 0 '' "$_p9k__ret" +} + +_p9k_prompt_dotnet_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[dotnet]' +} + +################################################################ +# Segment to print a little OS icon +prompt_os_icon() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "$0" "black" "white" '' 0 '' "$_p9k_os_icon" + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_os_icon() { prompt_os_icon; } + +################################################################ +# Segment to display PHP version number +prompt_php_version() { + if (( _POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY )); then + _p9k_upglob 'composer.json|*.php' -. && return + fi + _p9k_cached_cmd 0 '' php --version || return + [[ $_p9k__ret == (#b)(*$'\n')#'PHP '([[:digit:].]##)* ]] || return + local v=$match[2] + _p9k_prompt_segment "$0" "fuchsia" "grey93" 'PHP_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_php_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[php]' +} + +################################################################ +# Segment to display free RAM and used Swap +prompt_ram() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 yellow "$_p9k_color1" RAM_ICON 1 '$_p9k__ram_free' '$_p9k__ram_free' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +function _p9k_prompt_ram_init() { + if [[ $_p9k_os == OSX && $+commands[vm_stat] == 0 || + $_p9k_os == BSD && ! -r /var/run/dmesg.boot || + $_p9k_os != (OSX|BSD) && ! -r /proc/meminfo ]]; then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + return + fi + typeset -g _p9k__ram_free= + _p9k__async_segments_compute+='_p9k_worker_invoke ram _p9k_prompt_ram_compute' +} + +_p9k_prompt_ram_compute() { + _p9k_worker_async _p9k_prompt_ram_async _p9k_prompt_ram_sync +} + +_p9k_prompt_ram_async() { + local -F free_bytes + + case $_p9k_os in + OSX) + (( $+commands[vm_stat] )) || return + local stat && stat="$(vm_stat 2>/dev/null)" || return + [[ $stat =~ 'Pages free:[[:space:]]+([0-9]+)' ]] || return + (( free_bytes += match[1] )) + [[ $stat =~ 'Pages inactive:[[:space:]]+([0-9]+)' ]] || return + (( free_bytes += match[1] )) + if (( ! $+_p9k__ram_pagesize )); then + local p + (( $+commands[pagesize] )) && p=$(pagesize 2>/dev/null) && [[ $p == <1-> ]] || p=4096 + typeset -gi _p9k__ram_pagesize=p + _p9k_print_params _p9k__ram_pagesize + fi + (( free_bytes *= _p9k__ram_pagesize )) + ;; + BSD) + local stat && stat="$(grep -F 'avail memory' /var/run/dmesg.boot 2>/dev/null)" || return + free_bytes=${${(A)=stat}[4]} + ;; + *) + [[ -r /proc/meminfo ]] || return + local stat && stat="$()* ]] || return + free_bytes=$(( $match[2] * 1024 )) + ;; + esac + + _p9k_human_readable_bytes $free_bytes + [[ $_p9k__ret != $_p9k__ram_free ]] || return + _p9k__ram_free=$_p9k__ret + _p9k_print_params _p9k__ram_free + echo -E - 'reset=1' +} + +_p9k_prompt_ram_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +function _p9k_rbenv_global_version() { + _p9k_read_word ${RBENV_ROOT:-$HOME/.rbenv}/version || _p9k__ret=system +} + +################################################################ +# Segment to display rbenv information +# https://github.com/rbenv/rbenv#choosing-the-ruby-version +prompt_rbenv() { + if [[ -n $RBENV_VERSION ]]; then + (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)shell]} )) || return + local v=$RBENV_VERSION + else + (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $RBENV_DIR != (|.) ]]; then + [[ $RBENV_DIR == /* ]] && local dir=$RBENV_DIR || local dir="$_p9k__cwd_a/$RBENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.ruby-version; then + (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .ruby-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.ruby-version; then + (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)global]} )) || return + _p9k_rbenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW )); then + _p9k_rbenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_RBENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "red" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_rbenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[rbenv]:-${${+functions[rbenv]}:#0}}' +} + +function _p9k_phpenv_global_version() { + _p9k_read_word ${PHPENV_ROOT:-$HOME/.phpenv}/version || _p9k__ret=system +} + +function _p9k_scalaenv_global_version() { + _p9k_read_word ${SCALAENV_ROOT:-$HOME/.scalaenv}/version || _p9k__ret=system +} + +# https://github.com/scalaenv/scalaenv +prompt_scalaenv() { + if [[ -n $SCALAENV_VERSION ]]; then + (( ${_POWERLEVEL9K_SCALAENV_SOURCES[(I)shell]} )) || return + local v=$SCALAENV_VERSION + else + (( ${_POWERLEVEL9K_SCALAENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $SCALAENV_DIR != (|.) ]]; then + [[ $SCALAENV_DIR == /* ]] && local dir=$SCALAENV_DIR || local dir="$_p9k__cwd_a/$SCALAENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.scala-version; then + (( ${_POWERLEVEL9K_SCALAENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .scala-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.scala-version; then + (( ${_POWERLEVEL9K_SCALAENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_SCALAENV_SOURCES[(I)global]} )) || return + _p9k_scalaenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW )); then + _p9k_scalaenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_SCALAENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "red" "$_p9k_color1" 'SCALA_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_scalaenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[scalaenv]:-${${+functions[scalaenv]}:#0}}' +} + +function _p9k_phpenv_global_version() { + _p9k_read_word ${PHPENV_ROOT:-$HOME/.phpenv}/version || _p9k__ret=system +} + +prompt_phpenv() { + if [[ -n $PHPENV_VERSION ]]; then + (( ${_POWERLEVEL9K_PHPENV_SOURCES[(I)shell]} )) || return + local v=$PHPENV_VERSION + else + (( ${_POWERLEVEL9K_PHPENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $PHPENV_DIR != (|.) ]]; then + [[ $PHPENV_DIR == /* ]] && local dir=$PHPENV_DIR || local dir="$_p9k__cwd_a/$PHPENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.php-version; then + (( ${_POWERLEVEL9K_PHPENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .php-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.php-version; then + (( ${_POWERLEVEL9K_PHPENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_PHPENV_SOURCES[(I)global]} )) || return + _p9k_phpenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW )); then + _p9k_phpenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_PHPENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "magenta" "$_p9k_color1" 'PHP_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_phpenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[phpenv]:-${${+functions[phpenv]}:#0}}' +} + +function _p9k_luaenv_global_version() { + _p9k_read_word ${LUAENV_ROOT:-$HOME/.luaenv}/version || _p9k__ret=system +} + +################################################################ +# Segment to display luaenv information +# https://github.com/cehoffman/luaenv +prompt_luaenv() { + if [[ -n $LUAENV_VERSION ]]; then + (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)shell]} )) || return + local v=$LUAENV_VERSION + else + (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $LUAENV_DIR != (|.) ]]; then + [[ $LUAENV_DIR == /* ]] && local dir=$LUAENV_DIR || local dir="$_p9k__cwd_a/$LUAENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.lua-version; then + (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .lua-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.lua-version; then + (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)global]} )) || return + _p9k_luaenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW )); then + _p9k_luaenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_LUAENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" blue "$_p9k_color1" 'LUA_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_luaenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[luaenv]:-${${+functions[luaenv]}:#0}}' +} + +function _p9k_jenv_global_version() { + _p9k_read_word ${JENV_ROOT:-$HOME/.jenv}/version || _p9k__ret=system +} + +################################################################ +# Segment to display jenv information +# https://github.com/jenv/jenv +prompt_jenv() { + if [[ -n $JENV_VERSION ]]; then + (( ${_POWERLEVEL9K_JENV_SOURCES[(I)shell]} )) || return + local v=$JENV_VERSION + else + (( ${_POWERLEVEL9K_JENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $JENV_DIR != (|.) ]]; then + [[ $JENV_DIR == /* ]] && local dir=$JENV_DIR || local dir="$_p9k__cwd_a/$JENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.java-version; then + (( ${_POWERLEVEL9K_JENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .java-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.java-version; then + (( ${_POWERLEVEL9K_JENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_JENV_SOURCES[(I)global]} )) || return + _p9k_jenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW )); then + _p9k_jenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_JENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" white red 'JAVA_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_jenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[jenv]:-${${+functions[jenv]}:#0}}' +} + +function _p9k_plenv_global_version() { + _p9k_read_word ${PLENV_ROOT:-$HOME/.plenv}/version || _p9k__ret=system +} + +################################################################ +# Segment to display plenv information +# https://github.com/plenv/plenv#choosing-the-perl-version +prompt_plenv() { + if [[ -n $PLENV_VERSION ]]; then + (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)shell]} )) || return + local v=$PLENV_VERSION + else + (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $PLENV_DIR != (|.) ]]; then + [[ $PLENV_DIR == /* ]] && local dir=$PLENV_DIR || local dir="$_p9k__cwd_a/$PLENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_word $dir/.perl-version; then + (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .perl-version -. + local -i idx=$? + if (( idx )) && _p9k_read_word $_p9k__parent_dirs[idx]/.perl-version; then + (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)global]} )) || return + _p9k_plenv_global_version + fi + local v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW )); then + _p9k_plenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_PLENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PERL_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_plenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[plenv]:-${${+functions[plenv]}:#0}}' +} + +################################################################ +# Segment to display perlbrew information +# https://github.com/gugod/App-perlbrew + +prompt_perlbrew() { + if (( _POWERLEVEL9K_PERLBREW_PROJECT_ONLY )); then + _p9k_upglob 'cpanfile|.perltidyrc|(|MY)META.(yml|json)|(Makefile|Build).PL|*.(pl|pm|t|pod)' -. && return + fi + + local v=$PERLBREW_PERL + (( _POWERLEVEL9K_PERLBREW_SHOW_PREFIX )) || v=${v#*-} + [[ -n $v ]] || return + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PERL_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_perlbrew_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$PERLBREW_PERL' +} + +################################################################ +# Segment to display chruby information +# see https://github.com/postmodern/chruby/issues/245 for chruby_auto issue with ZSH +prompt_chruby() { + local v=${(M)RUBY_ENGINE:#$~_POWERLEVEL9K_CHRUBY_SHOW_ENGINE_PATTERN} + [[ $_POWERLEVEL9K_CHRUBY_SHOW_VERSION == 1 && -n $RUBY_VERSION ]] && v+=${v:+ }$RUBY_VERSION + _p9k_prompt_segment "$0" "red" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_chruby_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$RUBY_ENGINE' +} + +################################################################ +# Segment to print an icon if user is root. +prompt_root_indicator() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "$0" "$_p9k_color1" "yellow" 'ROOT_ICON' 0 '${${(%):-%#}:#\%}' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_root_indicator() { prompt_root_indicator; } + +################################################################ +# Segment to display Rust version number +prompt_rust_version() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 darkorange $_p9k_color1 RUST_ICON 1 '$P9K_RUST_VERSION' '${P9K_RUST_VERSION//\%/%%}' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +function _p9k_prompt_rust_version_init() { + _p9k__async_segments_compute+='_p9k_rust_version_prefetch' + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[rustc]' +} + +_p9k_rust_version_prefetch() { + local rustc=$commands[rustc] + if [[ -z $rustc ]] || + { (( _POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY )) && _p9k_upglob Cargo.toml -. }; then + unset P9K_RUST_VERSION + return + fi + _p9k_worker_invoke rust_version \ + "_p9k_prompt_rust_version_compute ${(q)P9K_RUST_VERSION} ${(q)rustc} ${(q)_p9k__cwd_a}" +} + +_p9k_prompt_rust_version_compute() { + _p9k_worker_async \ + "_p9k_prompt_rust_version_async ${(q)1} ${(q)2} ${(q)3}" \ + _p9k_prompt_rust_version_sync +} + +_p9k_prompt_rust_version_async() { + typeset -g P9K_RUST_VERSION=$1 + local rustc=$2 cwd=$3 v + if pushd -q -- $cwd; then + { + v=${${"$($rustc --version)"#rustc }%% *} || v= + } always { + popd -q + } + fi + + [[ $v != $P9K_RUST_VERSION ]] || return + typeset -g P9K_RUST_VERSION=$v + _p9k_print_params P9K_RUST_VERSION + echo -E - 'reset=1' +} + +_p9k_prompt_rust_version_sync() { + if [[ -n $REPLY ]]; then + eval $REPLY + _p9k_worker_reply $REPLY + fi +} + +# RSpec test ratio +prompt_rspec_stats() { + if [[ -d app && -d spec ]]; then + local -a code=(app/**/*.rb(N)) + (( $#code )) || return + local tests=(spec/**/*.rb(N)) + _p9k_build_test_stats "$0" "$#code" "$#tests" "RSpec" 'TEST_ICON' + fi +} + +################################################################ +# Segment to display Ruby Version Manager information +prompt_rvm() { + [[ $GEM_HOME == *rvm* && $ruby_string != $rvm_path/bin/ruby ]] || return + local v=${GEM_HOME:t} + (( _POWERLEVEL9K_RVM_SHOW_GEMSET )) || v=${v%%${rvm_gemset_separator:-@}*} + (( _POWERLEVEL9K_RVM_SHOW_PREFIX )) || v=${v#*-} + [[ -n $v ]] || return + _p9k_prompt_segment "$0" "240" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_rvm_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[rvm-prompt]:-${${+functions[rvm-prompt]}:#0}}' +} + +################################################################ +# Segment to display SSH icon when connected +prompt_ssh() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment "$0" "$_p9k_color1" "yellow" 'SSH_ICON' 0 '' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_ssh_init() { + if (( ! P9K_SSH )); then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi +} + +instant_prompt_ssh() { + if (( ! P9K_SSH )); then + return + fi + prompt_ssh +} + +################################################################ +# Status: When an error occur, return the error code, or a cross icon if option is set +# Display an ok icon when no error occur, or hide the segment if option is set to false +prompt_status() { + if ! _p9k_cache_get $0 $_p9k__status $_p9k__pipestatus; then + (( _p9k__status )) && local state=ERROR || local state=OK + if (( _POWERLEVEL9K_STATUS_EXTENDED_STATES )); then + if (( _p9k__status )); then + if (( $#_p9k__pipestatus > 1 )); then + state+=_PIPE + elif (( _p9k__status > 128 )); then + state+=_SIGNAL + fi + elif [[ "$_p9k__pipestatus" == *[1-9]* ]]; then + state+=_PIPE + fi + fi + _p9k__cache_val=(:) + if (( _POWERLEVEL9K_STATUS_$state )); then + if (( _POWERLEVEL9K_STATUS_SHOW_PIPESTATUS )); then + local text=${(j:|:)${(@)_p9k__pipestatus:/(#b)(*)/$_p9k_exitcode2str[$match[1]+1]}} + else + local text=$_p9k_exitcode2str[_p9k__status+1] + fi + if (( _p9k__status )); then + if (( !_POWERLEVEL9K_STATUS_CROSS && _POWERLEVEL9K_STATUS_VERBOSE )); then + _p9k__cache_val=($0_$state red yellow1 CARRIAGE_RETURN_ICON 0 '' "$text") + else + _p9k__cache_val=($0_$state $_p9k_color1 red FAIL_ICON 0 '' '') + fi + elif (( _POWERLEVEL9K_STATUS_VERBOSE || _POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE )); then + [[ $state == OK ]] && text='' + _p9k__cache_val=($0_$state "$_p9k_color1" green OK_ICON 0 '' "$text") + fi + fi + if (( $#_p9k__pipestatus < 3 )); then + _p9k_cache_set "${(@)_p9k__cache_val}" + fi + fi + _p9k_prompt_segment "${(@)_p9k__cache_val}" +} + +instant_prompt_status() { + if (( _POWERLEVEL9K_STATUS_OK )); then + _p9k_prompt_segment prompt_status_OK "$_p9k_color1" green OK_ICON 0 '' '' + fi +} + +prompt_prompt_char() { + local saved=$_p9k__prompt_char_saved[$_p9k__prompt_side$_p9k__segment_index$((!_p9k__status))] + if [[ -n $saved ]]; then + _p9k__prompt+=$saved + return + fi + local -i len=$#_p9k__prompt _p9k__has_upglob + if (( __p9k_sh_glob )); then + if (( _p9k__status )); then + if (( _POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE )); then + _p9k_prompt_segment $0_ERROR_VIINS "$_p9k_color1" 196 '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*overwrite*}}' 'โฏ' + _p9k_prompt_segment $0_ERROR_VIOWR "$_p9k_color1" 196 '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*insert*}}' 'โ–ถ' + else + _p9k_prompt_segment $0_ERROR_VIINS "$_p9k_color1" 196 '' 0 '${${${${_p9k__keymap:#vicmd}:#vivis}:#vivli}}' 'โฏ' + fi + _p9k_prompt_segment $0_ERROR_VICMD "$_p9k_color1" 196 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' 'โฎ' + _p9k_prompt_segment $0_ERROR_VIVIS "$_p9k_color1" 196 '' 0 '${$((! ${#${${${${:-$_p9k__keymap$_p9k__region_active}:#vicmd1}:#vivis?}:#vivli?}})):#0}' 'โ…ค' + else + if (( _POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE )); then + _p9k_prompt_segment $0_OK_VIINS "$_p9k_color1" 76 '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*overwrite*}}' 'โฏ' + _p9k_prompt_segment $0_OK_VIOWR "$_p9k_color1" 76 '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*insert*}}' 'โ–ถ' + else + _p9k_prompt_segment $0_OK_VIINS "$_p9k_color1" 76 '' 0 '${${${${_p9k__keymap:#vicmd}:#vivis}:#vivli}}' 'โฏ' + fi + _p9k_prompt_segment $0_OK_VICMD "$_p9k_color1" 76 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' 'โฎ' + _p9k_prompt_segment $0_OK_VIVIS "$_p9k_color1" 76 '' 0 '${$((! ${#${${${${:-$_p9k__keymap$_p9k__region_active}:#vicmd1}:#vivis?}:#vivli?}})):#0}' 'โ…ค' + fi + else + if (( _p9k__status )); then + if (( _POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE )); then + _p9k_prompt_segment $0_ERROR_VIINS "$_p9k_color1" 196 '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*overwrite*)}' 'โฏ' + _p9k_prompt_segment $0_ERROR_VIOWR "$_p9k_color1" 196 '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*insert*)}' 'โ–ถ' + else + _p9k_prompt_segment $0_ERROR_VIINS "$_p9k_color1" 196 '' 0 '${_p9k__keymap:#(vicmd|vivis|vivli)}' 'โฏ' + fi + _p9k_prompt_segment $0_ERROR_VICMD "$_p9k_color1" 196 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' 'โฎ' + _p9k_prompt_segment $0_ERROR_VIVIS "$_p9k_color1" 196 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#(vicmd1|vivis?|vivli?)}' 'โ…ค' + else + if (( _POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE )); then + _p9k_prompt_segment $0_OK_VIINS "$_p9k_color1" 76 '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*overwrite*)}' 'โฏ' + _p9k_prompt_segment $0_OK_VIOWR "$_p9k_color1" 76 '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*insert*)}' 'โ–ถ' + else + _p9k_prompt_segment $0_OK_VIINS "$_p9k_color1" 76 '' 0 '${_p9k__keymap:#(vicmd|vivis|vivli)}' 'โฏ' + fi + _p9k_prompt_segment $0_OK_VICMD "$_p9k_color1" 76 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' 'โฎ' + _p9k_prompt_segment $0_OK_VIVIS "$_p9k_color1" 76 '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#(vicmd1|vivis?|vivli?)}' 'โ…ค' + fi + fi + (( _p9k__has_upglob )) || _p9k__prompt_char_saved[$_p9k__prompt_side$_p9k__segment_index$((!_p9k__status))]=$_p9k__prompt[len+1,-1] +} + +instant_prompt_prompt_char() { + _p9k_prompt_segment prompt_prompt_char_OK_VIINS "$_p9k_color1" 76 '' 0 '' 'โฏ' +} + +################################################################ +# Segment to display Swap information +prompt_swap() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 yellow "$_p9k_color1" SWAP_ICON 1 '$_p9k__swap_used' '$_p9k__swap_used' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +function _p9k_prompt_swap_init() { + if [[ $_p9k_os == OSX && $+commands[sysctl] == 0 || $_p9k_os != OSX && ! -r /proc/meminfo ]]; then + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + return + fi + typeset -g _p9k__swap_used= + _p9k__async_segments_compute+='_p9k_worker_invoke swap _p9k_prompt_swap_compute' +} + +_p9k_prompt_swap_compute() { + _p9k_worker_async _p9k_prompt_swap_async _p9k_prompt_swap_sync +} + +_p9k_prompt_swap_async() { + local -F used_bytes + + if [[ "$_p9k_os" == "OSX" ]]; then + (( $+commands[sysctl] )) || return + [[ "$(sysctl vm.swapusage 2>/dev/null)" =~ "used = ([0-9,.]+)([A-Z]+)" ]] || return + used_bytes=${match[1]//,/.} + case ${match[2]} in + 'K') (( used_bytes *= 1024 ));; + 'M') (( used_bytes *= 1048576 ));; + 'G') (( used_bytes *= 1073741824 ));; + 'T') (( used_bytes *= 1099511627776 ));; + *) return 0;; + esac + else + local meminfo && meminfo="$(grep -F 'Swap' /proc/meminfo 2>/dev/null)" || return + [[ $meminfo =~ 'SwapTotal:[[:space:]]+([0-9]+)' ]] || return + (( used_bytes+=match[1] )) + [[ $meminfo =~ 'SwapFree:[[:space:]]+([0-9]+)' ]] || return + (( used_bytes-=match[1] )) + (( used_bytes *= 1024 )) + fi + + (( used_bytes >= 0 || (used_bytes = 0) )) + + _p9k_human_readable_bytes $used_bytes + [[ $_p9k__ret != $_p9k__swap_used ]] || return + _p9k__swap_used=$_p9k__ret + _p9k_print_params _p9k__swap_used + echo -E - 'reset=1' +} + +_p9k_prompt_swap_sync() { + eval $REPLY + _p9k_worker_reply $REPLY +} + +################################################################ +# Symfony2-PHPUnit test ratio +prompt_symfony2_tests() { + if [[ -d src && -d app && -f app/AppKernel.php ]]; then + local -a all=(src/**/*.php(N)) + local -a code=(${(@)all##*Tests*}) + (( $#code )) || return + _p9k_build_test_stats "$0" "$#code" "$(($#all - $#code))" "SF2" 'TEST_ICON' + fi +} + +################################################################ +# Segment to display Symfony2-Version +prompt_symfony2_version() { + if [[ -r app/bootstrap.php.cache ]]; then + local v="${$(grep -F " VERSION " app/bootstrap.php.cache 2>/dev/null)//[![:digit:].]}" + _p9k_prompt_segment "$0" "grey35" "$_p9k_color1" 'SYMFONY_ICON' 0 '' "${v//\%/%%}" + fi +} + +################################################################ +# Show a ratio of tests vs code +_p9k_build_test_stats() { + local code_amount="$2" + local tests_amount="$3" + local headline="$4" + + (( code_amount > 0 )) || return + local -F 2 ratio=$(( 100. * tests_amount / code_amount )) + + (( ratio >= 75 )) && _p9k_prompt_segment "${1}_GOOD" "cyan" "$_p9k_color1" "$5" 0 '' "$headline: $ratio%%" + (( ratio >= 50 && ratio < 75 )) && _p9k_prompt_segment "$1_AVG" "yellow" "$_p9k_color1" "$5" 0 '' "$headline: $ratio%%" + (( ratio < 50 )) && _p9k_prompt_segment "$1_BAD" "red" "$_p9k_color1" "$5" 0 '' "$headline: $ratio%%" +} + +################################################################ +# System time +prompt_time() { + if (( _POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME )); then + _p9k_prompt_segment "$0" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 0 '' "$_POWERLEVEL9K_TIME_FORMAT" + else + if [[ $_p9k__refresh_reason == precmd ]]; then + if [[ $+__p9k_instant_prompt_active == 1 && $__p9k_instant_prompt_time_format == $_POWERLEVEL9K_TIME_FORMAT ]]; then + _p9k__time=${__p9k_instant_prompt_time//\%/%%} + else + _p9k__time=${${(%)_POWERLEVEL9K_TIME_FORMAT}//\%/%%} + fi + fi + if (( _POWERLEVEL9K_TIME_UPDATE_ON_COMMAND )); then + _p9k_escape $_p9k__time + local t=$_p9k__ret + _p9k_escape $_POWERLEVEL9K_TIME_FORMAT + _p9k_prompt_segment "$0" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 1 '' \ + "\${_p9k__line_finished-$t}\${_p9k__line_finished+$_p9k__ret}" + else + _p9k_prompt_segment "$0" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 0 '' $_p9k__time + fi + fi +} + +instant_prompt_time() { + _p9k_escape $_POWERLEVEL9K_TIME_FORMAT + local stash='${${__p9k_instant_prompt_time::=${(%)${__p9k_instant_prompt_time_format::='$_p9k__ret'}}}+}' + _p9k_escape $_POWERLEVEL9K_TIME_FORMAT + _p9k_prompt_segment prompt_time "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 1 '' $stash$_p9k__ret +} + +_p9k_prompt_time_init() { + (( _POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME )) || return + _p9k__async_segments_compute+='_p9k_worker_invoke time _p9k_prompt_time_compute' +} + +_p9k_prompt_time_compute() { + _p9k_worker_async _p9k_prompt_time_async _p9k_prompt_time_sync +} + +_p9k_prompt_time_async() { + sleep 1 || true +} + +_p9k_prompt_time_sync() { + _p9k_worker_reply '_p9k_worker_invoke _p9k_prompt_time_compute _p9k_prompt_time_compute; reset=1' +} + +################################################################ +# System date +prompt_date() { + if [[ $_p9k__refresh_reason == precmd ]]; then + if [[ $+__p9k_instant_prompt_active == 1 && $__p9k_instant_prompt_date_format == $_POWERLEVEL9K_DATE_FORMAT ]]; then + _p9k__date=${__p9k_instant_prompt_date//\%/%%} + else + _p9k__date=${${(%)_POWERLEVEL9K_DATE_FORMAT}//\%/%%} + fi + fi + _p9k_prompt_segment "$0" "$_p9k_color2" "$_p9k_color1" "DATE_ICON" 0 '' "$_p9k__date" +} + +instant_prompt_date() { + _p9k_escape $_POWERLEVEL9K_DATE_FORMAT + local stash='${${__p9k_instant_prompt_date::=${(%)${__p9k_instant_prompt_date_format::='$_p9k__ret'}}}+}' + _p9k_escape $_POWERLEVEL9K_DATE_FORMAT + _p9k_prompt_segment prompt_date "$_p9k_color2" "$_p9k_color1" "DATE_ICON" 1 '' $stash$_p9k__ret +} + +################################################################ +# todo.sh: shows the number of tasks in your todo.sh file +prompt_todo() { + unset P9K_TODO_TOTAL_TASK_COUNT P9K_TODO_FILTERED_TASK_COUNT + [[ -r $_p9k__todo_file && -x $_p9k__todo_command ]] || return + if ! _p9k_cache_stat_get $0 $_p9k__todo_file; then + local count="$($_p9k__todo_command -p ls | command tail -1)" + if [[ $count == (#b)'TODO: '([[:digit:]]##)' of '([[:digit:]]##)' '* ]]; then + _p9k_cache_stat_set 1 $match[1] $match[2] + else + _p9k_cache_stat_set 0 + fi + fi + (( $_p9k__cache_val[1] )) || return + typeset -gi P9K_TODO_FILTERED_TASK_COUNT=$_p9k__cache_val[2] + typeset -gi P9K_TODO_TOTAL_TASK_COUNT=$_p9k__cache_val[3] + if (( (P9K_TODO_TOTAL_TASK_COUNT || !_POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL) && + (P9K_TODO_FILTERED_TASK_COUNT || !_POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED) )); then + if (( P9K_TODO_TOTAL_TASK_COUNT == P9K_TODO_FILTERED_TASK_COUNT )); then + local text=$P9K_TODO_TOTAL_TASK_COUNT + else + local text="$P9K_TODO_FILTERED_TASK_COUNT/$P9K_TODO_TOTAL_TASK_COUNT" + fi + _p9k_prompt_segment "$0" "grey50" "$_p9k_color1" 'TODO_ICON' 0 '' "$text" + fi +} + +_p9k_prompt_todo_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$_p9k__todo_file' +} + +################################################################ +# VCS segment: shows the state of your repository, if you are in a folder under +# version control + +# The vcs segment can have 4 different states - defaults to 'CLEAN'. +typeset -gA __p9k_vcs_states=( + 'CLEAN' '2' + 'MODIFIED' '3' + 'UNTRACKED' '2' + 'LOADING' '8' + 'CONFLICTED' '3' +) + +function +vi-git-untracked() { + [[ -z "${vcs_comm[gitdir]}" || "${vcs_comm[gitdir]}" == "." ]] && return + + # get the root for the current repo or submodule + local repoTopLevel="$(git rev-parse --show-toplevel 2> /dev/null)" + # dump out if we're outside a git repository (which includes being in the .git folder) + [[ $? != 0 || -z $repoTopLevel ]] && return + + local untrackedFiles="$(git ls-files --others --exclude-standard "${repoTopLevel}" 2> /dev/null)" + + if [[ -z $untrackedFiles && $_POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY == 1 ]]; then + untrackedFiles+="$(git submodule foreach --quiet --recursive 'git ls-files --others --exclude-standard' 2> /dev/null)" + fi + + [[ -z $untrackedFiles ]] && return + + hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" + VCS_WORKDIR_HALF_DIRTY=true +} + +function +vi-git-aheadbehind() { + local ahead behind + local -a gitstatus + + # for git prior to 1.7 + # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) + ahead="$(git rev-list --count "${hook_com[branch]}"@{upstream}..HEAD 2>/dev/null)" + (( ahead )) && gitstatus+=( " $(print_icon 'VCS_OUTGOING_CHANGES_ICON')${ahead// /}" ) + + # for git prior to 1.7 + # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) + behind="$(git rev-list --count HEAD.."${hook_com[branch]}"@{upstream} 2>/dev/null)" + (( behind )) && gitstatus+=( " $(print_icon 'VCS_INCOMING_CHANGES_ICON')${behind// /}" ) + + hook_com[misc]+=${(j::)gitstatus} +} + +function +vi-git-remotebranch() { + local remote + local branch_name="${hook_com[branch]}" + + # Are we on a remote-tracking branch? + remote="$(git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)" + remote=${remote/refs\/(remotes|heads)\/} + + if (( $+_POWERLEVEL9K_VCS_SHORTEN_LENGTH && $+_POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH )); then + if (( ${#hook_com[branch]} > _POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH && ${#hook_com[branch]} > _POWERLEVEL9K_VCS_SHORTEN_LENGTH )); then + case $_POWERLEVEL9K_VCS_SHORTEN_STRATEGY in + truncate_middle) + hook_com[branch]="${branch_name:0:$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}${_POWERLEVEL9K_VCS_SHORTEN_DELIMITER}${branch_name: -$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}" + ;; + truncate_from_right) + hook_com[branch]="${branch_name:0:$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}${_POWERLEVEL9K_VCS_SHORTEN_DELIMITER}" + ;; + esac + fi + fi + + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + hook_com[branch]="${hook_com[branch]}" + else + hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${hook_com[branch]}" + fi + # Always show the remote + #if [[ -n ${remote} ]] ; then + # Only show the remote if it differs from the local + if [[ -n ${remote} ]] && [[ "${remote#*/}" != "${branch_name}" ]] ; then + hook_com[branch]+="$(print_icon 'VCS_REMOTE_BRANCH_ICON')${remote// /}" + fi +} + +function +vi-git-tagname() { + if (( !_POWERLEVEL9K_VCS_HIDE_TAGS )); then + # If we are on a tag, append the tagname to the current branch string. + local tag + tag="$(git describe --tags --exact-match HEAD 2>/dev/null)" + + if [[ -n "${tag}" ]] ; then + # There is a tag that points to our current commit. Need to determine if we + # are also on a branch, or are in a DETACHED_HEAD state. + if [[ -z "$(git symbolic-ref HEAD 2>/dev/null)" ]]; then + # DETACHED_HEAD state. We want to append the tag name to the commit hash + # and print it. Unfortunately, `vcs_info` blows away the hash when a tag + # exists, so we have to manually retrieve it and clobber the branch + # string. + local revision + revision="$(git rev-list -n 1 --abbrev-commit --abbrev=${_POWERLEVEL9K_CHANGESET_HASH_LENGTH} HEAD)" + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + hook_com[branch]="${revision} $(print_icon 'VCS_TAG_ICON')${tag}" + else + hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${revision} $(print_icon 'VCS_TAG_ICON')${tag}" + fi + else + # We are on both a tag and a branch; print both by appending the tag name. + hook_com[branch]+=" $(print_icon 'VCS_TAG_ICON')${tag}" + fi + fi + fi +} + +# Show count of stashed changes +# Port from https://github.com/whiteinge/dotfiles/blob/5dfd08d30f7f2749cfc60bc55564c6ea239624d9/.zsh_shouse_prompt#L268 +function +vi-git-stash() { + if [[ -s "${vcs_comm[gitdir]}/logs/refs/stash" ]] ; then + local -a stashes=( "${(@f)"$(<${vcs_comm[gitdir]}/logs/refs/stash)"}" ) + hook_com[misc]+=" $(print_icon 'VCS_STASH_ICON')${#stashes}" + fi +} + +function +vi-hg-bookmarks() { + if [[ -n "${hgbmarks[@]}" ]]; then + hook_com[hg-bookmark-string]=" $(print_icon 'VCS_BOOKMARK_ICON')${hgbmarks[@]}" + + # To signal that we want to use the string we just generated, set the special + # variable `ret' to something other than the default zero: + ret=1 + return 0 + fi +} + +function +vi-vcs-detect-changes() { + if [[ "${hook_com[vcs]}" == "git" ]]; then + local remote="$(git ls-remote --get-url 2> /dev/null)" + _p9k_vcs_icon "$remote" + vcs_visual_identifier=$_p9k__ret + elif [[ "${hook_com[vcs]}" == "hg" ]]; then + vcs_visual_identifier='VCS_HG_ICON' + elif [[ "${hook_com[vcs]}" == "svn" ]]; then + vcs_visual_identifier='VCS_SVN_ICON' + fi + + if [[ -n "${hook_com[staged]}" ]] || [[ -n "${hook_com[unstaged]}" ]]; then + VCS_WORKDIR_DIRTY=true + else + VCS_WORKDIR_DIRTY=false + fi +} + +function +vi-svn-detect-changes() { + local svn_status="$(svn status)" + if [[ -n "$(echo "$svn_status" | \grep \^\?)" ]]; then + hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" + VCS_WORKDIR_HALF_DIRTY=true + fi + if [[ -n "$(echo "$svn_status" | \grep \^\M)" ]]; then + hook_com[unstaged]+=" $(print_icon 'VCS_UNSTAGED_ICON')" + VCS_WORKDIR_DIRTY=true + fi + if [[ -n "$(echo "$svn_status" | \grep \^\A)" ]]; then + hook_com[staged]+=" $(print_icon 'VCS_STAGED_ICON')" + VCS_WORKDIR_DIRTY=true + fi +} + +_p9k_vcs_info_init() { + autoload -Uz vcs_info + + local prefix='' + if (( _POWERLEVEL9K_SHOW_CHANGESET )); then + _p9k_get_icon '' VCS_COMMIT_ICON + prefix="$_p9k__ret%0.${_POWERLEVEL9K_CHANGESET_HASH_LENGTH}i " + fi + + zstyle ':vcs_info:*' check-for-changes true + + zstyle ':vcs_info:*' formats "$prefix%b%c%u%m" + zstyle ':vcs_info:*' actionformats "%b %F{$_POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}| %a%f" + _p9k_get_icon '' VCS_STAGED_ICON + zstyle ':vcs_info:*' stagedstr " $_p9k__ret" + _p9k_get_icon '' VCS_UNSTAGED_ICON + zstyle ':vcs_info:*' unstagedstr " $_p9k__ret" + zstyle ':vcs_info:git*+set-message:*' hooks $_POWERLEVEL9K_VCS_GIT_HOOKS + zstyle ':vcs_info:hg*+set-message:*' hooks $_POWERLEVEL9K_VCS_HG_HOOKS + zstyle ':vcs_info:svn*+set-message:*' hooks $_POWERLEVEL9K_VCS_SVN_HOOKS + + # For Hg, only show the branch name + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + zstyle ':vcs_info:hg*:*' branchformat "%b" + else + _p9k_get_icon '' VCS_BRANCH_ICON + zstyle ':vcs_info:hg*:*' branchformat "$_p9k__ret%b" + fi + # The `get-revision` function must be turned on for dirty-check to work for Hg + zstyle ':vcs_info:hg*:*' get-revision true + zstyle ':vcs_info:hg*:*' get-bookmarks true + zstyle ':vcs_info:hg*+gen-hg-bookmark-string:*' hooks hg-bookmarks + + # TODO: fix the %b (branch) format for svn. Using %b breaks color-encoding of the foreground + # for the rest of the powerline. + zstyle ':vcs_info:svn*:*' formats "$prefix%c%u" + zstyle ':vcs_info:svn*:*' actionformats "$prefix%c%u %F{$_POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}| %a%f" + + if (( _POWERLEVEL9K_SHOW_CHANGESET )); then + zstyle ':vcs_info:*' get-revision true + else + zstyle ':vcs_info:*' get-revision false + fi +} + +function _p9k_vcs_status_save() { + local z=$'\0' + _p9k__gitstatus_last[${${_p9k__git_dir:+GIT_DIR:$_p9k__git_dir}:-$VCS_STATUS_WORKDIR}]=\ +$VCS_STATUS_COMMIT$z$VCS_STATUS_LOCAL_BRANCH$z$VCS_STATUS_REMOTE_BRANCH$z$VCS_STATUS_REMOTE_NAME$z\ +$VCS_STATUS_REMOTE_URL$z$VCS_STATUS_ACTION$z$VCS_STATUS_INDEX_SIZE$z$VCS_STATUS_NUM_STAGED$z\ +$VCS_STATUS_NUM_UNSTAGED$z$VCS_STATUS_NUM_CONFLICTED$z$VCS_STATUS_NUM_UNTRACKED$z\ +$VCS_STATUS_HAS_STAGED$z$VCS_STATUS_HAS_UNSTAGED$z$VCS_STATUS_HAS_CONFLICTED$z\ +$VCS_STATUS_HAS_UNTRACKED$z$VCS_STATUS_COMMITS_AHEAD$z$VCS_STATUS_COMMITS_BEHIND$z\ +$VCS_STATUS_STASHES$z$VCS_STATUS_TAG$z$VCS_STATUS_NUM_UNSTAGED_DELETED$z\ +$VCS_STATUS_NUM_STAGED_NEW$z$VCS_STATUS_NUM_STAGED_DELETED$z$VCS_STATUS_PUSH_REMOTE_NAME$z\ +$VCS_STATUS_PUSH_REMOTE_URL$z$VCS_STATUS_PUSH_COMMITS_AHEAD$z$VCS_STATUS_PUSH_COMMITS_BEHIND$z\ +$VCS_STATUS_NUM_SKIP_WORKTREE$z$VCS_STATUS_NUM_ASSUME_UNCHANGED +} + +function _p9k_vcs_status_restore() { + for VCS_STATUS_COMMIT VCS_STATUS_LOCAL_BRANCH VCS_STATUS_REMOTE_BRANCH VCS_STATUS_REMOTE_NAME \ + VCS_STATUS_REMOTE_URL VCS_STATUS_ACTION VCS_STATUS_INDEX_SIZE VCS_STATUS_NUM_STAGED \ + VCS_STATUS_NUM_UNSTAGED VCS_STATUS_NUM_CONFLICTED VCS_STATUS_NUM_UNTRACKED \ + VCS_STATUS_HAS_STAGED VCS_STATUS_HAS_UNSTAGED VCS_STATUS_HAS_CONFLICTED \ + VCS_STATUS_HAS_UNTRACKED VCS_STATUS_COMMITS_AHEAD VCS_STATUS_COMMITS_BEHIND \ + VCS_STATUS_STASHES VCS_STATUS_TAG VCS_STATUS_NUM_UNSTAGED_DELETED VCS_STATUS_NUM_STAGED_NEW \ + VCS_STATUS_NUM_STAGED_DELETED VCS_STATUS_PUSH_REMOTE_NAME VCS_STATUS_PUSH_REMOTE_URL \ + VCS_STATUS_PUSH_COMMITS_AHEAD VCS_STATUS_PUSH_COMMITS_BEHIND VCS_STATUS_NUM_SKIP_WORKTREE \ + VCS_STATUS_NUM_ASSUME_UNCHANGED + in "${(@0)1}"; do done +} + +function _p9k_vcs_status_for_dir() { + if [[ -n $GIT_DIR ]]; then + _p9k__ret=$_p9k__gitstatus_last[GIT_DIR:$GIT_DIR] + [[ -n $_p9k__ret ]] + else + local dir=$_p9k__cwd_a + while true; do + _p9k__ret=$_p9k__gitstatus_last[$dir] + [[ -n $_p9k__ret ]] && return 0 + [[ $dir == (/|.) ]] && return 1 + dir=${dir:h} + done + fi +} + +function _p9k_vcs_status_purge() { + if [[ -n $_p9k__git_dir ]]; then + _p9k__gitstatus_last[GIT_DIR:$_p9k__git_dir]="" + else + local dir=$1 + while true; do + # unset doesn't work if $dir contains weird shit + _p9k__gitstatus_last[$dir]="" + _p9k_git_slow[$dir]="" + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi +} + +function _p9k_vcs_icon() { + local pat icon + for pat icon in "${(@)_POWERLEVEL9K_VCS_GIT_REMOTE_ICONS}"; do + if [[ $1 == $~pat ]]; then + _p9k__ret=$icon + return + fi + done + _p9k__ret= +} + +function _p9k_vcs_render() { + local state + + if (( $+_p9k__gitstatus_next_dir )); then + if _p9k_vcs_status_for_dir; then + _p9k_vcs_status_restore $_p9k__ret + state=LOADING + else + _p9k_prompt_segment prompt_vcs_LOADING "${__p9k_vcs_states[LOADING]}" "$_p9k_color1" VCS_LOADING_ICON 0 '' "$_POWERLEVEL9K_VCS_LOADING_TEXT" + return 0 + fi + elif [[ $VCS_STATUS_RESULT != ok-* ]]; then + return 1 + fi + + if (( _POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING )); then + if [[ -z $state ]]; then + if [[ $VCS_STATUS_HAS_CONFLICTED == 1 && $_POWERLEVEL9K_VCS_CONFLICTED_STATE == 1 ]]; then + state=CONFLICTED + elif [[ $VCS_STATUS_HAS_STAGED != 0 || $VCS_STATUS_HAS_UNSTAGED != 0 ]]; then + state=MODIFIED + elif [[ $VCS_STATUS_HAS_UNTRACKED != 0 ]]; then + state=UNTRACKED + else + state=CLEAN + fi + fi + _p9k_vcs_icon "$VCS_STATUS_REMOTE_URL" + _p9k_prompt_segment prompt_vcs_$state "${__p9k_vcs_states[$state]}" "$_p9k_color1" "$_p9k__ret" 0 '' "" + return 0 + fi + + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-untracked]} )) || VCS_STATUS_HAS_UNTRACKED=0 + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-aheadbehind]} )) || { VCS_STATUS_COMMITS_AHEAD=0 && VCS_STATUS_COMMITS_BEHIND=0 } + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-stash]} )) || VCS_STATUS_STASHES=0 + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-remotebranch]} )) || VCS_STATUS_REMOTE_BRANCH="" + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-tagname]} )) || VCS_STATUS_TAG="" + + (( _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM >= 0 && VCS_STATUS_COMMITS_AHEAD > _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM )) && + VCS_STATUS_COMMITS_AHEAD=$_POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM + + (( _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM >= 0 && VCS_STATUS_COMMITS_BEHIND > _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM )) && + VCS_STATUS_COMMITS_BEHIND=$_POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM + + local -a cache_key=( + "$VCS_STATUS_LOCAL_BRANCH" + "$VCS_STATUS_REMOTE_BRANCH" + "$VCS_STATUS_REMOTE_URL" + "$VCS_STATUS_ACTION" + "$VCS_STATUS_NUM_STAGED" + "$VCS_STATUS_NUM_UNSTAGED" + "$VCS_STATUS_NUM_UNTRACKED" + "$VCS_STATUS_HAS_CONFLICTED" + "$VCS_STATUS_HAS_STAGED" + "$VCS_STATUS_HAS_UNSTAGED" + "$VCS_STATUS_HAS_UNTRACKED" + "$VCS_STATUS_COMMITS_AHEAD" + "$VCS_STATUS_COMMITS_BEHIND" + "$VCS_STATUS_STASHES" + "$VCS_STATUS_TAG" + "$VCS_STATUS_NUM_UNSTAGED_DELETED" + ) + if [[ $_POWERLEVEL9K_SHOW_CHANGESET == 1 || -z $VCS_STATUS_LOCAL_BRANCH ]]; then + cache_key+=$VCS_STATUS_COMMIT + fi + + if ! _p9k_cache_ephemeral_get "$state" "${(@)cache_key}"; then + local icon + local content + + if (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)vcs-detect-changes]} )); then + if [[ $VCS_STATUS_HAS_CONFLICTED == 1 && $_POWERLEVEL9K_VCS_CONFLICTED_STATE == 1 ]]; then + : ${state:=CONFLICTED} + elif [[ $VCS_STATUS_HAS_STAGED != 0 || $VCS_STATUS_HAS_UNSTAGED != 0 ]]; then + : ${state:=MODIFIED} + elif [[ $VCS_STATUS_HAS_UNTRACKED != 0 ]]; then + : ${state:=UNTRACKED} + fi + + # It's weird that removing vcs-detect-changes from POWERLEVEL9K_VCS_GIT_HOOKS gets rid + # of the GIT icon. That's what vcs_info does, so we do the same in the name of compatibility. + _p9k_vcs_icon "$VCS_STATUS_REMOTE_URL" + icon=$_p9k__ret + fi + + : ${state:=CLEAN} + + function _$0_fmt() { + _p9k_vcs_style $state $1 + content+="$_p9k__ret$2" + } + + local ws + if [[ $_POWERLEVEL9K_SHOW_CHANGESET == 1 || -z $VCS_STATUS_LOCAL_BRANCH ]]; then + _p9k_get_icon prompt_vcs_$state VCS_COMMIT_ICON + _$0_fmt COMMIT "$_p9k__ret${${VCS_STATUS_COMMIT:0:$_POWERLEVEL9K_CHANGESET_HASH_LENGTH}:-HEAD}" + ws=' ' + fi + + if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then + local branch=$ws + if (( !_POWERLEVEL9K_HIDE_BRANCH_ICON )); then + _p9k_get_icon prompt_vcs_$state VCS_BRANCH_ICON + branch+=$_p9k__ret + fi + if (( $+_POWERLEVEL9K_VCS_SHORTEN_LENGTH && $+_POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH && + $#VCS_STATUS_LOCAL_BRANCH > _POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH && + $#VCS_STATUS_LOCAL_BRANCH > _POWERLEVEL9K_VCS_SHORTEN_LENGTH )) && + [[ $_POWERLEVEL9K_VCS_SHORTEN_STRATEGY == (truncate_middle|truncate_from_right) ]]; then + branch+=${VCS_STATUS_LOCAL_BRANCH[1,_POWERLEVEL9K_VCS_SHORTEN_LENGTH]//\%/%%}${_POWERLEVEL9K_VCS_SHORTEN_DELIMITER} + if [[ $_POWERLEVEL9K_VCS_SHORTEN_STRATEGY == truncate_middle ]]; then + _p9k_vcs_style $state BRANCH + branch+=${_p9k__ret}${VCS_STATUS_LOCAL_BRANCH[-_POWERLEVEL9K_VCS_SHORTEN_LENGTH,-1]//\%/%%} + fi + else + branch+=${VCS_STATUS_LOCAL_BRANCH//\%/%%} + fi + _$0_fmt BRANCH $branch + fi + + if [[ $_POWERLEVEL9K_VCS_HIDE_TAGS == 0 && -n $VCS_STATUS_TAG ]]; then + _p9k_get_icon prompt_vcs_$state VCS_TAG_ICON + _$0_fmt TAG " $_p9k__ret${VCS_STATUS_TAG//\%/%%}" + fi + + if [[ -n $VCS_STATUS_ACTION ]]; then + _$0_fmt ACTION " | ${VCS_STATUS_ACTION//\%/%%}" + else + if [[ -n $VCS_STATUS_REMOTE_BRANCH && + $VCS_STATUS_LOCAL_BRANCH != $VCS_STATUS_REMOTE_BRANCH ]]; then + _p9k_get_icon prompt_vcs_$state VCS_REMOTE_BRANCH_ICON + _$0_fmt REMOTE_BRANCH " $_p9k__ret${VCS_STATUS_REMOTE_BRANCH//\%/%%}" + fi + if [[ $VCS_STATUS_HAS_STAGED == 1 || $VCS_STATUS_HAS_UNSTAGED == 1 || $VCS_STATUS_HAS_UNTRACKED == 1 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_DIRTY_ICON + _$0_fmt DIRTY "$_p9k__ret" + if [[ $VCS_STATUS_HAS_STAGED == 1 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_STAGED_ICON + (( _POWERLEVEL9K_VCS_STAGED_MAX_NUM != 1 )) && _p9k__ret+=$VCS_STATUS_NUM_STAGED + _$0_fmt STAGED " $_p9k__ret" + fi + if [[ $VCS_STATUS_HAS_UNSTAGED == 1 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_UNSTAGED_ICON + (( _POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM != 1 )) && _p9k__ret+=$VCS_STATUS_NUM_UNSTAGED + _$0_fmt UNSTAGED " $_p9k__ret" + fi + if [[ $VCS_STATUS_HAS_UNTRACKED == 1 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_UNTRACKED_ICON + (( _POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM != 1 )) && _p9k__ret+=$VCS_STATUS_NUM_UNTRACKED + _$0_fmt UNTRACKED " $_p9k__ret" + fi + fi + if [[ $VCS_STATUS_COMMITS_BEHIND -gt 0 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_INCOMING_CHANGES_ICON + (( _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM != 1 )) && _p9k__ret+=$VCS_STATUS_COMMITS_BEHIND + _$0_fmt INCOMING_CHANGES " $_p9k__ret" + fi + if [[ $VCS_STATUS_COMMITS_AHEAD -gt 0 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_OUTGOING_CHANGES_ICON + (( _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM != 1 )) && _p9k__ret+=$VCS_STATUS_COMMITS_AHEAD + _$0_fmt OUTGOING_CHANGES " $_p9k__ret" + fi + if [[ $VCS_STATUS_STASHES -gt 0 ]]; then + _p9k_get_icon prompt_vcs_$state VCS_STASH_ICON + _$0_fmt STASH " $_p9k__ret$VCS_STATUS_STASHES" + fi + fi + + _p9k_cache_ephemeral_set "prompt_vcs_$state" "${__p9k_vcs_states[$state]}" "$_p9k_color1" "$icon" 0 '' "$content" + fi + + _p9k_prompt_segment "$_p9k__cache_val[@]" + return 0 +} + +function _p9k_maybe_ignore_git_repo() { + if [[ $VCS_STATUS_RESULT == ok-* && $VCS_STATUS_WORKDIR == $~_POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN ]]; then + VCS_STATUS_RESULT=norepo${VCS_STATUS_RESULT#ok} + fi +} + +function _p9k_vcs_resume() { + eval "$__p9k_intro" + + _p9k_maybe_ignore_git_repo + + if [[ $VCS_STATUS_RESULT == ok-async ]]; then + local latency=$((EPOCHREALTIME - _p9k__gitstatus_start_time)) + if (( latency > _POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then + _p9k_git_slow[${${_p9k__git_dir:+GIT_DIR:$_p9k__git_dir}:-$VCS_STATUS_WORKDIR}]=1 + elif (( $1 && latency < 0.8 * _POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then # 0.8 to avoid flip-flopping + _p9k_git_slow[${${_p9k__git_dir:+GIT_DIR:$_p9k__git_dir}:-$VCS_STATUS_WORKDIR}]=0 + fi + _p9k_vcs_status_save + fi + + if [[ -z $_p9k__gitstatus_next_dir ]]; then + unset _p9k__gitstatus_next_dir + case $VCS_STATUS_RESULT in + norepo-async) (( $1 )) && _p9k_vcs_status_purge $_p9k__cwd_a;; + ok-async) (( $1 )) || _p9k__gitstatus_next_dir=$_p9k__cwd_a;; + esac + fi + + if [[ -n $_p9k__gitstatus_next_dir ]]; then + _p9k__git_dir=$GIT_DIR + if ! gitstatus_query_p9k_ -d $_p9k__gitstatus_next_dir -t 0 -c '_p9k_vcs_resume 1' POWERLEVEL9K; then + unset _p9k__gitstatus_next_dir + unset VCS_STATUS_RESULT + else + _p9k_maybe_ignore_git_repo + case $VCS_STATUS_RESULT in + tout) _p9k__gitstatus_next_dir=''; _p9k__gitstatus_start_time=$EPOCHREALTIME;; + norepo-sync) _p9k_vcs_status_purge $_p9k__gitstatus_next_dir; unset _p9k__gitstatus_next_dir;; + ok-sync) _p9k_vcs_status_save; unset _p9k__gitstatus_next_dir;; + esac + fi + fi + + if (( _p9k_vcs_index && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + local _p9k__prompt _p9k__prompt_side=$_p9k_vcs_side _p9k__segment_name=vcs + local -i _p9k__has_upglob _p9k__segment_index=_p9k_vcs_index _p9k__line_index=_p9k_vcs_line_index + _p9k_vcs_render + typeset -g _p9k__vcs=$_p9k__prompt + else + _p9k__refresh_reason=gitstatus + _p9k_set_prompt + _p9k__refresh_reason='' + fi + _p9k_reset_prompt +} + +function _p9k_vcs_gitstatus() { + if [[ $_p9k__refresh_reason == precmd ]] && (( !_p9k__vcs_called )); then + typeset -gi _p9k__vcs_called=1 + if (( $+_p9k__gitstatus_next_dir )); then + _p9k__gitstatus_next_dir=$_p9k__cwd_a + else + local -F timeout=_POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS + if ! _p9k_vcs_status_for_dir; then + _p9k__git_dir=$GIT_DIR + gitstatus_query_p9k_ -d $_p9k__cwd_a -t $timeout -p -c '_p9k_vcs_resume 0' POWERLEVEL9K || return 1 + _p9k_maybe_ignore_git_repo + case $VCS_STATUS_RESULT in + tout) _p9k__gitstatus_next_dir=''; _p9k__gitstatus_start_time=$EPOCHREALTIME; return 0;; + norepo-sync) return 0;; + ok-sync) _p9k_vcs_status_save;; + esac + else + if [[ -n $GIT_DIR ]]; then + [[ $_p9k_git_slow[GIT_DIR:$GIT_DIR] == 1 ]] && timeout=0 + else + local dir=$_p9k__cwd_a + while true; do + case $_p9k_git_slow[$dir] in + "") [[ $dir == (/|.) ]] && break; dir=${dir:h};; + 0) break;; + 1) timeout=0; break;; + esac + done + fi + fi + (( _p9k__prompt_idx == 1 )) && timeout=0 + _p9k__git_dir=$GIT_DIR + if (( _p9k_vcs_index && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + if ! gitstatus_query_p9k_ -d $_p9k__cwd_a -t 0 -c '_p9k_vcs_resume 1' POWERLEVEL9K; then + unset VCS_STATUS_RESULT + return 1 + fi + typeset -gF _p9k__vcs_timeout=timeout + _p9k__gitstatus_next_dir='' + _p9k__gitstatus_start_time=$EPOCHREALTIME + return 0 + fi + if ! gitstatus_query_p9k_ -d $_p9k__cwd_a -t $timeout -c '_p9k_vcs_resume 1' POWERLEVEL9K; then + unset VCS_STATUS_RESULT + return 1 + fi + _p9k_maybe_ignore_git_repo + case $VCS_STATUS_RESULT in + tout) _p9k__gitstatus_next_dir=''; _p9k__gitstatus_start_time=$EPOCHREALTIME;; + norepo-sync) _p9k_vcs_status_purge $_p9k__cwd_a;; + ok-sync) _p9k_vcs_status_save;; + esac + fi + fi + return 0 +} + +################################################################ +# Segment to show VCS information + +prompt_vcs() { + if (( _p9k_vcs_index && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + _p9k__prompt+='${(e)_p9k__vcs}' + return + fi + + local -a backends=($_POWERLEVEL9K_VCS_BACKENDS) + if (( ${backends[(I)git]} && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )) && _p9k_vcs_gitstatus; then + _p9k_vcs_render && return + backends=(${backends:#git}) + fi + if (( $#backends )); then + VCS_WORKDIR_DIRTY=false + VCS_WORKDIR_HALF_DIRTY=false + local current_state="" + # Actually invoke vcs_info manually to gather all information. + zstyle ':vcs_info:*' enable ${backends} + vcs_info + local vcs_prompt="${vcs_info_msg_0_}" + if [[ -n "$vcs_prompt" ]]; then + if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then + # $vcs_visual_identifier gets set in +vi-vcs-detect-changes in functions/vcs.zsh, + # as we have there access to vcs_info internal hooks. + current_state='MODIFIED' + else + if [[ "$VCS_WORKDIR_HALF_DIRTY" == true ]]; then + current_state='UNTRACKED' + else + current_state='CLEAN' + fi + fi + _p9k_prompt_segment "${0}_${${(U)current_state}//ฤฐ/I}" "${__p9k_vcs_states[$current_state]}" "$_p9k_color1" "$vcs_visual_identifier" 0 '' "$vcs_prompt" + fi + fi +} + +################################################################ +# Vi Mode: show editing mode (NORMAL|INSERT|VISUAL) +prompt_vi_mode() { + local -i len=$#_p9k__prompt _p9k__has_upglob + if (( __p9k_sh_glob )); then + if (( $+_POWERLEVEL9K_VI_OVERWRITE_MODE_STRING )); then + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + _p9k_prompt_segment $0_INSERT "$_p9k_color1" blue '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*overwrite*}}' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" + fi + _p9k_prompt_segment $0_OVERWRITE "$_p9k_color1" blue '' 0 '${${${${${${:-$_p9k__keymap.$_p9k__zle_state}:#vicmd.*}:#vivis.*}:#vivli.*}:#*.*insert*}}' "$_POWERLEVEL9K_VI_OVERWRITE_MODE_STRING" + else + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + _p9k_prompt_segment $0_INSERT "$_p9k_color1" blue '' 0 '${${${${_p9k__keymap:#vicmd}:#vivis}:#vivli}}' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" + fi + fi + + if (( $+_POWERLEVEL9K_VI_VISUAL_MODE_STRING )); then + _p9k_prompt_segment $0_NORMAL "$_p9k_color1" white '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" + _p9k_prompt_segment $0_VISUAL "$_p9k_color1" white '' 0 '${$((! ${#${${${${:-$_p9k__keymap$_p9k__region_active}:#vicmd1}:#vivis?}:#vivli?}})):#0}' "$_POWERLEVEL9K_VI_VISUAL_MODE_STRING" + else + _p9k_prompt_segment $0_NORMAL "$_p9k_color1" white '' 0 '${$((! ${#${${${_p9k__keymap:#vicmd}:#vivis}:#vivli}})):#0}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" + fi + else + if (( $+_POWERLEVEL9K_VI_OVERWRITE_MODE_STRING )); then + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + _p9k_prompt_segment $0_INSERT "$_p9k_color1" blue '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*overwrite*)}' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" + fi + _p9k_prompt_segment $0_OVERWRITE "$_p9k_color1" blue '' 0 '${${:-$_p9k__keymap.$_p9k__zle_state}:#(vicmd.*|vivis.*|vivli.*|*.*insert*)}' "$_POWERLEVEL9K_VI_OVERWRITE_MODE_STRING" + else + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + _p9k_prompt_segment $0_INSERT "$_p9k_color1" blue '' 0 '${_p9k__keymap:#(vicmd|vivis|vivli)}' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" + fi + fi + + if (( $+_POWERLEVEL9K_VI_VISUAL_MODE_STRING )); then + _p9k_prompt_segment $0_NORMAL "$_p9k_color1" white '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#vicmd0}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" + _p9k_prompt_segment $0_VISUAL "$_p9k_color1" white '' 0 '${(M)${:-$_p9k__keymap$_p9k__region_active}:#(vicmd1|vivis?|vivli?)}' "$_POWERLEVEL9K_VI_VISUAL_MODE_STRING" + else + _p9k_prompt_segment $0_NORMAL "$_p9k_color1" white '' 0 '${(M)_p9k__keymap:#(vicmd|vivis|vivli)}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" + fi + fi + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +instant_prompt_vi_mode() { + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + _p9k_prompt_segment prompt_vi_mode_INSERT "$_p9k_color1" blue '' 0 '' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" + fi +} + +# Chezmoi shell indicator: https://www.chezmoi.io/ +prompt_chezmoi_shell() { + _p9k_prompt_segment $0 blue $_p9k_color1 CHEZMOI_ICON 0 '' '' +} + +_p9k_prompt_chezmoi_shell_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$CHEZMOI' +} + +function instant_prompt_chezmoi_shell() { + _p9k_prompt_segment prompt_chezmoi_shell blue $_p9k_color1 CHEZMOI_ICON 1 '$CHEZMOI_ICON' '' +} + +function _p9k_parse_virtualenv_cfg() { + typeset -ga reply=(0) + [[ -f $1 && -r $1 ]] || return + + local cfg + cfg=$(<$1) || return + + local -a match mbegin mend + [[ $'\n'$cfg$'\n' == (#b)*$'\n'prompt[$' \t']#=([^$'\n']#)$'\n'* ]] || return + local res=${${match[1]##[$' \t']#}%%[$' \t']#} + if [[ $res == (\"*\"|\'*\') ]]; then + # The string is quoted in python style, which isn't the same as quoting in zsh. + # For example, the literal 'foo"\'bar' denotes foo"'bar in python but in zsh + # it is malformed. + # + # We cheat a bit and impelement not exactly correct unquoting. It may produce + # different visual results but won't perform unintended expansions or bleed out + # any escape sequences. + # + # Note that venv performs unusual and obviously unintended expansions on the + # value of `prompt`: single-word expansions are performed twice by `activate`, + # and then again on every prompt if `prompt_subst` is in effect. While in general + # I am OK with being bug-compatible with other software, the bugs in venv are a + # bit too extreme for my comfort. I am going to disable all expansions and + # display the configured prompt literally. + res=${(Vg:e:)${res[2,-2]}} + fi + reply=(1 "$res") +} + +################################################################ +# Virtualenv: current working virtualenv +# More information on virtualenv (Python): +# https://virtualenv.pypa.io/en/latest/ +prompt_virtualenv() { + local msg='' + if (( _POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION )) && _p9k_python_version; then + msg="${_p9k__ret//\%/%%} " + fi + local cfg=$VIRTUAL_ENV/pyvenv.cfg + if ! _p9k_cache_stat_get $0 $cfg; then + local -a reply + _p9k_parse_virtualenv_cfg $cfg + _p9k_cache_stat_set "${reply[@]}" + fi + if (( _p9k__cache_val[1] )); then + local v=$_p9k__cache_val[2] + else + local v=${VIRTUAL_ENV:t} + if [[ $VIRTUAL_ENV_PROMPT == '('?*') ' && $VIRTUAL_ENV_PROMPT != "($v) " ]]; then + v=$VIRTUAL_ENV_PROMPT[2,-3] + elif [[ $v == $~_POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES ]]; then + v=${VIRTUAL_ENV:h:t} + fi + fi + msg+="$_POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER${v//\%/%%}$_POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER" + case $_POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV in + false) + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '${(M)${#P9K_PYENV_PYTHON_VERSION}:#0}' "$msg" + ;; + if-different) + _p9k_escape $v + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '${${:-'$_p9k__ret'}:#$_p9k__pyenv_version}' "$msg" + ;; + *) + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "$msg" + ;; + esac +} + +_p9k_prompt_virtualenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$VIRTUAL_ENV' +} + +# _p9k_read_pyenv_like_version_file [prefix] +function _p9k_read_pyenv_like_version_file() { + local -a stat + zstat -A stat +mtime -- $1 2>/dev/null || stat=(-1) + local cached=$_p9k__read_pyenv_like_version_file_cache[$1:$2] + if [[ $cached == $stat[1]:* ]]; then + _p9k__ret=${cached#*:} + else + local fd content + { + { sysopen -r -u fd -- $1 && sysread -i $fd -s 1024 content } 2>/dev/null + } always { + [[ -n $fd ]] && exec {fd}>&- + } + local MATCH + local versions=(${${${${(f)content}/(#m)*/${MATCH[(w)1]}}##\#*}#$2}) + _p9k__ret=${(j.:.)versions} + _p9k__read_pyenv_like_version_file_cache[$1:$2]=$stat[1]:$_p9k__ret + fi + [[ -n $_p9k__ret ]] +} + +function _p9k_pyenv_global_version() { + _p9k_read_pyenv_like_version_file ${PYENV_ROOT:-$HOME/.pyenv}/version python- || _p9k__ret=system +} + +function _p9k_pyenv_compute() { + unset P9K_PYENV_PYTHON_VERSION _p9k__pyenv_version + + local v=${(j.:.)${(@)${(s.:.)PYENV_VERSION}#python-}} + if [[ -n $v ]]; then + (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)shell]} )) || return + else + (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $PYENV_DIR != (|.) ]]; then + [[ $PYENV_DIR == /* ]] && local dir=$PYENV_DIR || local dir="$_p9k__cwd_a/$PYENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_pyenv_like_version_file $dir/.python-version python-; then + (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .python-version -. + local -i idx=$? + if (( idx )) && _p9k_read_pyenv_like_version_file $_p9k__parent_dirs[idx]/.python-version python-; then + (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)global]} )) || return + _p9k_pyenv_global_version + fi + v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW )); then + _p9k_pyenv_global_version + [[ $v == $_p9k__ret ]] && return 1 + fi + + if (( !_POWERLEVEL9K_PYENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return 1 + fi + + local versions=${PYENV_ROOT:-$HOME/.pyenv}/versions + versions=${versions:A} + local name version + for name in ${(s.:.)v}; do + version=$versions/$name + version=${version:A} + if [[ $version(#qN/) == (#b)$versions/([^/]##)* ]]; then + typeset -g P9K_PYENV_PYTHON_VERSION=$match[1] + break + fi + done + + typeset -g _p9k__pyenv_version=$v +} + +################################################################ +# Segment to display pyenv information +# https://github.com/pyenv/pyenv#choosing-the-python-version +prompt_pyenv() { + _p9k_pyenv_compute || return + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "${_p9k__pyenv_version//\%/%%}" +} + +_p9k_prompt_pyenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[pyenv]:-${${+functions[pyenv]}:#0}}' +} + +function _p9k_goenv_global_version() { + _p9k_read_pyenv_like_version_file ${GOENV_ROOT:-$HOME/.goenv}/version go- || _p9k__ret=system +} + +################################################################ +# Segment to display goenv information: https://github.com/syndbg/goenv +prompt_goenv() { + local v=${(j.:.)${(@)${(s.:.)GOENV_VERSION}#go-}} + if [[ -n $v ]]; then + (( ${_POWERLEVEL9K_GOENV_SOURCES[(I)shell]} )) || return + else + (( ${_POWERLEVEL9K_GOENV_SOURCES[(I)local|global]} )) || return + _p9k__ret= + if [[ $GOENV_DIR != (|.) ]]; then + [[ $GOENV_DIR == /* ]] && local dir=$GOENV_DIR || local dir="$_p9k__cwd_a/$GOENV_DIR" + dir=${dir:A} + if [[ $dir != $_p9k__cwd_a ]]; then + while true; do + if _p9k_read_pyenv_like_version_file $dir/.go-version go-; then + (( ${_POWERLEVEL9K_GOENV_SOURCES[(I)local]} )) || return + break + fi + [[ $dir == (/|.) ]] && break + dir=${dir:h} + done + fi + fi + if [[ -z $_p9k__ret ]]; then + _p9k_upglob .go-version -. + local -i idx=$? + if (( idx )) && _p9k_read_pyenv_like_version_file $_p9k__parent_dirs[idx]/.go-version go-; then + (( ${_POWERLEVEL9K_GOENV_SOURCES[(I)local]} )) || return + else + _p9k__ret= + fi + fi + if [[ -z $_p9k__ret ]]; then + (( _POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_GOENV_SOURCES[(I)global]} )) || return + _p9k_goenv_global_version + fi + v=$_p9k__ret + fi + + if (( !_POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW )); then + _p9k_goenv_global_version + [[ $v == $_p9k__ret ]] && return + fi + + if (( !_POWERLEVEL9K_GOENV_SHOW_SYSTEM )); then + [[ $v == system ]] && return + fi + + _p9k_prompt_segment "$0" "blue" "$_p9k_color1" 'GO_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_goenv_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[goenv]:-${${+functions[goenv]}:#0}}' +} + +################################################################ +# Display openfoam information +prompt_openfoam() { + if [[ -z "$WM_FORK" ]] ; then + _p9k_prompt_segment "$0" "yellow" "$_p9k_color1" '' 0 '' "OF: ${${WM_PROJECT_VERSION:t}//\%/%%}" + else + _p9k_prompt_segment "$0" "yellow" "$_p9k_color1" '' 0 '' "F-X: ${${WM_PROJECT_VERSION:t}//\%/%%}" + fi +} + +_p9k_prompt_openfoam_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$WM_PROJECT_VERSION' +} + +################################################################ +# Segment to display Swift version +prompt_swift_version() { + _p9k_cached_cmd 0 '' swift --version || return + [[ $_p9k__ret == (#b)[^[:digit:]]#([[:digit:].]##)* ]] || return + _p9k_prompt_segment "$0" "magenta" "white" 'SWIFT_ICON' 0 '' "${match[1]//\%/%%}" +} + +_p9k_prompt_swift_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[swift]' +} + +################################################################ +# dir_writable: Display information about the user's permission to write in the current directory +prompt_dir_writable() { + if [[ ! -w "$_p9k__cwd_a" ]]; then + _p9k_prompt_segment "$0_FORBIDDEN" "red" "yellow1" 'LOCK_ICON' 0 '' '' + fi +} + +instant_prompt_dir_writable() { prompt_dir_writable; } + +################################################################ +# Kubernetes Current Context/Namespace +prompt_kubecontext() { + if ! _p9k_cache_stat_get $0 ${(s.:.)${KUBECONFIG:-$HOME/.kube/config}}; then + local name namespace cluster user cloud_name cloud_account cloud_zone cloud_cluster text state + () { + local cfg && cfg=(${(f)"$(kubectl config view -o=yaml 2>/dev/null)"}) || return + local qstr='"*"' + local str='([^"'\''|>]*|'$qstr')' + local ctx=(${(@M)cfg:#current-context: $~str}) + (( $#ctx == 1 )) || return + name=${ctx[1]#current-context: } + local -i pos=${cfg[(i)contexts:]} + { + (( pos <= $#cfg )) || return + shift $pos cfg + pos=${cfg[(i) name: ${(b)name}]} + (( pos <= $#cfg )) || return + (( --pos )) + for ((; pos > 0; --pos)); do + local line=$cfg[pos] + if [[ $line == '- context:' ]]; then + return 0 + elif [[ $line == (#b)' cluster: '($~str) ]]; then + cluster=$match[1] + [[ $cluster == $~qstr ]] && cluster=$cluster[2,-2] + elif [[ $line == (#b)' namespace: '($~str) ]]; then + namespace=$match[1] + [[ $namespace == $~qstr ]] && namespace=$namespace[2,-2] + elif [[ $line == (#b)' user: '($~str) ]]; then + user=$match[1] + [[ $user == $~qstr ]] && user=$user[2,-2] + fi + done + } always { + [[ $name == $~qstr ]] && name=$name[2,-2] + } + } + if [[ -n $name ]]; then + : ${namespace:=default} + # gke_my-account_us-east1-a_cluster-01 + # gke_my-account_us-east1_cluster-01 + if [[ $cluster == (#b)gke_(?*)_(asia|australia|europe|northamerica|southamerica|us)-([a-z]##<->)(-[a-z]|)_(?*) ]]; then + cloud_name=gke + cloud_account=$match[1] + cloud_zone=$match[2]-$match[3]$match[4] + cloud_cluster=$match[5] + if (( ${_POWERLEVEL9K_KUBECONTEXT_SHORTEN[(I)gke]} )); then + text=$cloud_cluster + fi + # arn:aws:eks:us-east-1:123456789012:cluster/cluster-01 + elif [[ $cluster == (#b)arn:aws[[:alnum:]-]#:eks:([[:alnum:]-]##):([[:digit:]]##):cluster/(?*) ]]; then + cloud_name=eks + cloud_zone=$match[1] + cloud_account=$match[2] + cloud_cluster=$match[3] + if (( ${_POWERLEVEL9K_KUBECONTEXT_SHORTEN[(I)eks]} )); then + text=$cloud_cluster + fi + fi + if [[ -z $text ]]; then + text=$name + if [[ $_POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE == 1 || $namespace != (default|$name) ]]; then + text+="/$namespace" + fi + fi + local pat class + for pat class in "${_POWERLEVEL9K_KUBECONTEXT_CLASSES[@]}"; do + if [[ $text == ${~pat} ]]; then + [[ -n $class ]] && state=_${${(U)class}//ฤฐ/I} + break + fi + done + fi + _p9k_cache_stat_set "${(g::)name}" "${(g::)namespace}" "${(g::)cluster}" "${(g::)user}" "${(g::)cloud_name}" "${(g::)cloud_account}" "${(g::)cloud_zone}" "${(g::)cloud_cluster}" "${(g::)text}" "$state" + fi + + typeset -g P9K_KUBECONTEXT_NAME=$_p9k__cache_val[1] + typeset -g P9K_KUBECONTEXT_NAMESPACE=$_p9k__cache_val[2] + typeset -g P9K_KUBECONTEXT_CLUSTER=$_p9k__cache_val[3] + typeset -g P9K_KUBECONTEXT_USER=$_p9k__cache_val[4] + typeset -g P9K_KUBECONTEXT_CLOUD_NAME=$_p9k__cache_val[5] + typeset -g P9K_KUBECONTEXT_CLOUD_ACCOUNT=$_p9k__cache_val[6] + typeset -g P9K_KUBECONTEXT_CLOUD_ZONE=$_p9k__cache_val[7] + typeset -g P9K_KUBECONTEXT_CLOUD_CLUSTER=$_p9k__cache_val[8] + [[ -n $_p9k__cache_val[9] ]] || return + _p9k_prompt_segment $0$_p9k__cache_val[10] magenta white KUBERNETES_ICON 0 '' "${_p9k__cache_val[9]//\%/%%}" +} + +_p9k_prompt_kubecontext_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[kubectl]' +} + +################################################################ +# Dropbox status +prompt_dropbox() { + # The first column is just the directory, so cut it + local dropbox_status="$(dropbox-cli filestatus . | cut -d\ -f2-)" + + # Only show if the folder is tracked and dropbox is running + if [[ "$dropbox_status" != 'unwatched' && "$dropbox_status" != "isn't running!" ]]; then + # If "up to date", only show the icon + if [[ "$dropbox_status" =~ 'up to date' ]]; then + dropbox_status="" + fi + + _p9k_prompt_segment "$0" "white" "blue" "DROPBOX_ICON" 0 '' "${dropbox_status//\%/%%}" + fi +} + +_p9k_prompt_dropbox_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[dropbox-cli]' +} + +# print Java version number +prompt_java_version() { + if (( _POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY )); then + _p9k_upglob 'pom.xml|build.gradle.kts|build.sbt|deps.edn|project.clj|build.boot|*.(java|class|jar|gradle|clj|cljc)' -. && return + fi + + local java=$commands[java] + if ! _p9k_cache_stat_get $0 $java ${JAVA_HOME:+$JAVA_HOME/release}; then + local v + v="$(java -fullversion 2>&1)" || v= + v=${${v#*\"}%\"*} + (( _POWERLEVEL9K_JAVA_VERSION_FULL )) || v=${v%%-*} + _p9k_cache_stat_set "${v//\%/%%}" + fi + + [[ -n $_p9k__cache_val[1] ]] || return + _p9k_prompt_segment "$0" "red" "white" "JAVA_ICON" 0 '' $_p9k__cache_val[1] +} + +_p9k_prompt_java_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[java]' +} + +prompt_azure() { + local name cfg=${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json + if _p9k_cache_stat_get $0 $cfg; then + name=$_p9k__cache_val[1] + else + if (( $+commands[jq] )) && name="$(jq -r '[.subscriptions[]|select(.isDefault==true)|.name][]|strings' $cfg 2>/dev/null)"; then + name=${name%%$'\n'*} + elif ! name="$(az account show --query name --output tsv 2>/dev/null)"; then + name= + fi + _p9k_cache_stat_set "$name" + fi + [[ -n $name ]] || return + local pat class state + for pat class in "${_POWERLEVEL9K_AZURE_CLASSES[@]}"; do + if [[ $name == ${~pat} ]]; then + [[ -n $class ]] && state=_${${(U)class}//ฤฐ/I} + break + fi + done + _p9k_prompt_segment "$0$state" "blue" "white" "AZURE_ICON" 0 '' "${name//\%/%%}" +} + +_p9k_prompt_azure_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[az]' +} + +prompt_gcloud() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment \ + $0_PARTIAL blue white GCLOUD_ICON 1 \ + '${${(M)${#P9K_GCLOUD_PROJECT_NAME}:#0}:+$P9K_GCLOUD_ACCOUNT$P9K_GCLOUD_PROJECT_ID}' \ + '${P9K_GCLOUD_ACCOUNT//\%/%%}:${P9K_GCLOUD_PROJECT_ID//\%/%%}' + _p9k_prompt_segment \ + $0_COMPLETE blue white GCLOUD_ICON 1 \ + '$P9K_GCLOUD_PROJECT_NAME' \ + '${P9K_GCLOUD_ACCOUNT//\%/%%}:${P9K_GCLOUD_PROJECT_ID//\%/%%}' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_gcloud_prefetch() { + # P9K_GCLOUD_PROJECT is deprecated; it's always equal to P9K_GCLOUD_PROJECT_ID + unset P9K_GCLOUD_CONFIGURATION P9K_GCLOUD_ACCOUNT P9K_GCLOUD_PROJECT P9K_GCLOUD_PROJECT_ID P9K_GCLOUD_PROJECT_NAME + (( $+commands[gcloud] )) || return + _p9k_read_word ${CLOUDSDK_CONFIG:-~/.config/gcloud}/active_config || return + P9K_GCLOUD_CONFIGURATION=$_p9k__ret + if ! _p9k_cache_stat_get $0 ${CLOUDSDK_CONFIG:-~/.config/gcloud}/configurations/config_$P9K_GCLOUD_CONFIGURATION; then + local pair account project_id + pair="$(gcloud config configurations describe $P9K_GCLOUD_CONFIGURATION \ + --format=$'value[separator="\1"](properties.core.account,properties.core.project)')" + (( ! $? )) && IFS=$'\1' read account project_id <<<$pair + _p9k_cache_stat_set "$account" "$project_id" + fi + if [[ -n $_p9k__cache_val[1] ]]; then + P9K_GCLOUD_ACCOUNT=$_p9k__cache_val[1] + fi + if [[ -n $_p9k__cache_val[2] ]]; then + P9K_GCLOUD_PROJECT_ID=$_p9k__cache_val[2] + P9K_GCLOUD_PROJECT=$P9K_GCLOUD_PROJECT_ID # deprecated parameter; set for backward compatibility + fi + if [[ $P9K_GCLOUD_CONFIGURATION == $_p9k_gcloud_configuration && + $P9K_GCLOUD_ACCOUNT == $_p9k_gcloud_account && + $P9K_GCLOUD_PROJECT_ID == $_p9k_gcloud_project_id ]]; then + [[ -n $_p9k_gcloud_project_name ]] && P9K_GCLOUD_PROJECT_NAME=$_p9k_gcloud_project_name + if (( _POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS < 0 || + _p9k__gcloud_last_fetch_ts + _POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS > EPOCHREALTIME )); then + return + fi + else + _p9k_gcloud_configuration=$P9K_GCLOUD_CONFIGURATION + _p9k_gcloud_account=$P9K_GCLOUD_ACCOUNT + _p9k_gcloud_project_id=$P9K_GCLOUD_PROJECT_ID + _p9k_gcloud_project_name= + _p9k__state_dump_scheduled=1 + fi + [[ -n $P9K_GCLOUD_CONFIGURATION && -n $P9K_GCLOUD_ACCOUNT && -n $P9K_GCLOUD_PROJECT_ID ]] || return + _p9k__gcloud_last_fetch_ts=EPOCHREALTIME + _p9k_worker_invoke gcloud "_p9k_prompt_gcloud_compute ${(q)commands[gcloud]} ${(q)P9K_GCLOUD_CONFIGURATION} ${(q)P9K_GCLOUD_ACCOUNT} ${(q)P9K_GCLOUD_PROJECT_ID}" +} + +_p9k_prompt_gcloud_init() { + _p9k__async_segments_compute+=_p9k_gcloud_prefetch + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[gcloud]' +} + +_p9k_prompt_gcloud_compute() { + local gcloud=$1 + P9K_GCLOUD_CONFIGURATION=$2 + P9K_GCLOUD_ACCOUNT=$3 + P9K_GCLOUD_PROJECT_ID=$4 + _p9k_worker_async "_p9k_prompt_gcloud_async ${(q)gcloud}" _p9k_prompt_gcloud_sync +} + +_p9k_prompt_gcloud_async() { + local gcloud=$1 + $gcloud projects describe $P9K_GCLOUD_PROJECT_ID --configuration=$P9K_GCLOUD_CONFIGURATION \ + --account=$P9K_GCLOUD_ACCOUNT --format='value(name)' +} + +_p9k_prompt_gcloud_sync() { + _p9k_worker_reply "_p9k_prompt_gcloud_update ${(q)P9K_GCLOUD_CONFIGURATION} ${(q)P9K_GCLOUD_ACCOUNT} ${(q)P9K_GCLOUD_PROJECT_ID} ${(q)REPLY%$'\n'}" +} + +_p9k_prompt_gcloud_update() { + [[ $1 == $P9K_GCLOUD_CONFIGURATION && + $2 == $P9K_GCLOUD_ACCOUNT && + $3 == $P9K_GCLOUD_PROJECT_ID && + $4 != $P9K_GCLOUD_PROJECT_NAME ]] || return + [[ -n $4 ]] && P9K_GCLOUD_PROJECT_NAME=$4 || unset P9K_GCLOUD_PROJECT_NAME + _p9k_gcloud_project_name=$P9K_GCLOUD_PROJECT_NAME + _p9k__state_dump_scheduled=1 + reset=1 +} + +prompt_google_app_cred() { + unset P9K_GOOGLE_APP_CRED_{TYPE,PROJECT_ID,CLIENT_EMAIL} + + if ! _p9k_cache_stat_get $0 $GOOGLE_APPLICATION_CREDENTIALS; then + local -a lines + local q='[.type//"", .project_id//"", .client_email//"", 0][]' + if lines=("${(@f)$(jq -r $q <$GOOGLE_APPLICATION_CREDENTIALS 2>/dev/null)}") && (( $#lines == 4 )); then + local text="${(j.:.)lines[1,-2]}" + local pat class state + for pat class in "${_POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES[@]}"; do + if [[ $text == ${~pat} ]]; then + [[ -n $class ]] && state=_${${(U)class}//ฤฐ/I} + break + fi + done + _p9k_cache_stat_set 1 "${(@)lines[1,-2]}" "$text" "$state" + else + _p9k_cache_stat_set 0 + fi + fi + + (( _p9k__cache_val[1] )) || return + P9K_GOOGLE_APP_CRED_TYPE=$_p9k__cache_val[2] + P9K_GOOGLE_APP_CRED_PROJECT_ID=$_p9k__cache_val[3] + P9K_GOOGLE_APP_CRED_CLIENT_EMAIL=$_p9k__cache_val[4] + _p9k_prompt_segment "$0$_p9k__cache_val[6]" "blue" "white" "GCLOUD_ICON" 0 '' "$_p9k__cache_val[5]" +} + +_p9k_prompt_google_app_cred_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${GOOGLE_APPLICATION_CREDENTIALS:+$commands[jq]}' +} + +typeset -gra __p9k_nordvpn_tag=( + P9K_NORDVPN_STATUS + P9K_NORDVPN_TECHNOLOGY + P9K_NORDVPN_PROTOCOL + P9K_NORDVPN_IP_ADDRESS + P9K_NORDVPN_SERVER + P9K_NORDVPN_COUNTRY + P9K_NORDVPN_CITY +) + +function _p9k_fetch_nordvpn_status() { + setopt err_return no_multi_byte + local REPLY + zsocket /run/nordvpn/nordvpnd.sock + local -i fd=REPLY + { + print -nu $fd 'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n\0\0\0\4\1\0\0\0\0\0\0;\1\4\0\0\0\1\203\206E\213b\270\327\2762\322z\230\326j\246A\206\240\344\35\23\235\t_\213\35u\320b\r&=LMedz\212\232\312\310\264\307`+\262\332\340@\2te\206M\2035\5\261\37\0\0\5\0\1\0\0\0\1\0\0\0\0\0\0\0\25\1\4\0\0\0\3\203\206E\215b\270\327\2762\322z\230\334\221\246\324\177\302\301\300\277\0\0\5\0\1\0\0\0\3\0\0\0\0\0' + local val + local -i len n wire tag + { + IFS='' read -t 0.25 -r val + val=$'\n' + while true; do + tag=$((#val)) + wire='tag & 7' + (( (tag >>= 3) && tag <= $#__p9k_nordvpn_tag )) || break + if (( wire == 0 )); then + # varint + sysread -s 1 -t 0.25 val + n=$((#val)) + (( n < 128 )) || break # bail on multi-byte varints + if (( tag == 2 )); then + # P9K_NORDVPN_TECHNOLOGY + case $n in + 1) typeset -g P9K_NORDVPN_TECHNOLOGY=OPENVPN;; + 2) typeset -g P9K_NORDVPN_TECHNOLOGY=NORDLYNX;; + 3) typeset -g P9K_NORDVPN_TECHNOLOGY=SKYLARK;; + *) typeset -g P9K_NORDVPN_TECHNOLOGY=UNKNOWN;; + esac + elif (( tag == 3 )); then + # P9K_NORDVPN_PROTOCOL + case $n in + 1) typeset -g P9K_NORDVPN_PROTOCOL=UDP;; + 2) typeset -g P9K_NORDVPN_PROTOCOL=TCP;; + *) typeset -g P9K_NORDVPN_PROTOCOL=UNKNOWN;; + esac + else + break + fi + else + # length-delimited + (( wire == 2 )) || break + (( tag != 2 && tag != 3 )) || break + [[ -t $fd ]] || true # https://www.zsh.org/mla/workers/2020/msg00207.html + sysread -s 1 -t 0.25 val + len=$((#val)) + val= + while (( $#val < len )); do + [[ -t $fd ]] || true # https://www.zsh.org/mla/workers/2020/msg00207.html + sysread -s $(( len - $#val )) -t 0.25 'val[$#val+1]' + done + typeset -g $__p9k_nordvpn_tag[tag]=$val + fi + [[ -t $fd ]] || true # https://www.zsh.org/mla/workers/2020/msg00207.html + sysread -s 1 -t 0.25 val + done + } <&$fd + } always { + exec {fd}>&- + } +} + +# Shows the state of NordVPN connection. Works only on Linux. Can be in the following 5 states. +# +# CONNECTED: NordVPN is connected. By default shows NORDVPN_ICON as icon and country code as +# content. In addition, the following variables are set for the use by +# POWERLEVEL9K_NORDVPN_CONNECTED_VISUAL_IDENTIFIER_EXPANSION and +# POWERLEVEL9K_NORDVPN_CONNECTED_CONTENT_EXPANSION: +# +# - P9K_NORDVPN_STATUS +# - P9K_NORDVPN_PROTOCOL +# - P9K_NORDVPN_TECHNOLOGY +# - P9K_NORDVPN_IP_ADDRESS +# - P9K_NORDVPN_SERVER +# - P9K_NORDVPN_COUNTRY +# - P9K_NORDVPN_CITY +# - P9K_NORDVPN_COUNTRY_CODE +# +# The last variable is trivially derived from P9K_NORDVPN_SERVER. The rest correspond to the output +# lines of `nordvpn status` command. Example of using these variables: +# +# # Display the name of the city where VPN servers are located when connected to NordVPN. +# POWERLEVEL9K_NORDVPN_CONNECTED_CONTENT_EXPANSION='${P9K_NORDVPN_CITY}' +# +# DISCONNECTED, CONNECTING, DISCONNECTING: NordVPN is disconnected/connecting/disconnecting. By +# default shows NORDVPN_ICON as icon and FAIL_ICON as content. In state CONNECTING the same +# P9K_NORDVPN_* variables are set as in CONNECTED. In states DISCONNECTED and DISCONNECTING only +# P9K_NORDVPN_STATUS is set. Example customizations: +# +# # Hide NordVPN segment when disconnected (segments with no icon and no content are not shown). +# POWERLEVEL9K_NORDVPN_DISCONNECTED_CONTENT_EXPANSION= +# POWERLEVEL9K_NORDVPN_DISCONNECTED_VISUAL_IDENTIFIER_EXPANSION= +# +# # When NordVPN is connecting, show country code on cyan background. +# POWERLEVEL9K_NORDVPN_CONNECTING_CONTENT_EXPANSION='${P9K_NORDVPN_COUNTRY_CODE}' +# POWERLEVEL9K_NORDVPN_CONNECTING_BACKGROUND=cyan +function prompt_nordvpn() { + unset $__p9k_nordvpn_tag P9K_NORDVPN_COUNTRY_CODE + [[ -e /run/nordvpn/nordvpnd.sock ]] || return + _p9k_fetch_nordvpn_status 2>/dev/null || return + if [[ $P9K_NORDVPN_SERVER == (#b)([[:alpha:]]##)[[:digit:]]##.nordvpn.com ]]; then + typeset -g P9K_NORDVPN_COUNTRY_CODE=${${(U)match[1]}//ฤฐ/I} + fi + case $P9K_NORDVPN_STATUS in + Connected) + _p9k_prompt_segment $0_CONNECTED blue white NORDVPN_ICON 0 '' "$P9K_NORDVPN_COUNTRY_CODE" + ;; + Disconnected|Connecting|Disconnecting) + local state=${${(U)P9K_NORDVPN_STATUS}//ฤฐ/I} + _p9k_get_icon $0_$state FAIL_ICON + _p9k_prompt_segment $0_$state yellow white NORDVPN_ICON 0 '' "$_p9k__ret" + ;; + *) + return + ;; + esac +} + +_p9k_prompt_nordvpn_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[nordvpn]' +} + +function prompt_ranger() { + _p9k_prompt_segment $0 $_p9k_color1 yellow RANGER_ICON 0 '' $RANGER_LEVEL +} + +_p9k_prompt_ranger_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$RANGER_LEVEL' +} + +function instant_prompt_ranger() { + _p9k_prompt_segment prompt_ranger $_p9k_color1 yellow RANGER_ICON 1 '$RANGER_LEVEL' '$RANGER_LEVEL' +} + +function prompt_yazi() { + _p9k_prompt_segment $0 $_p9k_color1 yellow YAZI_ICON 0 '' $YAZI_LEVEL +} + +_p9k_prompt_yazi_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$YAZI_LEVEL' +} + +function instant_prompt_yazi() { + _p9k_prompt_segment prompt_yazi $_p9k_color1 yellow YAZI_ICON 1 '$YAZI_LEVEL' '$YAZI_LEVEL' +} + +function prompt_midnight_commander() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 $_p9k_color1 yellow MIDNIGHT_COMMANDER_ICON 0 '' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_midnight_commander_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$MC_TMPDIR' +} + +function instant_prompt_midnight_commander() { + _p9k_prompt_segment prompt_midnight_commander $_p9k_color1 yellow MIDNIGHT_COMMANDER_ICON 0 '$MC_TMPDIR' '' +} + +function prompt_nnn() { + _p9k_prompt_segment $0 6 $_p9k_color1 NNN_ICON 0 '' $NNNLVL +} + +_p9k_prompt_nnn_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${NNNLVL:#0}' +} + +function instant_prompt_nnn() { + _p9k_prompt_segment prompt_nnn 6 $_p9k_color1 NNN_ICON 1 '${NNNLVL:#0}' '$NNNLVL' +} + +function prompt_lf() { + _p9k_prompt_segment $0 6 $_p9k_color1 LF_ICON 0 '' $LF_LEVEL +} + +_p9k_prompt_lf_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${LF_LEVEL:#0}' +} + +function instant_prompt_lf() { + _p9k_prompt_segment prompt_lf 6 $_p9k_color1 LF_ICON 1 '${LF_LEVEL:#0}' '$LF_LEVEL' +} + +function prompt_xplr() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 6 $_p9k_color1 XPLR_ICON 0 '' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_xplr_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$XPLR_PID' +} + +function instant_prompt_xplr() { + _p9k_prompt_segment prompt_xplr 6 $_p9k_color1 XPLR_ICON 0 '$XPLR_PID' '' +} + +function prompt_vim_shell() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 green $_p9k_color1 VIM_ICON 0 '' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_vim_shell_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$VIMRUNTIME' +} + +function instant_prompt_vim_shell() { + _p9k_prompt_segment prompt_vim_shell green $_p9k_color1 VIM_ICON 0 '$VIMRUNTIME' '' +} + +function prompt_nix_shell() { + _p9k_prompt_segment $0 4 $_p9k_color1 NIX_SHELL_ICON 0 '' "${(M)IN_NIX_SHELL:#(pure|impure)}" +} + +_p9k_prompt_nix_shell_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k_nix_shell_cond +} + +function instant_prompt_nix_shell() { + _p9k_prompt_segment prompt_nix_shell 4 $_p9k_color1 NIX_SHELL_ICON 1 "$_p9k_nix_shell_cond" '${(M)IN_NIX_SHELL:#(pure|impure)}' +} + +function prompt_terraform() { + local ws=$TF_WORKSPACE + if [[ -z $TF_WORKSPACE ]]; then + _p9k_read_word ${${TF_DATA_DIR:-.terraform}:A}/environment && ws=$_p9k__ret + fi + [[ -z $ws || $ws == default && $_POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT == 0 ]] && return + local pat class state + for pat class in "${_POWERLEVEL9K_TERRAFORM_CLASSES[@]}"; do + if [[ $ws == ${~pat} ]]; then + [[ -n $class ]] && state=_${${(U)class}//ฤฐ/I} + break + fi + done + _p9k_prompt_segment "$0$state" $_p9k_color1 blue TERRAFORM_ICON 0 '' $ws +} + +_p9k_prompt_terraform_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[terraform]' +} + +function prompt_terraform_version() { + local v cfg terraform=${commands[terraform]} + _p9k_upglob .terraform-version -. || cfg=$_p9k__parent_dirs[$?]/.terraform-version + if _p9k_cache_stat_get $0.$TFENV_TERRAFORM_VERSION $terraform $cfg; then + v=$_p9k__cache_val[1] + else + v=${${"$(terraform --version 2>/dev/null)"#Terraform v}%%$'\n'*} || v= + _p9k_cache_stat_set "$v" + fi + [[ -n $v ]] || return + _p9k_prompt_segment $0 $_p9k_color1 blue TERRAFORM_ICON 0 '' ${v//\%/%%} +} + +_p9k_prompt_terraform_version_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[terraform]' +} + +function prompt_proxy() { + local -U p=( + $all_proxy $http_proxy $https_proxy $ftp_proxy + $ALL_PROXY $HTTP_PROXY $HTTPS_PROXY $FTP_PROXY) + p=(${(@)${(@)${(@)p#*://}##*@}%%/*}) + (( $#p == 1 )) || p=("") + _p9k_prompt_segment $0 $_p9k_color1 blue PROXY_ICON 0 '' "$p[1]" +} + +_p9k_prompt_proxy_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$all_proxy$http_proxy$https_proxy$ftp_proxy$ALL_PROXY$HTTP_PROXY$HTTPS_PROXY$FTP_PROXY' +} + +function prompt_direnv() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 $_p9k_color1 yellow DIRENV_ICON 0 '${DIRENV_DIR-}' '' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_direnv_init() { + # DIRENV_DIR is set in a precmd hook. If our hook isn't the last, DIRENV_DIR might + # still get set before prompt is expanded. + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${DIRENV_DIR-${precmd_functions[-1]:#_p9k_precmd}}' +} + +function instant_prompt_direnv() { + if [[ -n ${DIRENV_DIR:-} && $precmd_functions[-1] == _p9k_precmd ]]; then + _p9k_prompt_segment prompt_direnv $_p9k_color1 yellow DIRENV_ICON 0 '' '' + fi +} + +function _p9k_timewarrior_clear() { + [[ -z $_p9k_timewarrior_dir ]] && return + _p9k_timewarrior_dir= + _p9k_timewarrior_dir_mtime=0 + _p9k_timewarrior_file_mtime=0 + _p9k_timewarrior_file_name= + unset _p9k_timewarrior_tags + _p9k__state_dump_scheduled=1 +} + +function prompt_timewarrior() { + local dir + [[ -n ${dir::=$TIMEWARRIORDB} || -n ${dir::=~/.timewarrior}(#q-/N) ]] || + dir=${XDG_DATA_HOME:-~/.local/share}/timewarrior + dir+=/data + local -a stat + [[ $dir == $_p9k_timewarrior_dir ]] || _p9k_timewarrior_clear + if [[ -n $_p9k_timewarrior_file_name ]]; then + zstat -A stat +mtime -- $dir $_p9k_timewarrior_file_name 2>/dev/null || stat=() + if [[ $stat[1] == $_p9k_timewarrior_dir_mtime && $stat[2] == $_p9k_timewarrior_file_mtime ]]; then + if (( $+_p9k_timewarrior_tags )); then + _p9k_prompt_segment $0 grey 255 TIMEWARRIOR_ICON 0 '' "${_p9k_timewarrior_tags//\%/%%}" + fi + return + fi + fi + if [[ ! -d $dir ]]; then + _p9k_timewarrior_clear + return + fi + _p9k_timewarrior_dir=$dir + if [[ $stat[1] != $_p9k_timewarrior_dir_mtime ]]; then + local -a files=($dir/<->-<->.data(.N)) + if (( ! $#files )); then + if (( $#stat )) || zstat -A stat +mtime -- $dir 2>/dev/null; then + _p9k_timewarrior_dir_mtime=$stat[1] + _p9k_timewarrior_file_mtime=$stat[1] + _p9k_timewarrior_file_name=$dir # sic + unset _p9k_timewarrior_tags + _p9k__state_dump_scheduled=1 + else + _p9k_timewarrior_clear + fi + return + fi + _p9k_timewarrior_file_name=${${(AO)files}[1]} + fi + if ! zstat -A stat +mtime -- $dir $_p9k_timewarrior_file_name 2>/dev/null; then + _p9k_timewarrior_clear + return + fi + _p9k_timewarrior_dir_mtime=$stat[1] + _p9k_timewarrior_file_mtime=$stat[2] + { local tail=${${(Af)"$(<$_p9k_timewarrior_file_name)"}[-1]} } 2>/dev/null + if [[ $tail == (#b)'inc '[^\ ]##(|\ #\#(*)) ]]; then + _p9k_timewarrior_tags=${${match[2]## #}%% #} + _p9k_prompt_segment $0 grey 255 TIMEWARRIOR_ICON 0 '' "${_p9k_timewarrior_tags//\%/%%}" + else + unset _p9k_timewarrior_tags + fi + _p9k__state_dump_scheduled=1 +} + +function _p9k_prompt_timewarrior_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[timew]' +} + +function _p9k_taskwarrior_check_meta() { + [[ -n $_p9k_taskwarrior_meta_sig ]] || return + [[ -z $^_p9k_taskwarrior_meta_non_files(#qN) ]] || return + local -a stat + if (( $#_p9k_taskwarrior_meta_files )); then + zstat -A stat +mtime -- $_p9k_taskwarrior_meta_files 2>/dev/null || return + fi + [[ $_p9k_taskwarrior_meta_sig == ${(pj:\0:)stat}$'\0'$TASKRC$'\0'$TASKDATA ]] || return +} + +function _p9k_taskwarrior_init_meta() { + local last_sig=$_p9k_taskwarrior_meta_sig + { + local cfg + cfg="$(command task show data.location rc.color=0 rc._forcecolor=0 /dev/null)" || return + local lines=(${(@M)${(f)cfg}:#data.location[[:space:]]##[^[:space:]]*}) + (( $#lines == 1 )) || return + local dir=${lines[1]##data.location[[:space:]]#} + : ${dir::=$~dir} # `task` can give us path with `~`` in it; expand it + + local -a stat files=(${TASKRC:-~/.taskrc}) + _p9k_taskwarrior_meta_files=($^files(N)) + _p9k_taskwarrior_meta_non_files=(${files:|_p9k_taskwarrior_meta_files}) + if (( $#_p9k_taskwarrior_meta_files )); then + zstat -A stat +mtime -- $_p9k_taskwarrior_meta_files 2>/dev/null || stat=(-1) + fi + _p9k_taskwarrior_meta_sig=${(pj:\0:)stat}$'\0'$TASKRC$'\0'$TASKDATA + _p9k_taskwarrior_data_dir=$dir + } always { + if (( $? == 0 )); then + _p9k__state_dump_scheduled=1 + return + fi + [[ -n $last_sig ]] && _p9k__state_dump_scheduled=1 + _p9k_taskwarrior_meta_files=() + _p9k_taskwarrior_meta_non_files=() + _p9k_taskwarrior_meta_sig= + _p9k_taskwarrior_data_dir= + _p9k__taskwarrior_functional= + } +} + +function _p9k_taskwarrior_check_data() { + [[ -n $_p9k_taskwarrior_data_sig ]] || return + [[ -z $^_p9k_taskwarrior_data_non_files(#qN) ]] || return + local -a stat + if (( $#_p9k_taskwarrior_data_files )); then + zstat -A stat +mtime -- $_p9k_taskwarrior_data_files 2>/dev/null || return + fi + [[ $_p9k_taskwarrior_data_sig == ${(pj:\0:)stat}$'\0'$TASKRC$'\0'$TASKDATA ]] || return + (( _p9k_taskwarrior_next_due == 0 || _p9k_taskwarrior_next_due > EPOCHSECONDS )) || return +} + +function _p9k_taskwarrior_init_data() { + local -a stat files=( + $_p9k_taskwarrior_data_dir/{pending,completed}.data + $_p9k_taskwarrior_data_dir/taskchampion.sqlite3 + ) + _p9k_taskwarrior_data_files=($^files(N)) + _p9k_taskwarrior_data_non_files=(${files:|_p9k_taskwarrior_data_files}) + if (( $#_p9k_taskwarrior_data_files )); then + zstat -A stat +mtime -- $_p9k_taskwarrior_data_files 2>/dev/null || stat=(-1) + _p9k_taskwarrior_data_sig=${(pj:\0:)stat}$'\0' + else + _p9k_taskwarrior_data_sig= + fi + + _p9k_taskwarrior_data_files+=($_p9k_taskwarrior_meta_files) + _p9k_taskwarrior_data_non_files+=($_p9k_taskwarrior_meta_non_files) + _p9k_taskwarrior_data_sig+=$_p9k_taskwarrior_meta_sig + + local name val + for name in PENDING OVERDUE; do + val="$(command task +$name count rc.color=0 rc._forcecolor=0 /dev/null)" || continue + [[ $val == <1-> ]] || continue + _p9k_taskwarrior_counters[$name]=$val + done + + _p9k_taskwarrior_next_due=0 + + if (( _p9k_taskwarrior_counters[PENDING] > _p9k_taskwarrior_counters[OVERDUE] )); then + local -a ts + ts=($(command task +PENDING -OVERDUE list rc.verbose=nothing rc.color=0 rc._forcecolor=0 \ + rc.report.list.labels= rc.report.list.columns=due.epoch /dev/null)) || ts=() + # The second condition is a workaround for a bug in taskwarrior v3.0.1. + # https://github.com/romkatv/powerlevel10k/issues/2648. + if (( $#ts && ! ${#${(@)ts:#(|-)<->(|.<->)}} )); then + _p9k_taskwarrior_next_due=${${(on)ts}[1]} + (( _p9k_taskwarrior_next_due > EPOCHSECONDS )) || _p9k_taskwarrior_next_due=$((EPOCHSECONDS+60)) + fi + fi + + _p9k__state_dump_scheduled=1 +} + +function prompt_taskwarrior() { + unset P9K_TASKWARRIOR_PENDING_COUNT P9K_TASKWARRIOR_OVERDUE_COUNT + if ! _p9k_taskwarrior_check_data; then + _p9k_taskwarrior_data_files=() + _p9k_taskwarrior_data_non_files=() + _p9k_taskwarrior_data_sig= + _p9k_taskwarrior_counters=() + _p9k_taskwarrior_next_due=0 + _p9k_taskwarrior_check_meta || _p9k_taskwarrior_init_meta || return + _p9k_taskwarrior_init_data + fi + (( $#_p9k_taskwarrior_counters )) || return + local text c=$_p9k_taskwarrior_counters[OVERDUE] + if [[ -n $c ]]; then + typeset -g P9K_TASKWARRIOR_OVERDUE_COUNT=$c + text+="!$c" + fi + c=$_p9k_taskwarrior_counters[PENDING] + if [[ -n $c ]]; then + typeset -g P9K_TASKWARRIOR_PENDING_COUNT=$c + [[ -n $text ]] && text+='/' + text+=$c + fi + [[ -n $text ]] || return + _p9k_prompt_segment $0 6 $_p9k_color1 TASKWARRIOR_ICON 0 '' $text +} + +function _p9k_prompt_taskwarrior_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[task]:+$_p9k__taskwarrior_functional}' +} + +prompt_wifi() { + local -i len=$#_p9k__prompt _p9k__has_upglob + _p9k_prompt_segment $0 green $_p9k_color1 WIFI_ICON 1 '$_p9k__wifi_on' '$P9K_WIFI_LAST_TX_RATE Mbps' + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_wifi_init() { + if [[ -x /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport || + -r /proc/net/wireless && -n $commands[iw] ]]; then + typeset -g _p9k__wifi_on= + typeset -g P9K_WIFI_LAST_TX_RATE= + typeset -g P9K_WIFI_SSID= + typeset -g P9K_WIFI_LINK_AUTH= + typeset -g P9K_WIFI_RSSI= + typeset -g P9K_WIFI_NOISE= + typeset -g P9K_WIFI_BARS= + _p9k__async_segments_compute+='_p9k_worker_invoke wifi _p9k_prompt_wifi_compute' + else + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${:-}' + fi +} + +_p9k_prompt_wifi_compute() { + _p9k_worker_async _p9k_prompt_wifi_async _p9k_prompt_wifi_sync +} + +_p9k_prompt_wifi_async() { + local airport=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport + local last_tx_rate ssid link_auth rssi noise bars on out line v state iface + { + if [[ -x $airport ]]; then + out="$($airport -I)" || return 0 + for line in ${${${(f)out}##[[:space:]]#}%%[[:space:]]#}; do + v=${line#*: } + case $line[1,-$#v-3] in + agrCtlRSSI) rssi=$v;; + agrCtlNoise) noise=$v;; + state) state=$v;; + lastTxRate) last_tx_rate=$v;; + link\ auth) link_auth=$v;; + SSID) ssid=$v;; + esac + done + [[ $state == running && $rssi == (0|-<->) && $noise == (0|-<->) ]] || return 0 + elif [[ -r /proc/net/wireless && -n $commands[iw] ]]; then + # Content example (https://github.com/romkatv/powerlevel10k/pull/973#issuecomment-680251804): + # + # Inter-| sta-| Quality | Discarded packets | Missed | WE + # face | tus | link level noise | nwid crypt frag retry misc | beacon | 22 + # wlp3s0: 0000 58. -52. -256 0 0 0 0 76 0 + local -a lines + lines=(${${(f)"$() && $noise == (0|-<->) ]] || return 0 + # Output example (https://github.com/romkatv/powerlevel10k/pull/973#issuecomment-680251804): + # + # Connected to 74:83:c2:be:76:da (on wlp3s0) + # SSID: DailyGrindGuest1 + # freq: 5745 + # RX: 35192066 bytes (27041 packets) + # TX: 4090471 bytes (24287 packets) + # signal: -52 dBm + # rx bitrate: 243.0 MBit/s VHT-MCS 6 40MHz VHT-NSS 2 + # tx bitrate: 240.0 MBit/s VHT-MCS 5 40MHz short GI VHT-NSS 2 + # + # bss flags: short-slot-time + # dtim period: 1 + # beacon int: 100 + lines=(${(f)"$(command iw dev $iface link)"}) || return 0 + local -a match mbegin mend + for line in $lines; do + if [[ $line == (#b)[[:space:]]#SSID:[[:space:]]##(*) ]]; then + ssid=$match[1] + elif [[ $line == (#b)[[:space:]]#'tx bitrate:'[[:space:]]##([^[:space:]]##)' MBit/s'* ]]; then + last_tx_rate=$match[1] + [[ $last_tx_rate == <->.<-> ]] && last_tx_rate=${${last_tx_rate%%0#}%.} + fi + done + [[ -n $ssid && -n $last_tx_rate ]] || return 0 + else + return 0 + fi + # https://www.speedguide.net/faq/how-to-read-rssisignal-and-snrnoise-ratings-440 + # http://www.wireless-nets.com/resources/tutorials/define_SNR_values.html + local -i snr_margin='rssi - noise' + if (( snr_margin >= 40 )); then + bars=4 + elif (( snr_margin >= 25 )); then + bars=3 + elif (( snr_margin >= 15 )); then + bars=2 + elif (( snr_margin >= 10 )); then + bars=1 + else + bars=0 + fi + on=1 + } always { + if (( ! on )); then + rssi= + noise= + ssid= + last_tx_rate= + bars= + link_auth= + fi + if [[ $_p9k__wifi_on != $on || + $P9K_WIFI_LAST_TX_RATE != $last_tx_rate || + $P9K_WIFI_SSID != $ssid || + $P9K_WIFI_LINK_AUTH != $link_auth || + $P9K_WIFI_RSSI != $rssi || + $P9K_WIFI_NOISE != $noise || + $P9K_WIFI_BARS != $bars ]]; then + _p9k__wifi_on=$on + P9K_WIFI_LAST_TX_RATE=$last_tx_rate + P9K_WIFI_SSID=$ssid + P9K_WIFI_LINK_AUTH=$link_auth + P9K_WIFI_RSSI=$rssi + P9K_WIFI_NOISE=$noise + P9K_WIFI_BARS=$bars + _p9k_print_params \ + _p9k__wifi_on \ + P9K_WIFI_LAST_TX_RATE \ + P9K_WIFI_SSID \ + P9K_WIFI_LINK_AUTH \ + P9K_WIFI_RSSI \ + P9K_WIFI_NOISE \ + P9K_WIFI_BARS + echo -E - 'reset=1' + fi + } +} + +_p9k_prompt_wifi_sync() { + if [[ -n $REPLY ]]; then + eval $REPLY + _p9k_worker_reply $REPLY + fi +} + +function _p9k_asdf_check_meta() { + [[ -n $_p9k_asdf_meta_sig ]] || return + [[ -z $^_p9k_asdf_meta_non_files(#qN) ]] || return + local -a stat + if (( $#_p9k_asdf_meta_files )); then + zstat -A stat +mtime -- $_p9k_asdf_meta_files 2>/dev/null || return + fi + [[ $_p9k_asdf_meta_sig == $ASDF_CONFIG_FILE$'\0'$ASDF_DATA_DIR$'\0'${(pj:\0:)stat} ]] || return +} + +function _p9k_asdf_init_meta() { + local last_sig=$_p9k_asdf_meta_sig + { + local -a files + local -i legacy_enabled + + _p9k_asdf_plugins=() + _p9k_asdf_file_info=() + + local cfg=${ASDF_CONFIG_FILE:-~/.asdfrc} + files+=$cfg + if [[ -f $cfg && -r $cfg ]]; then + # Config parser in adsf is very strange. + # + # This gives "yes": + # + # legacy_version_file = yes = no + # + # This gives "no": + # + # legacy_version_file = yes + # legacy_version_file = yes + # + # We do the same. + local lines=(${(@M)${(@)${(f)"$(<$cfg)"}%$'\r'}:#[[:space:]]#legacy_version_file[[:space:]]#=*}) + if [[ $#lines == 1 && ${${(s:=:)lines[1]}[2]} == [[:space:]]#yes[[:space:]]# ]]; then + legacy_enabled=1 + fi + fi + + local root=${ASDF_DATA_DIR:-~/.asdf} + files+=$root/plugins + if [[ -d $root/plugins ]]; then + local plugin + for plugin in $root/plugins/[^[:space:]]##(/N); do + files+=$root/installs/${plugin:t} + local -aU installed=($root/installs/${plugin:t}/[^[:space:]]##(/N:t) system) + _p9k_asdf_plugins[${plugin:t}]=${(j:|:)${(@b)installed}} + (( legacy_enabled )) || continue + if [[ ! -e $plugin/bin ]]; then + files+=$plugin/bin + else + local list_names=$plugin/bin/list-legacy-filenames + files+=$list_names + if [[ -x $list_names ]]; then + local parse=$plugin/bin/parse-legacy-file + local -i has_parse=0 + files+=$parse + [[ -x $parse ]] && has_parse=1 + local name + for name in ${$($list_names 2>/dev/null)%$'\r'}; do + [[ $name == (*/*|.tool-versions) ]] && continue + _p9k_asdf_file_info[$name]+="${plugin:t} $has_parse " + done + fi + fi + done + fi + + _p9k_asdf_meta_files=($^files(N)) + _p9k_asdf_meta_non_files=(${files:|_p9k_asdf_meta_files}) + + local -a stat + if (( $#_p9k_asdf_meta_files )); then + zstat -A stat +mtime -- $_p9k_asdf_meta_files 2>/dev/null || return + fi + _p9k_asdf_meta_sig=$ASDF_CONFIG_FILE$'\0'$ASDF_DATA_DIR$'\0'${(pj:\0:)stat} + _p9k__asdf_dir2files=() + _p9k_asdf_file2versions=() + } always { + if (( $? == 0 )); then + _p9k__state_dump_scheduled=1 + return + fi + [[ -n $last_sig ]] && _p9k__state_dump_scheduled=1 + _p9k_asdf_meta_files=() + _p9k_asdf_meta_non_files=() + _p9k_asdf_meta_sig= + _p9k_asdf_plugins=() + _p9k_asdf_file_info=() + _p9k__asdf_dir2files=() + _p9k_asdf_file2versions=() + } +} + +# Usage: _p9k_asdf_parse_version_file +# +# Mutates `versions` on success. +function _p9k_asdf_parse_version_file() { + local file=$1 + local is_legacy=$2 + local -a stat + zstat -A stat +mtime $file 2>/dev/null || return + if (( is_legacy )); then + local plugin has_parse + for plugin has_parse in $=_p9k_asdf_file_info[$file:t]; do + local cached=$_p9k_asdf_file2versions[$plugin:$file] + if [[ $cached == $stat[1]:* ]]; then + local v=${cached#*:} + else + if (( has_parse )); then + local v=($(${ASDF_DATA_DIR:-~/.asdf}/plugins/$plugin/bin/parse-legacy-file $file 2>/dev/null)) + else + { local v=($(<$file)) } 2>/dev/null + fi + v=(${v%$'\r'}) + v=${v[(r)$_p9k_asdf_plugins[$plugin]]:-$v[1]} + _p9k_asdf_file2versions[$plugin:$file]=$stat[1]:"$v" + _p9k__state_dump_scheduled=1 + fi + [[ -n $v ]] && : ${versions[$plugin]="$v"} + done + else + local cached=$_p9k_asdf_file2versions[:$file] + if [[ $cached == $stat[1]:* ]]; then + local file_versions=(${(0)${cached#*:}}) + else + local file_versions=() + { local lines=(${(@)${(@)${(f)"$(<$file)"}%$'\r'}/\#*}) } 2>/dev/null + local line + for line in $lines; do + local words=($=line) + (( $#words > 1 )) || continue + local installed=$_p9k_asdf_plugins[$words[1]] + [[ -n $installed ]] || continue + file_versions+=($words[1] ${${words:1}[(r)$installed]:-$words[2]}) + done + _p9k_asdf_file2versions[:$file]=$stat[1]:${(pj:\0:)file_versions} + _p9k__state_dump_scheduled=1 + fi + local plugin version + for plugin version in $file_versions; do + : ${versions[$plugin]=$version} + done + fi + return 0 +} + +function prompt_asdf() { + _p9k_asdf_check_meta || _p9k_asdf_init_meta || return + + local -A versions + local -a stat + local -i has_global + local dirs=($_p9k__parent_dirs) + local mtimes=($_p9k__parent_mtimes) + if [[ $dirs[-1] != ~ ]]; then + zstat -A stat +mtime ~ 2>/dev/null || return + dirs+=(~) + mtimes+=($stat[1]) + fi + + local elem + for elem in ${(@)${:-{1..$#dirs}}/(#m)*/${${:-$MATCH:$_p9k__asdf_dir2files[$dirs[MATCH]]}#$MATCH:$mtimes[MATCH]:}}; do + if [[ $elem == *:* ]]; then + local dir=$dirs[${elem%%:*}] + zstat -A stat +mtime $dir 2>/dev/null || return + local files=($dir/.tool-versions(N) $dir/${(k)^_p9k_asdf_file_info}(N)) + _p9k__asdf_dir2files[$dir]=$stat[1]:${(pj:\0:)files} + else + local files=(${(0)elem}) + fi + if [[ ${files[1]:h} == ~ ]]; then + has_global=1 + local -A local_versions=(${(kv)versions}) + versions=() + fi + local file + for file in $files; do + [[ $file == */.tool-versions ]] + _p9k_asdf_parse_version_file $file $? || return + done + done + + if (( ! has_global )); then + has_global=1 + local -A local_versions=(${(kv)versions}) + versions=() + fi + + if [[ -r $ASDF_DEFAULT_TOOL_VERSIONS_FILENAME ]]; then + _p9k_asdf_parse_version_file $ASDF_DEFAULT_TOOL_VERSIONS_FILENAME 0 || return + fi + + local plugin + for plugin in ${(k)_p9k_asdf_plugins}; do + local upper=${${(U)plugin//-/_}//ฤฐ/I} + if (( $+parameters[_POWERLEVEL9K_ASDF_${upper}_SOURCES] )); then + local sources=(${(P)${:-_POWERLEVEL9K_ASDF_${upper}_SOURCES}}) + else + local sources=($_POWERLEVEL9K_ASDF_SOURCES) + fi + + local version="${(P)${:-ASDF_${upper}_VERSION}}" + if [[ -n $version ]]; then + (( $sources[(I)shell] )) || continue + else + version=$local_versions[$plugin] + if [[ -n $version ]]; then + (( $sources[(I)local] )) || continue + else + version=$versions[$plugin] + [[ -n $version ]] || continue + (( $sources[(I)global] )) || continue + fi + fi + + if [[ $version == $versions[$plugin] ]]; then + if (( $+parameters[_POWERLEVEL9K_ASDF_${upper}_PROMPT_ALWAYS_SHOW] )); then + (( _POWERLEVEL9K_ASDF_${upper}_PROMPT_ALWAYS_SHOW )) || continue + else + (( _POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW )) || continue + fi + fi + + if [[ $version == system ]]; then + if (( $+parameters[_POWERLEVEL9K_ASDF_${upper}_SHOW_SYSTEM] )); then + (( _POWERLEVEL9K_ASDF_${upper}_SHOW_SYSTEM )) || continue + else + (( _POWERLEVEL9K_ASDF_SHOW_SYSTEM )) || continue + fi + fi + + _p9k_get_icon $0_$upper ${upper}_ICON $plugin + _p9k_prompt_segment $0_$upper green $_p9k_color1 $'\1'$_p9k__ret 0 '' ${version//\%/%%} + done +} + +_p9k_prompt_asdf_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='${commands[asdf]:-${${+functions[asdf]}:#0}}' +} + +_p9k_haskell_stack_version() { + if ! _p9k_cache_stat_get $0 $1 ${STACK_ROOT:-~/.stack}/{pantry/pantry.sqlite3,stack.sqlite3}; then + local v + v="$(STACK_YAML=$1 stack \ + --silent \ + --no-install-ghc \ + --skip-ghc-check \ + --no-terminal \ + --color=never \ + --lock-file=read-only \ + query compiler actual)" || v= + _p9k_cache_stat_set "$v" + fi + _p9k__ret=$_p9k__cache_val[1] +} + +prompt_haskell_stack() { + if [[ -n $STACK_YAML ]]; then + (( ${_POWERLEVEL9K_HASKELL_STACK_SOURCES[(I)shell]} )) || return + _p9k_haskell_stack_version $STACK_YAML + else + (( ${_POWERLEVEL9K_HASKELL_STACK_SOURCES[(I)local|global]} )) || return + if _p9k_upglob stack.yaml -.; then + (( _POWERLEVEL9K_HASKELL_STACK_PROMPT_ALWAYS_SHOW )) || return + (( ${_POWERLEVEL9K_HASKELL_STACK_SOURCES[(I)global]} )) || return + _p9k_haskell_stack_version ${STACK_ROOT:-~/.stack}/global-project/stack.yaml + else + local -i idx=$? + (( ${_POWERLEVEL9K_HASKELL_STACK_SOURCES[(I)local]} )) || return + _p9k_haskell_stack_version $_p9k__parent_dirs[idx]/stack.yaml + fi + fi + + [[ -n $_p9k__ret ]] || return + + local v=$_p9k__ret + + if (( !_POWERLEVEL9K_HASKELL_STACK_PROMPT_ALWAYS_SHOW )); then + _p9k_haskell_stack_version ${STACK_ROOT:-~/.stack}/global-project/stack.yaml + [[ $v == $_p9k__ret ]] && return + fi + + _p9k_prompt_segment "$0" "yellow" "$_p9k_color1" 'HASKELL_ICON' 0 '' "${v//\%/%%}" +} + +_p9k_prompt_haskell_stack_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[stack]' +} + +################################################################ +# CPU Architecture +prompt_cpu_arch() { + local -i len=$#_p9k__prompt _p9k__has_upglob + + local state text + if _p9k_cache_ephemeral_get $0; then + state=$_p9k__cache_val[1] + text=$_p9k__cache_val[2] + else + local cmd + for cmd in machine arch; do + (( $+commands[$cmd] )) || continue + if text=$(command -- $cmd) 2>/dev/null && [[ $text == [a-zA-Z][a-zA-Z0-9_]# ]]; then + break + else + text= + fi + done + state=_${${(U)text}//ฤฐ/I} + _p9k_cache_ephemeral_set "$state" "$text" + fi + if [[ -n $text ]]; then + _p9k_prompt_segment "$0$state" "yellow" "$_p9k_color1" 'ARCH_ICON' 0 '' "$text" + fi + + (( _p9k__has_upglob )) || typeset -g "_p9k__segment_val_${_p9k__prompt_side}[_p9k__segment_index]"=$_p9k__prompt[len+1,-1] +} + +_p9k_prompt_cpu_arch_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$commands[machine]$commands[arch]' +} + +################################################################ +# Oh My Zsh per-directory-history local/global indicator +prompt_per_directory_history() { + if [[ $_per_directory_history_is_global == true ]]; then + _p9k_prompt_segment ${0}_GLOBAL 3 $_p9k_color1 HISTORY_ICON 0 '' global + else + _p9k_prompt_segment ${0}_LOCAL 5 $_p9k_color1 HISTORY_ICON 0 '' local + fi +} + +instant_prompt_per_directory_history() { + case $HISTORY_START_WITH_GLOBAL in + true) + _p9k_prompt_segment prompt_per_directory_history_GLOBAL 3 $_p9k_color1 HISTORY_ICON 0 '' global + ;; + ?*) + _p9k_prompt_segment prompt_per_directory_history_LOCAL 5 $_p9k_color1 HISTORY_ICON 0 '' local + ;; + esac +} + +_p9k_prompt_per_directory_history_init() { + typeset -g "_p9k__segment_cond_${_p9k__prompt_side}[_p9k__segment_index]"='$PER_DIRECTORY_HISTORY_TOGGLE' +} + +# Use two preexec hooks to survive https://github.com/MichaelAquilina/zsh-you-should-use with +# YSU_HARDCORE=1. See https://github.com/romkatv/powerlevel10k/issues/427. +_p9k_preexec1() { + _p9k_restore_special_params + unset __p9k_trapint + trap - INT +} + +_p9k_preexec2() { + typeset -g _p9k__preexec_cmd=$2 + _p9k__timer_start=EPOCHREALTIME + P9K_TTY=old + (( ! $+_p9k__iterm_cmd )) || _p9k_iterm2_preexec +} + +function _p9k_prompt_net_iface_init() { + typeset -g _p9k__public_ip_vpn= + typeset -g _p9k__public_ip_not_vpn= + typeset -g P9K_IP_IP= + typeset -g P9K_IP_INTERFACE= + typeset -g P9K_IP_TX_BYTES= + typeset -g P9K_IP_RX_BYTES= + typeset -g P9K_IP_TX_BYTES_DELTA= + typeset -g P9K_IP_RX_BYTES_DELTA= + typeset -g P9K_IP_TX_RATE= + typeset -g P9K_IP_RX_RATE= + typeset -g _p9__ip_timestamp= + typeset -g _p9k__vpn_ip_ips=() + [[ -z $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k__public_ip_not_vpn=1 + _p9k__async_segments_compute+='_p9k_worker_invoke net_iface _p9k_prompt_net_iface_compute' +} + +# reads `iface2ip` and sets `ifaces` and `ips` +function _p9k_prompt_net_iface_match() { + local iface_regex="^($1)\$" iface ip + ips=() + ifaces=() + for iface ip in "${(@)iface2ip}"; do + [[ $iface =~ $iface_regex ]] || continue + ifaces+=$iface + ips+=$ip + done + return $(($#ips == 0)) +} + +function _p9k_prompt_net_iface_compute() { + _p9k_worker_async _p9k_prompt_net_iface_async _p9k_prompt_net_iface_sync +} + +function _p9k_prompt_net_iface_async() { + # netstat -inbI en0 + local iface ip line var + typeset -a iface2ip ips ifaces + if (( $+commands[ip] )) && [[ $+commands[ifconfig] == 0 || $OSTYPE == linux* ]]; then + for line in ${(f)"$(command ip -4 a show 2>/dev/null)"}; do + if [[ $line == (#b)<->:[[:space:]]##([^:]##):[[:space:]]##\<([^\>]#)\>* ]]; then + [[ ,$match[2], == *,UP,* ]] && iface=$match[1] || iface= + elif [[ -n $iface && $line == (#b)[[:space:]]##inet[[:space:]]##([0-9.]##)* ]]; then + iface2ip+=($iface $match[1]) + iface= + fi + done + elif (( $+commands[ifconfig] )); then + for line in ${(f)"$(command ifconfig 2>/dev/null)"}; do + if [[ $line == (#b)([^[:space:]]##):[[:space:]]##flags=([[:xdigit:]]##)'<'* ]]; then + [[ $match[2] == *[13579bdfBDF] ]] && iface=$match[1] || iface= + elif [[ -n $iface && $line == (#b)[[:space:]]##inet[[:space:]]##([0-9.]##)* ]]; then + iface2ip+=($iface $match[1]) + iface= + fi + done + fi + + if _p9k_prompt_net_iface_match $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE; then + local public_ip_vpn=1 + local public_ip_not_vpn= + else + local public_ip_vpn= + local public_ip_not_vpn=1 + fi + if _p9k_prompt_net_iface_match $_POWERLEVEL9K_IP_INTERFACE; then + local ip_ip=$ips[1] ip_interface=$ifaces[1] ip_timestamp=$EPOCHREALTIME + local ip_tx_bytes ip_rx_bytes ip_tx_rate ip_rx_rate + if [[ $_p9k_os == (Linux|Android) ]]; then + if [[ -r /sys/class/net/$ifaces[1]/statistics/tx_bytes && + -r /sys/class/net/$ifaces[1]/statistics/rx_bytes ]]; then + _p9k_read_file /sys/class/net/$ifaces[1]/statistics/tx_bytes && + [[ $_p9k__ret == <-> ]] && ip_tx_bytes=$_p9k__ret && + _p9k_read_file /sys/class/net/$ifaces[1]/statistics/rx_bytes && + [[ $_p9k__ret == <-> ]] && ip_rx_bytes=$_p9k__ret || { ip_tx_bytes=; ip_rx_bytes=; } + fi + elif [[ $_p9k_os == (BSD|OSX) && $+commands[netstat] == 1 ]]; then + local -a lines + if lines=(${(f)"$(netstat -inbI $ifaces[1])"}); then + local header=($=lines[1]) + local -i rx_idx=$header[(Ie)Ibytes] + local -i tx_idx=$header[(Ie)Obytes] + if (( rx_idx && tx_idx )); then + ip_tx_bytes=0 + ip_rx_bytes=0 + for line in ${lines:1}; do + (( ip_rx_bytes += ${line[(w)rx_idx]} )) + (( ip_tx_bytes += ${line[(w)tx_idx]} )) + done + fi + fi + fi + if [[ -n $ip_rx_bytes ]]; then + if [[ $ip_ip == $P9K_IP_IP && $ifaces[1] == $P9K_IP_INTERFACE ]]; then + local -F t='ip_timestamp - _p9__ip_timestamp' + if (( t <= 0 )); then + ip_tx_rate=${P9K_IP_TX_RATE:-0 B/s} + ip_rx_rate=${P9K_IP_RX_RATE:-0 B/s} + else + _p9k_human_readable_bytes $(((ip_tx_bytes - P9K_IP_TX_BYTES) / t)) + [[ $_p9k__ret == *B ]] && ip_tx_rate="$_p9k__ret[1,-2] B/s" || ip_tx_rate="$_p9k__ret[1,-2] $_p9k__ret[-1]iB/s" + _p9k_human_readable_bytes $(((ip_rx_bytes - P9K_IP_RX_BYTES) / t)) + [[ $_p9k__ret == *B ]] && ip_rx_rate="$_p9k__ret[1,-2] B/s" || ip_rx_rate="$_p9k__ret[1,-2] $_p9k__ret[-1]iB/s" + fi + else + ip_tx_rate='0 B/s' + ip_rx_rate='0 B/s' + fi + fi + else + local ip_ip= ip_interface= ip_tx_bytes= ip_rx_bytes= ip_tx_rate= ip_rx_rate= ip_timestamp= + fi + if _p9k_prompt_net_iface_match $_POWERLEVEL9K_VPN_IP_INTERFACE; then + if (( _POWERLEVEL9K_VPN_IP_SHOW_ALL )); then + local vpn_ip_ips=($ips) + else + local vpn_ip_ips=($ips[1]) + fi + else + local vpn_ip_ips=() + fi + [[ $_p9k__public_ip_vpn == $public_ip_vpn && + $_p9k__public_ip_not_vpn == $public_ip_not_vpn && + $P9K_IP_IP == $ip_ip && + $P9K_IP_INTERFACE == $ip_interface && + $P9K_IP_TX_BYTES == $ip_tx_bytes && + $P9K_IP_RX_BYTES == $ip_rx_bytes && + $P9K_IP_TX_RATE == $ip_tx_rate && + $P9K_IP_RX_RATE == $ip_rx_rate && + "$_p9k__vpn_ip_ips" == "$vpn_ip_ips" ]] && return 1 + if [[ "$_p9k__vpn_ip_ips" == "$vpn_ip_ips" ]]; then + echo -n 0 + else + echo -n 1 + fi + _p9k__public_ip_vpn=$public_ip_vpn + _p9k__public_ip_not_vpn=$public_ip_not_vpn + P9K_IP_IP=$ip_ip + P9K_IP_INTERFACE=$ip_interface + if [[ -n $ip_tx_bytes && -n $P9K_IP_TX_BYTES ]]; then + P9K_IP_TX_BYTES_DELTA=$((ip_tx_bytes - P9K_IP_TX_BYTES)) + else + P9K_IP_TX_BYTES_DELTA= + fi + if [[ -n $ip_rx_bytes && -n $P9K_IP_RX_BYTES ]]; then + P9K_IP_RX_BYTES_DELTA=$((ip_rx_bytes - P9K_IP_RX_BYTES)) + else + P9K_IP_RX_BYTES_DELTA= + fi + P9K_IP_TX_BYTES=$ip_tx_bytes + P9K_IP_RX_BYTES=$ip_rx_bytes + P9K_IP_TX_RATE=$ip_tx_rate + P9K_IP_RX_RATE=$ip_rx_rate + _p9__ip_timestamp=$ip_timestamp + _p9k__vpn_ip_ips=($vpn_ip_ips) + _p9k_print_params \ + _p9k__public_ip_vpn \ + _p9k__public_ip_not_vpn \ + P9K_IP_IP \ + P9K_IP_INTERFACE \ + P9K_IP_TX_BYTES \ + P9K_IP_RX_BYTES \ + P9K_IP_TX_BYTES_DELTA \ + P9K_IP_RX_BYTES_DELTA \ + P9K_IP_TX_RATE \ + P9K_IP_RX_RATE \ + _p9__ip_timestamp \ + _p9k__vpn_ip_ips + echo -E - 'reset=1' +} + +_p9k_prompt_net_iface_sync() { + local -i vpn_ip_changed=$REPLY[1] + REPLY[1]="" + eval $REPLY + (( vpn_ip_changed )) && REPLY+='; _p9k_vpn_ip_render' + _p9k_worker_reply $REPLY +} + +function _p9k_set_prompt() { + local -i _p9k__vcs_called + + PROMPT= + RPROMPT= + [[ $1 == instant_ ]] || PROMPT+='${$((_p9k_on_expand()))+}%{${_p9k__raw_msg-}${_p9k__raw_msg::=}%}' + PROMPT+=$_p9k_prompt_prefix_left + + local -i _p9k__has_upglob + + local -i left_idx=1 right_idx=1 num_lines=$#_p9k_line_segments_left + for _p9k__line_index in {1..$num_lines}; do + local right= + if (( !_POWERLEVEL9K_DISABLE_RPROMPT )); then + _p9k__dir= + _p9k__prompt= + _p9k__segment_index=right_idx + _p9k__prompt_side=right + if [[ $1 == instant_ ]]; then + for _p9k__segment_name in ${${(0)_p9k_line_segments_right[_p9k__line_index]}%_joined}; do + if (( $+functions[instant_prompt_$_p9k__segment_name] )); then + local disabled=_POWERLEVEL9K_${${(U)_p9k__segment_name}//ฤฐ/I}_DISABLED_DIR_PATTERN + if [[ $_p9k__cwd != ${(P)~disabled} ]]; then + local -i len=$#_p9k__prompt + _p9k__non_hermetic_expansion=0 + instant_prompt_$_p9k__segment_name + if (( _p9k__non_hermetic_expansion )); then + _p9k__prompt[len+1,-1]= + fi + fi + fi + ((++_p9k__segment_index)) + done + else + for _p9k__segment_name in ${${(0)_p9k_line_segments_right[_p9k__line_index]}%_joined}; do + local cond=$_p9k__segment_cond_right[_p9k__segment_index] + if [[ -z $cond || -n ${(e)cond} ]]; then + local disabled=_POWERLEVEL9K_${${(U)_p9k__segment_name}//ฤฐ/I}_DISABLED_DIR_PATTERN + if [[ $_p9k__cwd != ${(P)~disabled} ]]; then + local val=$_p9k__segment_val_right[_p9k__segment_index] + if [[ -n $val ]]; then + _p9k__prompt+=$val + else + if [[ $_p9k__segment_name == custom_* ]]; then + _p9k_custom_prompt $_p9k__segment_name[8,-1] + elif (( $+functions[prompt_$_p9k__segment_name] )); then + prompt_$_p9k__segment_name + fi + fi + fi + fi + ((++_p9k__segment_index)) + done + fi + _p9k__prompt=${${_p9k__prompt//$' %{\b'/'%{%G'}//$' \b'} + right_idx=_p9k__segment_index + if [[ -n $_p9k__prompt || $_p9k_line_never_empty_right[_p9k__line_index] == 1 ]]; then + right=$_p9k_line_prefix_right[_p9k__line_index]$_p9k__prompt$_p9k_line_suffix_right[_p9k__line_index] + fi + fi + unset _p9k__dir + _p9k__prompt=$_p9k_line_prefix_left[_p9k__line_index] + _p9k__segment_index=left_idx + _p9k__prompt_side=left + if [[ $1 == instant_ ]]; then + for _p9k__segment_name in ${${(0)_p9k_line_segments_left[_p9k__line_index]}%_joined}; do + if (( $+functions[instant_prompt_$_p9k__segment_name] )); then + local disabled=_POWERLEVEL9K_${${(U)_p9k__segment_name}//ฤฐ/I}_DISABLED_DIR_PATTERN + if [[ $_p9k__cwd != ${(P)~disabled} ]]; then + local -i len=$#_p9k__prompt + _p9k__non_hermetic_expansion=0 + instant_prompt_$_p9k__segment_name + if (( _p9k__non_hermetic_expansion )); then + _p9k__prompt[len+1,-1]= + fi + fi + fi + ((++_p9k__segment_index)) + done + else + for _p9k__segment_name in ${${(0)_p9k_line_segments_left[_p9k__line_index]}%_joined}; do + local cond=$_p9k__segment_cond_left[_p9k__segment_index] + if [[ -z $cond || -n ${(e)cond} ]]; then + local disabled=_POWERLEVEL9K_${${(U)_p9k__segment_name}//ฤฐ/I}_DISABLED_DIR_PATTERN + if [[ $_p9k__cwd != ${(P)~disabled} ]]; then + local val=$_p9k__segment_val_left[_p9k__segment_index] + if [[ -n $val ]]; then + _p9k__prompt+=$val + else + if [[ $_p9k__segment_name == custom_* ]]; then + _p9k_custom_prompt $_p9k__segment_name[8,-1] + elif (( $+functions[prompt_$_p9k__segment_name] )); then + prompt_$_p9k__segment_name + fi + fi + fi + fi + ((++_p9k__segment_index)) + done + fi + _p9k__prompt=${${_p9k__prompt//$' %{\b'/'%{%G'}//$' \b'} + left_idx=_p9k__segment_index + _p9k__prompt+=$_p9k_line_suffix_left[_p9k__line_index] + if (( $+_p9k__dir || (_p9k__line_index != num_lines && $#right) )); then + _p9k__prompt='${${:-${_p9k__d::=0}${_p9k__rprompt::='$right'}${_p9k__lprompt::='$_p9k__prompt'}}+}' + _p9k__prompt+=$_p9k_gap_pre + if (( $+_p9k__dir )); then + if (( _p9k__line_index == num_lines && (_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS > 0 || _POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT > 0) )); then + local a=$_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS + local f=$((0.01*_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT))'*_p9k__clm' + _p9k__prompt+="\${\${_p9k__h::=$((($a<$f)*$f+($a>=$f)*$a))}+}" + else + _p9k__prompt+='${${_p9k__h::=0}+}' + fi + if [[ $_POWERLEVEL9K_DIR_MAX_LENGTH == <->('%'|) ]]; then + local lim= + if [[ $_POWERLEVEL9K_DIR_MAX_LENGTH[-1] == '%' ]]; then + lim="$_p9k__dir_len-$((0.01*$_POWERLEVEL9K_DIR_MAX_LENGTH[1,-2]))*_p9k__clm" + else + lim=$((_p9k__dir_len-_POWERLEVEL9K_DIR_MAX_LENGTH)) + ((lim <= 0)) && lim= + fi + if [[ -n $lim ]]; then + _p9k__prompt+='${${${$((_p9k__h<_p9k__m+'$lim')):#1}:-${_p9k__h::=$((_p9k__m+'$lim'))}}+}' + fi + fi + _p9k__prompt+='${${_p9k__d::=$((_p9k__m-_p9k__h))}+}' + _p9k__prompt+='${_p9k__lprompt/\%\{d\%\}*\%\{d\%\}/${_p9k__'$_p9k__line_index'ldir-'$_p9k__dir'}}' + _p9k__prompt+='${${_p9k__m::=$((_p9k__d+_p9k__h))}+}' + else + _p9k__prompt+='${_p9k__lprompt}' + fi + ((_p9k__line_index != num_lines && $#right)) && _p9k__prompt+=$_p9k_line_gap_post[_p9k__line_index] + fi + if (( _p9k__line_index == num_lines )); then + [[ -n $right ]] && RPROMPT=$_p9k_prompt_prefix_right$right$_p9k_prompt_suffix_right + _p9k__prompt='${_p9k__'$_p9k__line_index'-'$_p9k__prompt'}'$_p9k_prompt_suffix_left + [[ $1 == instant_ ]] || PROMPT+=$_p9k__prompt + else + [[ -n $right ]] || _p9k__prompt+=$'\n' + PROMPT+='${_p9k__'$_p9k__line_index'-'$_p9k__prompt'}' + fi + done + + _p9k__prompt_side= + (( $#_p9k_cache < _POWERLEVEL9K_MAX_CACHE_SIZE )) || _p9k_cache=() + (( $#_p9k__cache_ephemeral < _POWERLEVEL9K_MAX_CACHE_SIZE )) || _p9k__cache_ephemeral=() + + [[ -n $RPROMPT ]] || unset RPROMPT +} + +_p9k_set_instant_prompt() { + local saved_prompt=$PROMPT + local saved_rprompt=$RPROMPT + _p9k_set_prompt instant_ + typeset -g _p9k__instant_prompt=$PROMPT$'\x1f'$_p9k__prompt$'\x1f'$RPROMPT + PROMPT=$saved_prompt + RPROMPT=$saved_rprompt + [[ -n $RPROMPT ]] || unset RPROMPT +} + +typeset -gri __p9k_instant_prompt_version=47 + +_p9k_dump_instant_prompt() { + local user=${(%):-%n} + local root_dir=${__p9k_dump_file:h} + local prompt_dir=${root_dir}/p10k-$user + local root_file=$root_dir/p10k-instant-prompt-$user.zsh + local prompt_file=$prompt_dir/prompt-${#_p9k__cwd} + [[ -d $prompt_dir ]] || mkdir -p $prompt_dir || return + [[ -w $root_dir && -w $prompt_dir ]] || return + + if [[ ! -e $root_file ]]; then + local tmp=$root_file.tmp.$$ + local -i fd + sysopen -a -m 600 -o creat,trunc -u fd -- $tmp || return + { + [[ $TERM == (screen*|tmux*) ]] && local screen='-n' || local screen='-z' + local -a display_v=("${_p9k__display_v[@]}") + local -i i + for ((i = 6; i <= $#display_v; i+=2)); do display_v[i]=show; done + display_v[2]=hide + display_v[4]=hide + local gitstatus_dir=${${_POWERLEVEL9K_GITSTATUS_DIR:A}:-${__p9k_root_dir}/gitstatus} + local gitstatus_header + if [[ -r $gitstatus_dir/install.info ]]; then + IFS= read -r gitstatus_header <$gitstatus_dir/install.info || return + fi + >&$fd print -r -- '[[ -t 0 && -t 1 && -t 2 && -o interactive && -o zle && -o no_xtrace ]] && + ! (( ${+__p9k_instant_prompt_disabled} || ZSH_SUBSHELL || ${+ZSH_SCRIPT} || ${+ZSH_EXECUTION_STRING} )) || return 0' + >&$fd print -r -- "() { + $__p9k_intro_no_locale + typeset -gi __p9k_instant_prompt_disabled=1 + [[ \$ZSH_VERSION == ${(q)ZSH_VERSION} && \$ZSH_PATCHLEVEL == ${(q)ZSH_PATCHLEVEL} && + $screen \${(M)TERM:#(screen*|tmux*)} && + \${#\${(M)VTE_VERSION:#(<1-4602>|4801)}} == "${#${(M)VTE_VERSION:#(<1-4602>|4801)}}" && + \$POWERLEVEL9K_DISABLE_INSTANT_PROMPT != 'true' && + \$POWERLEVEL9K_INSTANT_PROMPT != 'off' ]] || return + typeset -g __p9k_instant_prompt_param_sig=${(q+)_p9k__param_sig} + local gitstatus_dir=${(q)gitstatus_dir} + local gitstatus_header=${(q)gitstatus_header} + local -i ZLE_RPROMPT_INDENT=${ZLE_RPROMPT_INDENT:-1} + local PROMPT_EOL_MARK=${(q)PROMPT_EOL_MARK-%B%S%#%s%b} + [[ -n \$SSH_CLIENT || -n \$SSH_TTY || -n \$SSH_CONNECTION ]] && local ssh=1 || local ssh=0 + local cr=\$'\r' lf=\$'\n' esc=\$'\e[' rs=$'\x1e' us=$'\x1f' + local -i height=${_POWERLEVEL9K_INSTANT_PROMPT_COMMAND_LINES-1} + local prompt_dir=${(q)prompt_dir}" + if (( ! ${+_POWERLEVEL9K_INSTANT_PROMPT_COMMAND_LINES} )); then + >&$fd print -r -- ' + (( _z4h_can_save_restore_screen == 1 )) && height=0' + fi + >&$fd print -r -- ' + local real_gitstatus_header + if [[ -r $gitstatus_dir/install.info ]]; then + IFS= read -r real_gitstatus_header <$gitstatus_dir/install.info || real_gitstatus_header=borked + fi + [[ $real_gitstatus_header == $gitstatus_header ]] || return + zmodload zsh/langinfo zsh/terminfo zsh/system || return + if [[ $langinfo[CODESET] != (utf|UTF)(-|)8 ]]; then + local loc_cmd=$commands[locale] + [[ -z $loc_cmd ]] && loc_cmd='${(q)commands[locale]}' + if [[ -x $loc_cmd ]]; then + local -a locs + if locs=(${(@M)$(locale -a 2>/dev/null):#*.(utf|UTF)(-|)8}) && (( $#locs )); then + local loc=${locs[(r)(#i)C.UTF(-|)8]:-${locs[(r)(#i)en_US.UTF(-|)8]:-$locs[1]}} + [[ -n $LC_ALL ]] && local LC_ALL=$loc || local LC_CTYPE=$loc + fi + fi + fi + (( terminfo[colors] == '${terminfo[colors]:-0}' )) || return + (( $+terminfo[cuu] && $+terminfo[cuf] && $+terminfo[ed] && $+terminfo[sc] && $+terminfo[rc] )) || return + local pwd=${(%):-%/} + [[ $pwd == /* ]] || return + local prompt_file=$prompt_dir/prompt-${#pwd} + local key=$pwd:$ssh:${(%):-%#} + local content + if [[ ! -e $prompt_file ]]; then + typeset -gi __p9k_instant_prompt_sourced='$__p9k_instant_prompt_version' + return 1 + fi + { content="$(<$prompt_file)" } 2>/dev/null || return + local tail=${content##*$rs$key$us} + if (( ${#tail} == ${#content} )); then + typeset -gi __p9k_instant_prompt_sourced='$__p9k_instant_prompt_version' + return 1 + fi + local _p9k__ipe + local P9K_PROMPT=instant + if [[ -z $P9K_TTY || $P9K_TTY == old && -n ${_P9K_TTY:#$TTY} ]]; then' + if (( _POWERLEVEL9K_NEW_TTY_MAX_AGE_SECONDS < 0 )); then + >&$fd print -r -- ' typeset -gx P9K_TTY=new' + else + >&$fd print -r -- ' + typeset -gx P9K_TTY=old + zmodload -F zsh/stat b:zstat || return + zmodload zsh/datetime || return + local -a stat + if zstat -A stat +ctime -- $TTY 2>/dev/null && + (( EPOCHREALTIME - stat[1] < '$_POWERLEVEL9K_NEW_TTY_MAX_AGE_SECONDS' )); then + P9K_TTY=new + fi' + fi + >&$fd print -r -- ' fi + typeset -gx _P9K_TTY=$TTY + local -i _p9k__empty_line_i=3 _p9k__ruler_i=3 + local -A _p9k_display_k=('${(j: :)${(@q)${(kv)_p9k_display_k}}}') + local -a _p9k__display_v=('${(j: :)${(@q)display_v}}') + function p10k() { + '$__p9k_intro' + [[ $1 == display ]] || return + shift + local -i k dump + local opt prev new pair list name var + while getopts ":ha" opt; do + case $opt in + a) dump=1;; + h) return 0;; + ?) return 1;; + esac + done + if (( dump )); then + reply=() + shift $((OPTIND-1)) + (( ARGC )) || set -- "*" + for opt; do + for k in ${(u@)_p9k_display_k[(I)$opt]:/(#m)*/$_p9k_display_k[$MATCH]}; do + reply+=($_p9k__display_v[k,k+1]) + done + done + return 0 + fi + for opt in "${@:$OPTIND}"; do + pair=(${(s:=:)opt}) + list=(${(s:,:)${pair[2]}}) + if [[ ${(b)pair[1]} == $pair[1] ]]; then + local ks=($_p9k_display_k[$pair[1]]) + else + local ks=(${(u@)_p9k_display_k[(I)$pair[1]]:/(#m)*/$_p9k_display_k[$MATCH]}) + fi + for k in $ks; do + if (( $#list == 1 )); then + [[ $_p9k__display_v[k+1] == $list[1] ]] && continue + new=$list[1] + else + new=${list[list[(I)$_p9k__display_v[k+1]]+1]:-$list[1]} + [[ $_p9k__display_v[k+1] == $new ]] && continue + fi + _p9k__display_v[k+1]=$new + name=$_p9k__display_v[k] + if [[ $name == (empty_line|ruler) ]]; then + var=_p9k__${name}_i + [[ $new == hide ]] && typeset -gi $var=3 || unset $var + elif [[ $name == (#b)(<->)(*) ]]; then + var=_p9k__${match[1]}${${${${match[2]//\/}/#left/l}/#right/r}/#gap/g} + [[ $new == hide ]] && typeset -g $var= || unset $var + fi + done + done + }' + if (( _POWERLEVEL9K_PROMPT_ADD_NEWLINE )); then + >&$fd print -r -- ' [[ $P9K_TTY == old ]] && { unset _p9k__empty_line_i; _p9k__display_v[2]=print }' + fi + if (( _POWERLEVEL9K_SHOW_RULER )); then + >&$fd print -r -- '[[ $P9K_TTY == old ]] && { unset _p9k__ruler_i; _p9k__display_v[4]=print }' + fi + if (( $+functions[p10k-on-init] )); then + >&$fd print -r -- ' + p10k-on-init() { '$functions[p10k-on-init]' }' + fi + if (( $+functions[p10k-on-pre-prompt] )); then + >&$fd print -r -- ' + p10k-on-pre-prompt() { '$functions[p10k-on-pre-prompt]' }' + fi + if (( $+functions[p10k-on-post-prompt] )); then + >&$fd print -r -- ' + p10k-on-post-prompt() { '$functions[p10k-on-post-prompt]' }' + fi + if (( $+functions[p10k-on-post-widget] )); then + >&$fd print -r -- ' + p10k-on-post-widget() { '$functions[p10k-on-post-widget]' }' + fi + if (( $+functions[p10k-on-init] )); then + >&$fd print -r -- ' + p10k-on-init' + fi + local pat idx var + for pat idx var in $_p9k_show_on_command; do + >&$fd print -r -- " + local $var= + _p9k__display_v[$idx]=hide" + done + if (( $+functions[p10k-on-pre-prompt] )); then + >&$fd print -r -- ' + p10k-on-pre-prompt' + fi + if (( $+functions[p10k-on-init] )); then + >&$fd print -r -- ' + unfunction p10k-on-init' + fi + if (( $+functions[p10k-on-pre-prompt] )); then + >&$fd print -r -- ' + unfunction p10k-on-pre-prompt' + fi + if (( $+functions[p10k-on-post-prompt] )); then + >&$fd print -r -- ' + unfunction p10k-on-post-prompt' + fi + if (( $+functions[p10k-on-post-widget] )); then + >&$fd print -r -- ' + unfunction p10k-on-post-widget' + fi + >&$fd print -r -- ' + () { +'$functions[_p9k_init_toolbox]' + } + trap "unset -m _p9k__\*; unfunction p10k" EXIT + local -a _p9k_t=("${(@ps:$us:)${tail%%$rs*}}") + if [[ $+VTE_VERSION == 1 || $TERM_PROGRAM == Hyper ]] && (( $+commands[stty] )); then + if [[ $TERM_PROGRAM == Hyper ]]; then + local bad_lines=40 bad_columns=100 + else + local bad_lines=24 bad_columns=80 + fi + if (( LINES == bad_lines && COLUMNS == bad_columns )); then + zmodload -F zsh/stat b:zstat || return + zmodload zsh/datetime || return + local -a tty_ctime + if ! zstat -A tty_ctime +ctime -- $TTY 2>/dev/null || (( tty_ctime[1] + 2 > EPOCHREALTIME )); then + local -F deadline=$((EPOCHREALTIME+0.025)) + local tty_size + while true; do + if (( EPOCHREALTIME > deadline )) || ! tty_size="$(command stty size 2>/dev/null)" || [[ $tty_size != <->" "<-> ]]; then + (( $+_p9k__ruler_i )) || local -i _p9k__ruler_i=1 + local _p9k__g= _p9k__'$#_p9k_line_segments_right'r= _p9k__'$#_p9k_line_segments_right'r_frame= + break + fi + if [[ $tty_size != "$bad_lines $bad_columns" ]]; then + local lines_columns=(${=tty_size}) + local LINES=$lines_columns[1] + local COLUMNS=$lines_columns[2] + break + fi + done + fi + fi + fi' + (( __p9k_ksh_arrays )) && >&$fd print -r -- ' setopt ksh_arrays' + (( __p9k_sh_glob )) && >&$fd print -r -- ' setopt sh_glob' + >&$fd print -r -- ' typeset -ga __p9k_used_instant_prompt=("${(@e)_p9k_t[-3,-1]}")' + (( __p9k_ksh_arrays )) && >&$fd print -r -- ' unsetopt ksh_arrays' + (( __p9k_sh_glob )) && >&$fd print -r -- ' unsetopt sh_glob' + >&$fd print -r -- ' + local -i prompt_height=${#${__p9k_used_instant_prompt[1]//[^$lf]}} + (( height += prompt_height )) + local _p9k__ret + function _p9k_prompt_length() { + local -i COLUMNS=1024 + local -i x y=${#1} m + if (( y )); then + while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do + x=y + (( y *= 2 )) + done + while (( y > x + 1 )); do + (( m = x + (y - x) / 2 )) + (( ${${(%):-$1%$m(l.x.y)}[-1]} = m )) + done + fi + typeset -g _p9k__ret=$x + } + local out=${(%):-%b%k%f%s%u} + if [[ $P9K_TTY == old && ( $+VTE_VERSION == 0 && $TERM_PROGRAM != Hyper || $+_p9k__g == 0 ) ]]; then + local mark=${(e)PROMPT_EOL_MARK} + [[ $mark == "%B%S%#%s%b" ]] && _p9k__ret=1 || _p9k_prompt_length $mark + local -i fill=$((COLUMNS > _p9k__ret ? COLUMNS - _p9k__ret : 0)) + out+="${(%):-$mark${(pl.$fill.. .)}$cr%b%k%f%s%u%E}" + else + out+="${(%):-$cr%E}" + fi + if (( _z4h_can_save_restore_screen != 1 )); then + (( height )) && out+="${(pl.$height..$lf.)}$esc${height}A" + out+="$terminfo[sc]" + fi + out+=${(%):-"$__p9k_used_instant_prompt[1]$__p9k_used_instant_prompt[2]"} + if [[ -n $__p9k_used_instant_prompt[3] ]]; then + _p9k_prompt_length "$__p9k_used_instant_prompt[2]" + local -i left_len=_p9k__ret + _p9k_prompt_length "$__p9k_used_instant_prompt[3]" + if (( _p9k__ret )); then + local -i gap=$((COLUMNS - left_len - _p9k__ret - ZLE_RPROMPT_INDENT)) + if (( gap >= 40 )); then + out+="${(pl.$gap.. .)}${(%):-${__p9k_used_instant_prompt[3]}%b%k%f%s%u}$cr$esc${left_len}C" + fi + fi + fi + if (( _z4h_can_save_restore_screen == 1 )); then + if (( height )); then + out+="$cr${(pl:$((height-prompt_height))::\n:)}$esc${height}A$terminfo[sc]$out" + else + out+="$cr${(pl:$((height-prompt_height))::\n:)}$terminfo[sc]$out" + fi + fi + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + else + local tmpdir=/tmp + fi + typeset -g __p9k_instant_prompt_output=$tmpdir/p10k-instant-prompt-output-${(%):-%n}-$$ + { : > $__p9k_instant_prompt_output } || return + print -rn -- "${out}${esc}?2004h" || return + if (( $+commands[stty] )); then + command stty -icanon 2>/dev/null + fi + local fd_null + sysopen -ru fd_null /dev/null || return + exec {__p9k_fd_0}<&0 {__p9k_fd_1}>&1 {__p9k_fd_2}>&2 0<&$fd_null 1>$__p9k_instant_prompt_output + exec 2>&1 {fd_null}>&- + typeset -gi __p9k_instant_prompt_active=1 + if (( _z4h_can_save_restore_screen == 1 )); then + typeset -g _z4h_saved_screen + -z4h-save-screen + fi + typeset -g __p9k_instant_prompt_dump_file=${XDG_CACHE_HOME:-~/.cache}/p10k-dump-${(%):-%n}.zsh + if builtin source $__p9k_instant_prompt_dump_file 2>/dev/null && (( $+functions[_p9k_preinit] )); then + _p9k_preinit + fi + function _p9k_instant_prompt_cleanup() { + (( ZSH_SUBSHELL == 0 && ${+__p9k_instant_prompt_active} )) || return 0 + '$__p9k_intro_no_locale' + unset __p9k_instant_prompt_active + exec 0<&$__p9k_fd_0 1>&$__p9k_fd_1 2>&$__p9k_fd_2 {__p9k_fd_0}>&- {__p9k_fd_1}>&- {__p9k_fd_2}>&- + unset __p9k_fd_0 __p9k_fd_1 __p9k_fd_2 + typeset -gi __p9k_instant_prompt_erased=1 + if (( _z4h_can_save_restore_screen == 1 && __p9k_instant_prompt_sourced >= 35 )); then + -z4h-restore-screen + unset _z4h_saved_screen + fi + print -rn -- $terminfo[rc]${(%):-%b%k%f%s%u}$terminfo[ed] + if [[ -s $__p9k_instant_prompt_output ]]; then + command cat $__p9k_instant_prompt_output 2>/dev/null + if (( $1 )); then + local _p9k__ret mark="${(e)${PROMPT_EOL_MARK-%B%S%#%s%b}}" + _p9k_prompt_length $mark + local -i fill=$((COLUMNS > _p9k__ret ? COLUMNS - _p9k__ret : 0)) + echo -nE - "${(%):-%b%k%f%s%u$mark${(pl.$fill.. .)}$cr%b%k%f%s%u%E}" + fi + fi + zshexit_functions=(${zshexit_functions:#_p9k_instant_prompt_cleanup}) + zmodload -F zsh/files b:zf_rm || return + local user=${(%):-%n} + local root_dir=${__p9k_instant_prompt_dump_file:h} + zf_rm -f -- $__p9k_instant_prompt_output $__p9k_instant_prompt_dump_file{,.zwc} $root_dir/p10k-instant-prompt-$user.zsh{,.zwc} $root_dir/p10k-$user/prompt-*(N) 2>/dev/null + } + function _p9k_instant_prompt_precmd_first() { + '$__p9k_intro' + function _p9k_instant_prompt_sched_last() { + (( ${+__p9k_instant_prompt_active} )) || return 0 + _p9k_instant_prompt_cleanup 1 + setopt no_local_options prompt_cr prompt_sp + } + zmodload zsh/sched + sched +0 _p9k_instant_prompt_sched_last + precmd_functions=(${(@)precmd_functions:#_p9k_instant_prompt_precmd_first}) + } + zshexit_functions=(_p9k_instant_prompt_cleanup $zshexit_functions) + precmd_functions=(_p9k_instant_prompt_precmd_first $precmd_functions) + DISABLE_UPDATE_PROMPT=true +} && unsetopt prompt_cr prompt_sp && typeset -gi __p9k_instant_prompt_sourced='$__p9k_instant_prompt_version' || + typeset -gi __p9k_instant_prompt_sourced=${__p9k_instant_prompt_sourced:-0}' + } always { + exec {fd}>&- + } + { + (( ! $? )) || return + # `zf_mv -f src dst` fails on NTFS if `dst` is not writable, hence `zf_rm`. + zf_rm -f -- $root_file.zwc || return + zf_mv -f -- $tmp $root_file || return + zcompile -R -- $tmp.zwc $root_file || return + zf_mv -f -- $tmp.zwc $root_file.zwc || return + } always { + (( $? )) && zf_rm -f -- $tmp $tmp.zwc 2>/dev/null + } + fi + + local tmp=$prompt_file.tmp.$$ + zf_mv -f -- $prompt_file $tmp 2>/dev/null + if [[ "$(<$tmp)" == *$'\x1e'$_p9k__instant_prompt_sig$'\x1f'* ]] 2>/dev/null; then + echo -n >$tmp || return + fi + + local -i fd + sysopen -a -m 600 -o creat -u fd -- $tmp || return + { + { + print -rnu $fd -- $'\x1e'$_p9k__instant_prompt_sig$'\x1f'${(pj:\x1f:)_p9k_t}$'\x1f'$_p9k__instant_prompt || return + } always { + exec {fd}>&- + } + zf_mv -f -- $tmp $prompt_file || return + } always { + (( $? )) && zf_rm -f -- $tmp 2>/dev/null + } +} + +typeset -gi __p9k_sh_glob +typeset -gi __p9k_ksh_arrays +typeset -gi __p9k_new_status +typeset -ga __p9k_new_pipestatus + +_p9k_save_status() { + local -i pipe + if (( !$+_p9k__line_finished )); then + : # SIGINT + elif (( !$+_p9k__preexec_cmd )); then + # Empty line, comment or parse error. + # + # This case is handled incorrectly: + # + # true | false + # | + # + # Here status=1 and pipestatus=(0 1). Ideally we should ignore pipestatus but we won't. + # + # This works though (unless pipefail is set): + # + # false | true + # | + # + # We get status=1 and pipestatus=(1 0) and correctly ignore pipestatus. + (( _p9k__status == __p9k_new_status )) && return + elif (( $__p9k_new_pipestatus[(I)$__p9k_new_status] )); then # just in case + local cmd=(${(z)_p9k__preexec_cmd}) + if [[ $#cmd != 0 && $cmd[1] != '!' && ${(Q)cmd[1]} != coproc ]]; then + local arg + for arg in ${(z)_p9k__preexec_cmd}; do + # '()' is for functions, *';' is for complex commands. + if [[ $arg == ('()'|'&&'|'||'|'&'|'&|'|'&!'|*';') ]]; then + pipe=0 + break + elif [[ $arg == *('|'|'|&')* ]]; then + pipe=1 + fi + done + fi + fi + _p9k__status=$__p9k_new_status + if (( pipe )); then + _p9k__pipestatus=($__p9k_new_pipestatus) + else + _p9k__pipestatus=($_p9k__status) + fi +} + +function _p9k_dump_state() { + local dir=${__p9k_dump_file:h} + [[ -d $dir ]] || mkdir -p -- $dir || return + [[ -w $dir ]] || return + local tmp=$__p9k_dump_file.tmp.$$ + local -i fd + sysopen -a -m 600 -o creat,trunc -u fd -- $tmp || return + { + { + typeset -g __p9k_cached_param_pat=$_p9k__param_pat + typeset -g __p9k_cached_param_sig=$_p9k__param_sig + typeset -pm __p9k_cached_param_pat __p9k_cached_param_sig >&$fd || return + unset __p9k_cached_param_pat __p9k_cached_param_sig + (( $+_p9k_preinit )) && { print -r -- $_p9k_preinit >&$fd || return } + print -r -- '_p9k_restore_state_impl() {' >&$fd || return + typeset -pm '_POWERLEVEL9K_*|_p9k_[^_]*|icons' >&$fd || return + print -r -- '}' >&$fd || return + } always { + exec {fd}>&- + } + # `zf_mv -f src dst` fails on NTFS if `dst` is not writable, hence `zf_rm`. + zf_rm -f -- $__p9k_dump_file.zwc || return + zf_mv -f -- $tmp $__p9k_dump_file || return + zcompile -R -- $tmp.zwc $__p9k_dump_file || return + zf_mv -f -- $tmp.zwc $__p9k_dump_file.zwc || return + } always { + (( $? )) && zf_rm -f -- $tmp $tmp.zwc 2>/dev/null + } +} + +function _p9k_delete_instant_prompt() { + local user=${(%):-%n} + local root_dir=${__p9k_dump_file:h} + zf_rm -f -- $root_dir/p10k-instant-prompt-$user.zsh{,.zwc} ${root_dir}/p10k-$user/prompt-*(N) 2>/dev/null +} + +function _p9k_restore_state() { + { + [[ $__p9k_cached_param_pat == $_p9k__param_pat && $__p9k_cached_param_sig == $_p9k__param_sig ]] || return + (( $+functions[_p9k_restore_state_impl] )) || return + _p9k_restore_state_impl + return 0 + } always { + if (( $? )); then + if (( $+functions[_p9k_preinit] )); then + unfunction _p9k_preinit + (( $+functions[gitstatus_stop_p9k_] )) && gitstatus_stop_p9k_ POWERLEVEL9K + fi + _p9k_delete_instant_prompt + zf_rm -f -- $__p9k_dump_file{,.zwc} 2>/dev/null + elif [[ $__p9k_instant_prompt_param_sig != $_p9k__param_sig ]]; then + _p9k_delete_instant_prompt + _p9k_dumped_instant_prompt_sigs=() + fi + unset __p9k_cached_param_sig + } +} + +function _p9k_clear_instant_prompt() { + if (( $+__p9k_fd_0 )); then + exec 0<&$__p9k_fd_0 {__p9k_fd_0}>&- + unset __p9k_fd_0 + fi + exec 1>&$__p9k_fd_1 2>&$__p9k_fd_2 {__p9k_fd_1}>&- {__p9k_fd_2}>&- + unset __p9k_fd_1 __p9k_fd_2 + zshexit_functions=(${zshexit_functions:#_p9k_instant_prompt_cleanup}) + if (( _p9k__can_hide_cursor )); then + echoti civis + _p9k__cursor_hidden=1 + fi + if [[ -s $__p9k_instant_prompt_output ]]; then + { + local content + [[ $_POWERLEVEL9K_INSTANT_PROMPT == verbose ]] && content="$(<$__p9k_instant_prompt_output)" + local mark="${(e)${PROMPT_EOL_MARK-%B%S%#%s%b}}" + _p9k_prompt_length $mark + local -i fill=$((COLUMNS > _p9k__ret ? COLUMNS - _p9k__ret : 0)) + local cr=$'\r' + local sp="${(%):-%b%k%f%s%u$mark${(pl.$fill.. .)}$cr%b%k%f%s%u%E}" + if (( _z4h_can_save_restore_screen == 1 && __p9k_instant_prompt_sourced >= 35 )); then + -z4h-restore-screen + unset _z4h_saved_screen + fi + print -rn -- $terminfo[rc]${(%):-%b%k%f%s%u}$terminfo[ed] + local unexpected=${${content//$'\e[?'<->'c'}//$'\e['<->' q'} + unexpected=${(S)unexpected//$'\eP'(|*[^$'\e'])($'\e\e')#$'\e\\'} + unexpected=${(S)unexpected//$'\e'[^$'\a\e']#($'\a'|$'\e\\')} + # Visual Studio Code prints this garbage. + unexpected=${${unexpected//$'\033[1;32mShell integration activated\033[0m\n'}//$'\r'} + typeset -g P9K_STARTUP_CONSOLE_OUTPUT=("$content" "$unexpected") + if [[ -n $unexpected ]]; then + local omz1='[Oh My Zsh] Would you like to update? [Y/n]: ' + local omz2='Updating Oh My Zsh' + local omz3='https://shop.planetargon.com/collections/oh-my-zsh' + local omz4='There was an error updating. Try again later?' + if [[ $unexpected != ($omz1|)$omz2*($omz3|$omz4)[^$'\n']#($'\n'|) ]]; then + echo -E - "" + echo -E - "${(%):-[%3FWARNING%f]: Console output during zsh initialization detected.}" + echo -E - "" + echo -E - "${(%):-When using Powerlevel10k with instant prompt, console output during zsh}" + echo -E - "${(%):-initialization may indicate issues.}" + echo -E - "" + echo -E - "${(%):-You can:}" + echo -E - "" + echo -E - "${(%):- - %BRecommended%b: Change %B$__p9k_zshrc_u%b so that it does not perform console I/O}" + echo -E - "${(%):- after the instant prompt preamble. See the link below for details.}" + echo -E - "" + echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + echo -E - "${(%):- * Zsh will start %Bquickly%b and prompt will update %Bsmoothly%b.}" + echo -E - "" + echo -E - "${(%):- - Suppress this warning either by running %Bp10k configure%b or by manually}" + echo -E - "${(%):- defining the following parameter:}" + echo -E - "" + echo -E - "${(%):- %3Ftypeset%f -g POWERLEVEL9K_INSTANT_PROMPT=quiet}" + echo -E - "" + echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + echo -E - "${(%):- * Zsh will start %Bquickly%b but prompt will %Bjump down%b after initialization.}" + echo -E - "" + echo -E - "${(%):- - Disable instant prompt either by running %Bp10k configure%b or by manually}" + echo -E - "${(%):- defining the following parameter:}" + echo -E - "" + echo -E - "${(%):- %3Ftypeset%f -g POWERLEVEL9K_INSTANT_PROMPT=off}" + echo -E - "" + echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + echo -E - "${(%):- * Zsh will start %Bslowly%b.}" + echo -E - "" + echo -E - "${(%):- - Do nothing.}" + echo -E - "" + echo -E - "${(%):- * You %Bwill%b see this error message every time you start zsh.}" + echo -E - "${(%):- * Zsh will start %Bquickly%b but prompt will %Bjump down%b after initialization.}" + echo -E - "" + echo -E - "${(%):-For details, see:}" + if (( _p9k_term_has_href )); then + echo - "${(%):-\e]8;;https://github.com/romkatv/powerlevel10k#instant-prompt\ahttps://github.com/romkatv/powerlevel10k#instant-prompt\e]8;;\a}" + else + echo - "${(%):-https://github.com/romkatv/powerlevel10k#instant-prompt}" + fi + echo -E - "" + echo - "${(%):-%3F-- console output produced during zsh initialization follows --%f}" + echo -E - "" + fi + fi + command cat -- $__p9k_instant_prompt_output + echo -nE - $sp + zf_rm -f -- $__p9k_instant_prompt_output + } 2>/dev/null + else + zf_rm -f -- $__p9k_instant_prompt_output 2>/dev/null + if (( _z4h_can_save_restore_screen == 1 && __p9k_instant_prompt_sourced >= 35 )); then + -z4h-restore-screen + unset _z4h_saved_screen + fi + print -rn -- $terminfo[rc]${(%):-%b%k%f%s%u}$terminfo[ed] + fi + prompt_opts=(percent subst sp cr) + if [[ $_POWERLEVEL9K_DISABLE_INSTANT_PROMPT == 0 && $__p9k_instant_prompt_active == 2 ]]; then + >&2 echo -E - "" + >&2 echo -E - "${(%):-[%1FERROR%f]: When using Powerlevel10k with instant prompt, %Bprompt_cr%b must be unset.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):-You can:}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - %BRecommended%b: call %Bp10k finalize%b at the end of %B$__p9k_zshrc_u%b.}" + >&2 echo -E - "${(%):- You can do this by running the following command:}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- %2Fecho%f %3F'(( ! \${+functions[p10k]\} )) || p10k finalize'%f >>! $__p9k_zshrc_u}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + >&2 echo -E - "${(%):- * Zsh will start %Bquickly%b and %Bwithout%b prompt flickering.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - Find where %Bprompt_cr%b option gets sets in your zsh configs and stop setting it.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + >&2 echo -E - "${(%):- * Zsh will start %Bquickly%b and %Bwithout%b prompt flickering.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - Disable instant prompt either by running %Bp10k configure%b or by manually}" + >&2 echo -E - "${(%):- defining the following parameter:}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- %3Ftypeset%f -g POWERLEVEL9K_INSTANT_PROMPT=off}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + >&2 echo -E - "${(%):- * Zsh will start %Bslowly%b.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - Do nothing.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill%b see this error message every time you start zsh.}" + >&2 echo -E - "${(%):- * Zsh will start %Bquckly%b but %Bwith%b prompt flickering.}" + >&2 echo -E - "" + fi +} + +function _p9k_do_dump() { + eval "$__p9k_intro" + zle -F $1 + exec {1}>&- + (( _p9k__state_dump_fd )) || return + if (( ! _p9k__instant_prompt_disabled )); then + _p9k__instant_prompt_sig=$_p9k__cwd:$P9K_SSH:${(%):-%#} + _p9k_set_instant_prompt + _p9k_dump_instant_prompt + _p9k_dumped_instant_prompt_sigs[$_p9k__instant_prompt_sig]=1 + fi + _p9k_dump_state + _p9k__state_dump_scheduled=0 + _p9k__state_dump_fd=0 +} + +function _p9k_should_dump() { + (( __p9k_dumps_enabled && ! _p9k__state_dump_fd )) || return + (( _p9k__state_dump_scheduled || _p9k__prompt_idx == 1 )) && return + _p9k__instant_prompt_sig=$_p9k__cwd:$P9K_SSH:${(%):-%#} + (( ! $+_p9k_dumped_instant_prompt_sigs[$_p9k__instant_prompt_sig] )) +} + +# Must not run under `eval "$__p9k_intro_locale"`. Safe to run with any options. +function _p9k_restore_special_params() { + (( ! ${+_p9k__real_zle_rprompt_indent} )) || { + [[ -n "$_p9k__real_zle_rprompt_indent" ]] && + ZLE_RPROMPT_INDENT="$_p9k__real_zle_rprompt_indent" || + unset ZLE_RPROMPT_INDENT + unset _p9k__real_zle_rprompt_indent + } + (( ! ${+_p9k__real_lc_ctype} )) || { + LC_CTYPE="$_p9k__real_lc_ctype" + unset _p9k__real_lc_ctype + } + (( ! ${+_p9k__real_lc_all} )) || { + LC_ALL="$_p9k__real_lc_all" + unset _p9k__real_lc_all + } +} + +function _p9k_on_expand() { + (( _p9k__expanded && ! ${+__p9k_instant_prompt_active} )) && [[ "${langinfo[CODESET]}" == (utf|UTF)(-|)8 ]] && return + + eval "$__p9k_intro_no_locale" + + if [[ $langinfo[CODESET] != (utf|UTF)(-|)8 ]]; then + _p9k_restore_special_params + if [[ $langinfo[CODESET] != (utf|UTF)(-|)8 ]] && _p9k_init_locale; then + if [[ -n $LC_ALL ]]; then + _p9k__real_lc_all=$LC_ALL + LC_ALL=$__p9k_locale + else + _p9k__real_lc_ctype=$LC_CTYPE + LC_CTYPE=$__p9k_locale + fi + fi + fi + + (( _p9k__expanded && ! $+__p9k_instant_prompt_active )) && return + + eval "$__p9k_intro_locale" + + if (( ! _p9k__expanded )); then + if _p9k_should_dump; then + sysopen -o cloexec -ru _p9k__state_dump_fd /dev/null + zle -F $_p9k__state_dump_fd _p9k_do_dump + fi + + if [[ -z $P9K_TTY || $P9K_TTY == old && -n ${_P9K_TTY:#$TTY} ]]; then + typeset -gx P9K_TTY=old + if (( _POWERLEVEL9K_NEW_TTY_MAX_AGE_SECONDS < 0 )); then + P9K_TTY=new + else + local -a stat + if zstat -A stat +ctime -- $TTY 2>/dev/null && + (( EPOCHREALTIME - stat[1] < _POWERLEVEL9K_NEW_TTY_MAX_AGE_SECONDS )); then + P9K_TTY=new + fi + fi + fi + + typeset -gx _P9K_TTY=$TTY + + __p9k_reset_state=1 + + if (( _POWERLEVEL9K_PROMPT_ADD_NEWLINE )); then + if [[ $P9K_TTY == new ]]; then + _p9k__empty_line_i=3 + _p9k__display_v[2]=hide + elif [[ -z $_p9k_transient_prompt && $+functions[p10k-on-post-prompt] == 0 ]]; then + _p9k__empty_line_i=3 + _p9k__display_v[2]=print + else + unset _p9k__empty_line_i + _p9k__display_v[2]=show + fi + fi + + if (( _POWERLEVEL9K_SHOW_RULER )); then + if [[ $P9K_TTY == new ]]; then + _p9k__ruler_i=3 + _p9k__display_v[4]=hide + elif [[ -z $_p9k_transient_prompt && $+functions[p10k-on-post-prompt] == 0 ]]; then + _p9k__ruler_i=3 + _p9k__display_v[4]=print + else + unset _p9k__ruler_i + _p9k__display_v[4]=show + fi + fi + + (( _p9k__fully_initialized )) || _p9k_wrap_widgets + fi + + if (( $+__p9k_instant_prompt_active )); then + _p9k_clear_instant_prompt + unset __p9k_instant_prompt_active + fi + + if (( ! _p9k__expanded )); then + _p9k__expanded=1 + + (( _p9k__fully_initialized || ! $+functions[p10k-on-init] )) || p10k-on-init + + local pat idx var + for pat idx var in $_p9k_show_on_command; do + _p9k_display_segment $idx $var hide + done + + (( $+functions[p10k-on-pre-prompt] )) && p10k-on-pre-prompt + + if zle; then + local -a P9K_COMMANDS=($_p9k__last_commands) + local pat idx var + for pat idx var in $_p9k_show_on_command; do + if (( $P9K_COMMANDS[(I)$pat] )); then + _p9k_display_segment $idx $var show + else + _p9k_display_segment $idx $var hide + fi + done + if (( $+functions[p10k-on-post-widget] )); then + local -h WIDGET + unset WIDGET + p10k-on-post-widget + fi + else + if [[ $_p9k__display_v[2] == print && -n $_p9k_t[_p9k_empty_line_idx] ]]; then + print -rnP -- '%b%k%f%E'$_p9k_t[_p9k_empty_line_idx] + fi + if [[ $_p9k__display_v[4] == print ]]; then + () { + local ruler=$_p9k_t[_p9k_ruler_idx] + local -i _p9k__clm=COLUMNS _p9k__ind=${ZLE_RPROMPT_INDENT:-1} + (( __p9k_ksh_arrays )) && setopt ksh_arrays + (( __p9k_sh_glob )) && setopt sh_glob + setopt prompt_subst + print -rnP -- '%b%k%f%E'$ruler + } + fi + fi + + __p9k_reset_state=0 + _p9k__fully_initialized=1 + fi +} +functions -M _p9k_on_expand + +_p9k_precmd_impl() { + eval "$__p9k_intro" + + (( __p9k_enabled )) || return + + if ! zle || [[ -z $_p9k__param_sig ]]; then + if zle; then + __p9k_new_status=0 + __p9k_new_pipestatus=(0) + else + _p9k__must_restore_prompt=0 + fi + + if _p9k_must_init; then + local -i instant_prompt_disabled + if (( !__p9k_configured )); then + __p9k_configured=1 + if [[ -z "${parameters[(I)POWERLEVEL9K_*~POWERLEVEL9K_(MODE|CONFIG_FILE|GITSTATUS_DIR)]}" ]]; then + _p9k_can_configure -q + local -i ret=$? + if (( ret == 2 && $+__p9k_instant_prompt_active )); then + _p9k_clear_instant_prompt + unset __p9k_instant_prompt_active + _p9k_delete_instant_prompt + zf_rm -f -- $__p9k_dump_file{,.zwc} 2>/dev/null + () { + local key + while true; do + [[ -t 2 ]] + read -t0 -k key || break + done 2>/dev/null + } + _p9k_can_configure -q + ret=$? + fi + if (( ret == 0 )); then + if (( $+commands[git] )); then + ( + local -i pid + { + { /bin/sh "$__p9k_root_dir"/gitstatus/install /dev/null & } && pid=$! + ( builtin source "$__p9k_root_dir"/internal/wizard.zsh ) + } always { + if (( pid )); then + kill -- $pid 2>/dev/null + wait -- $pid 2>/dev/null + fi + } + ) + else + ( builtin source "$__p9k_root_dir"/internal/wizard.zsh ) + fi + if (( $? )); then + instant_prompt_disabled=1 + else + builtin source "$__p9k_cfg_path" + _p9k__force_must_init=1 + _p9k_must_init + fi + fi + fi + fi + typeset -gi _p9k__instant_prompt_disabled=instant_prompt_disabled + _p9k_init + fi + + if (( _p9k__timer_start )); then + typeset -gF P9K_COMMAND_DURATION_SECONDS=$((EPOCHREALTIME - _p9k__timer_start)) + else + unset P9K_COMMAND_DURATION_SECONDS + fi + _p9k_save_status + + if [[ $_p9k__preexec_cmd == [[:space:]]#(clear([[:space:]]##-(|x)(|T[a-zA-Z0-9-_\'\"]#))#|reset)[[:space:]]# && + $_p9k__status == 0 ]]; then + P9K_TTY=new + elif [[ $P9K_TTY == new && $_p9k__fully_initialized == 1 ]] && ! zle; then + P9K_TTY=old + fi + + _p9k__timer_start=0 + _p9k__region_active=0 + + unset _p9k__line_finished _p9k__preexec_cmd + _p9k__keymap=main + _p9k__zle_state=insert + + (( ++_p9k__prompt_idx )) + + if (( $+_p9k__iterm_cmd )); then + _p9k_iterm2_precmd $__p9k_new_status + fi + fi + + _p9k_fetch_cwd + + _p9k__refresh_reason=precmd + __p9k_reset_state=1 + + local -i fast_vcs + if (( _p9k_vcs_index && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + if [[ $_p9k__cwd != $~_POWERLEVEL9K_VCS_DISABLED_DIR_PATTERN ]]; then + local -F start_time=EPOCHREALTIME + unset _p9k__vcs + unset _p9k__vcs_timeout + local -i _p9k__vcs_called + _p9k_vcs_gitstatus + local -i fast_vcs=1 + fi + fi + + (( $+functions[_p9k_async_segments_compute] )) && _p9k_async_segments_compute + + _p9k__expanded=0 + + _p9k_set_prompt + + _p9k__refresh_reason='' + + if [[ $precmd_functions[1] != _p9k_do_nothing && $precmd_functions[(I)_p9k_do_nothing] != 0 ]]; then + precmd_functions=(_p9k_do_nothing ${(@)precmd_functions:#_p9k_do_nothing}) + fi + if [[ $precmd_functions[-1] != _p9k_precmd && $precmd_functions[(I)_p9k_precmd] != 0 ]]; then + precmd_functions=(${(@)precmd_functions:#_p9k_precmd} _p9k_precmd) + fi + if [[ $preexec_functions[1] != _p9k_preexec1 && $preexec_functions[(I)_p9k_preexec1] != 0 ]]; then + preexec_functions=(_p9k_preexec1 ${(@)preexec_functions:#_p9k_preexec1}) + fi + if [[ $preexec_functions[-1] != _p9k_preexec2 && $preexec_functions[(I)_p9k_preexec2] != 0 ]]; then + preexec_functions=(${(@)preexec_functions:#_p9k_preexec2} _p9k_preexec2) + fi + + if (( fast_vcs && _p9k_vcs_index && $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + if (( $+_p9k__vcs_timeout )); then + (( _p9k__vcs_timeout = _POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS + start_time - EPOCHREALTIME )) + (( _p9k__vcs_timeout >= 0 )) || (( _p9k__vcs_timeout = 0 )) + gitstatus_process_results_p9k_ -t $_p9k__vcs_timeout POWERLEVEL9K + fi + if (( ! $+_p9k__vcs )); then + local _p9k__prompt _p9k__prompt_side=$_p9k_vcs_side _p9k__segment_name=vcs + local -i _p9k__has_upglob _p9k__segment_index=_p9k_vcs_index _p9k__line_index=_p9k_vcs_line_index + _p9k_vcs_render + typeset -g _p9k__vcs=$_p9k__prompt + fi + fi + + _p9k_worker_receive + __p9k_reset_state=0 +} + +_p9k_trapint() { + if (( __p9k_enabled )); then + eval "$__p9k_intro" + _p9k_deschedule_redraw + zle && _p9k_on_widget_zle-line-finish int + fi + return 0 +} + +_p9k_precmd() { + __p9k_new_status=$? + __p9k_new_pipestatus=($pipestatus) + + trap ":" INT + + [[ -o ksh_arrays ]] && __p9k_ksh_arrays=1 || __p9k_ksh_arrays=0 + [[ -o sh_glob ]] && __p9k_sh_glob=1 || __p9k_sh_glob=0 + _p9k_restore_special_params + + _p9k_precmd_impl + + [[ ${+__p9k_instant_prompt_active} == 0 || -o no_prompt_cr ]] || __p9k_instant_prompt_active=2 + setopt no_local_options no_prompt_bang prompt_percent prompt_subst prompt_cr prompt_sp + + # See https://www.zsh.org/mla/workers/2020/msg00612.html for the reason behind __p9k_trapint. + typeset -g __p9k_trapint='_p9k_trapint; return 130' + trap "$__p9k_trapint" INT + + : ${(%):-%b%k%s%u} +} + +function _p9k_reset_prompt() { + if (( __p9k_reset_state != 1 )) && zle && [[ -z $_p9k__line_finished ]]; then + __p9k_reset_state=0 + setopt prompt_subst + (( __p9k_ksh_arrays )) && setopt ksh_arrays + (( __p9k_sh_glob )) && setopt sh_glob + { + (( _p9k__can_hide_cursor )) && echoti civis + zle .reset-prompt + (( ${+functions[z4h]} )) || zle -R + } always { + (( _p9k__can_hide_cursor )) && print -rn -- $_p9k__cnorm + _p9k__cursor_hidden=0 + } + fi +} + +# Does ZSH have a certain off-by-one bug that triggers when PROMPT overflows to a new line? +# +# Bug: https://github.com/zsh-users/zsh/commit/d8d9fee137a5aa2cf9bf8314b06895bfc2a05518. +# ZSH_PATCHLEVEL=zsh-5.4.2-159-gd8d9fee13. Released in 5.5. +# +# Fix: https://github.com/zsh-users/zsh/commit/64d13738357c9b9c212adbe17f271716abbcf6ea. +# ZSH_PATCHLEVEL=zsh-5.7.1-50-g64d137383. Released in 5.7.2. +# +# Test: PROMPT="${(pl:$((COLUMNS))::-:)}<%1(l.%2(l.FAIL.PASS).FAIL)> " zsh -dfis <<= 50 )) + [[ $ZSH_VERSION == 5.<5-7>* && $ZSH_VERSION != 5.7.<2->* ]] +} + +typeset -g _p9k__param_pat +typeset -g _p9k__param_sig + +_p9k_init_vars() { + typeset -gF _p9k__gcloud_last_fetch_ts + typeset -g _p9k_gcloud_configuration + typeset -g _p9k_gcloud_account + typeset -g _p9k_gcloud_project_id + typeset -g _p9k_gcloud_project_name + + typeset -gi _p9k_term_has_href + + typeset -gi _p9k_vcs_index + typeset -gi _p9k_vcs_line_index + typeset -g _p9k_vcs_side + + typeset -ga _p9k_taskwarrior_meta_files + typeset -ga _p9k_taskwarrior_meta_non_files + typeset -g _p9k_taskwarrior_meta_sig + typeset -g _p9k_taskwarrior_data_dir + typeset -g _p9k__taskwarrior_functional=1 + typeset -ga _p9k_taskwarrior_data_files + typeset -ga _p9k_taskwarrior_data_non_files + typeset -g _p9k_taskwarrior_data_sig + typeset -gA _p9k_taskwarrior_counters + typeset -gF _p9k_taskwarrior_next_due + + typeset -ga _p9k_asdf_meta_files + typeset -ga _p9k_asdf_meta_non_files + typeset -g _p9k_asdf_meta_sig + + # plugin => installed_version_pattern + # example: (ruby '2.7.0|2.6.3|system' lua 'system' chubaka '1.0.0|system') + typeset -gA _p9k_asdf_plugins + + # example: (.ruby-version "ruby 1 chubaka 0") + # + # - "1" means parse-legacy-file is present + # - "chubaka" is another plugin that claims to be able to parse .ruby-version + typeset -gA _p9k_asdf_file_info + + # dir => mtime ':' ${(pj:\0:)files} + typeset -gA _p9k__asdf_dir2files + + # :file => mtime ':' ${(pj:\0:)tool_versions} + # plugin:file => mtime ':' version + typeset -gA _p9k_asdf_file2versions + + # filepath => mtime ':' word + typeset -gA _p9k__read_word_cache + # filepath:prefix => mtime ':' versions + typeset -gA _p9k__read_pyenv_like_version_file_cache + + # _p9k__parent_dirs and _p9k__parent_mtimes are parallel arrays. They are updated + # together with _p9k__cwd. _p9k__parent_mtimes[i] is mtime for _p9k__parent_dirs[i]. + # + # When _p9k__cwd is / or ~, both arrays are empty. When _p9k__cwd is ~/foo/bar, + # _p9k__parent_dirs is (/home/user/foo/bar /home/user/foo). When _p9k__cwd is + # /foo/bar, it's (/foo/bar /foo). + # + # $_p9k__parent_mtimes_i[i] == "$i:$_p9k__parent_mtimes[i]" + # $_p9k__parent_mtimes_s == "$_p9k__parent_mtimes_i". + typeset -ga _p9k__parent_dirs + typeset -ga _p9k__parent_mtimes + typeset -ga _p9k__parent_mtimes_i + typeset -g _p9k__parent_mtimes_s + + typeset -g _p9k__cwd + typeset -g _p9k__cwd_a + + # dir/pattern => dir mtime ':' num_matches + typeset -gA _p9k__glob_cache + + # dir/pattern => space-separated parent dir mtimes ' :' the first matching parent dir + # Note: ' :' is indeed the delimiter. + typeset -gA _p9k__upsearch_cache + + typeset -g _p9k_timewarrior_dir + typeset -gi _p9k_timewarrior_dir_mtime + typeset -gi _p9k_timewarrior_file_mtime + typeset -g _p9k_timewarrior_file_name + typeset -gA _p9k__prompt_char_saved + typeset -g _p9k__worker_pid + typeset -g _p9k__worker_req_fd + typeset -g _p9k__worker_resp_fd + typeset -g _p9k__worker_shell_pid + typeset -g _p9k__worker_file_prefix + typeset -gA _p9k__worker_request_map + typeset -ga _p9k__segment_cond_left + typeset -ga _p9k__segment_cond_right + typeset -ga _p9k__segment_val_left + typeset -ga _p9k__segment_val_right + typeset -ga _p9k_show_on_command + typeset -g _p9k__last_buffer + typeset -ga _p9k__last_commands + typeset -gi _p9k__fully_initialized + typeset -gi _p9k__must_restore_prompt + typeset -gi _p9k__restore_prompt_fd + typeset -gi _p9k__redraw_fd + typeset -gi _p9k__can_hide_cursor=$(( $+terminfo[civis] && $+terminfo[cnorm] )) + if (( _p9k__can_hide_cursor )); then + # See https://github.com/romkatv/powerlevel10k/issues/1699 + if [[ $terminfo[cnorm] == *$'\e[?25h'(|'\e'*) ]]; then + typeset -g _p9k__cnorm=$'\e[?25h' + else + typeset -g _p9k__cnorm=$terminfo[cnorm] + fi + fi + typeset -gi _p9k__cursor_hidden + typeset -gi _p9k__non_hermetic_expansion + typeset -g _p9k__time + typeset -g _p9k__date + typeset -gA _p9k_dumped_instant_prompt_sigs + typeset -g _p9k__instant_prompt_sig + typeset -g _p9k__instant_prompt + typeset -gi _p9k__state_dump_scheduled + typeset -gi _p9k__state_dump_fd + typeset -gi _p9k__prompt_idx + typeset -gi _p9k_reset_on_line_finish + typeset -gF _p9k__timer_start + typeset -gi _p9k__status + typeset -ga _p9k__pipestatus + typeset -g _p9k__ret + typeset -g _p9k__cache_key + typeset -ga _p9k__cache_val + typeset -g _p9k__cache_stat_meta + typeset -g _p9k__cache_stat_fprint + typeset -g _p9k__cache_fprint_key + typeset -gA _p9k_cache + typeset -gA _p9k__cache_ephemeral + typeset -ga _p9k_t + typeset -g _p9k__n + typeset -gi _p9k__i + typeset -g _p9k__bg + typeset -ga _p9k_left_join + typeset -ga _p9k_right_join + typeset -g _p9k__public_ip + typeset -g _p9k__todo_command + typeset -g _p9k__todo_file + typeset -g _p9k__git_dir + # git workdir => 1 if gitstatus is slow on it, 0 if it's fast. + typeset -gA _p9k_git_slow + # git workdir => the last state we've seen for it + typeset -gA _p9k__gitstatus_last + typeset -gF _p9k__gitstatus_start_time + typeset -g _p9k__prompt + typeset -g _p9k__rprompt + typeset -g _p9k__lprompt + typeset -g _p9k__prompt_side + typeset -g _p9k__segment_name + typeset -gi _p9k__segment_index + typeset -gi _p9k__line_index + typeset -g _p9k__refresh_reason + typeset -gi _p9k__region_active + typeset -ga _p9k_line_segments_left + typeset -ga _p9k_line_segments_right + typeset -ga _p9k_line_prefix_left + typeset -ga _p9k_line_prefix_right + typeset -ga _p9k_line_suffix_left + typeset -ga _p9k_line_suffix_right + typeset -ga _p9k_line_never_empty_right + typeset -ga _p9k_line_gap_post + typeset -g _p9k__xy + typeset -g _p9k__clm + typeset -g _p9k__p + typeset -gi _p9k__x + typeset -gi _p9k__y + typeset -gi _p9k__m + typeset -gi _p9k__d + typeset -gi _p9k__h + typeset -gi _p9k__ind + typeset -g _p9k_gap_pre + typeset -gi _p9k__ruler_i=3 + typeset -gi _p9k_ruler_idx + typeset -gi _p9k__empty_line_i=3 + typeset -gi _p9k_empty_line_idx + typeset -g _p9k_prompt_prefix_left + typeset -g _p9k_prompt_prefix_right + typeset -g _p9k_prompt_suffix_left + typeset -g _p9k_prompt_suffix_right + typeset -gi _p9k_emulate_zero_rprompt_indent + typeset -gA _p9k_battery_states + typeset -g _p9k_os + typeset -g _p9k_os_icon + typeset -g _p9k_color1 + typeset -g _p9k_color2 + typeset -g _p9k__s + typeset -g _p9k__ss + typeset -g _p9k__sss + typeset -g _p9k__v + typeset -g _p9k__c + typeset -g _p9k__e + typeset -g _p9k__w + typeset -gi _p9k__dir_len + typeset -gi _p9k_num_cpus + typeset -g _p9k__keymap + typeset -g _p9k__zle_state + typeset -g _p9k_uname + typeset -g _p9k_uname_o + typeset -g _p9k_uname_m + typeset -g _p9k_transient_prompt + typeset -g _p9k__last_prompt_pwd + typeset -gA _p9k_display_k + typeset -ga _p9k__display_v + + typeset -gA _p9k__dotnet_stat_cache + typeset -gA _p9k__dir_stat_cache + typeset -gi _p9k__expanded + typeset -gi _p9k__force_must_init + + typeset -g P9K_VISUAL_IDENTIFIER + typeset -g P9K_CONTENT + typeset -g P9K_GAP + typeset -g P9K_PROMPT=regular +} + +_p9k_init_params() { + _p9k_declare -F POWERLEVEL9K_GCLOUD_REFRESH_PROJECT_NAME_SECONDS 60 + + # invarint: _POWERLEVEL9K_INSTANT_PROMPT == (verbose|quiet|off) + # invariant: [[ ($_POWERLEVEL9K_INSTANT_PROMPT == off) == $_POWERLEVEL9K_DISABLE_INSTANT_PROMPT ]] + _p9k_declare -s POWERLEVEL9K_INSTANT_PROMPT # verbose, quiet, off + if [[ $_POWERLEVEL9K_INSTANT_PROMPT == off ]]; then + typeset -gi _POWERLEVEL9K_DISABLE_INSTANT_PROMPT=1 + else + _p9k_declare -b POWERLEVEL9K_DISABLE_INSTANT_PROMPT 0 + if (( _POWERLEVEL9K_DISABLE_INSTANT_PROMPT )); then + _POWERLEVEL9K_INSTANT_PROMPT=off + elif [[ $_POWERLEVEL9K_INSTANT_PROMPT != quiet ]]; then + _POWERLEVEL9K_INSTANT_PROMPT=verbose + fi + fi + + (( _POWERLEVEL9K_DISABLE_INSTANT_PROMPT )) && _p9k__instant_prompt_disabled=1 + + _p9k_declare -s POWERLEVEL9K_TRANSIENT_PROMPT off + [[ $_POWERLEVEL9K_TRANSIENT_PROMPT == (off|always|same-dir) ]] || _POWERLEVEL9K_TRANSIENT_PROMPT=off + + _p9k_declare -b POWERLEVEL9K_TERM_SHELL_INTEGRATION 0 + if [[ __p9k_force_term_shell_integration -eq 1 || $ITERM_SHELL_INTEGRATION_INSTALLED == Yes ]]; then + _POWERLEVEL9K_TERM_SHELL_INTEGRATION=1 + fi + + _p9k_declare -s POWERLEVEL9K_WORKER_LOG_LEVEL + _p9k_declare -i POWERLEVEL9K_COMMANDS_MAX_TOKEN_COUNT 64 + _p9k_declare -a POWERLEVEL9K_HOOK_WIDGETS -- + _p9k_declare -b POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL 0 + _p9k_declare -b POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED 0 + _p9k_declare -b POWERLEVEL9K_DISABLE_HOT_RELOAD 0 + _p9k_declare -F POWERLEVEL9K_NEW_TTY_MAX_AGE_SECONDS 5 + _p9k_declare -i POWERLEVEL9K_INSTANT_PROMPT_COMMAND_LINES + _p9k_declare -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS -- context dir vcs + _p9k_declare -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS -- status root_indicator background_jobs history time + _p9k_declare -b POWERLEVEL9K_DISABLE_RPROMPT 0 + _p9k_declare -b POWERLEVEL9K_PROMPT_ADD_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_PROMPT_ON_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_RPROMPT_ON_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_SHOW_RULER 0 + _p9k_declare -i POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT 1 + _p9k_declare -s POWERLEVEL9K_COLOR_SCHEME dark + _p9k_declare -s POWERLEVEL9K_GITSTATUS_DIR "" + _p9k_declare -s POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN + _p9k_declare -b POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY 0 + _p9k_declare -i POWERLEVEL9K_VCS_SHORTEN_LENGTH + _p9k_declare -i POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH + _p9k_declare -s POWERLEVEL9K_VCS_SHORTEN_STRATEGY + if [[ $langinfo[CODESET] == (utf|UTF)(-|)8 ]]; then + _p9k_declare -e POWERLEVEL9K_VCS_SHORTEN_DELIMITER '\u2026' + else + _p9k_declare -e POWERLEVEL9K_VCS_SHORTEN_DELIMITER '..' + fi + _p9k_declare -b POWERLEVEL9K_VCS_CONFLICTED_STATE 0 + _p9k_declare -b POWERLEVEL9K_HIDE_BRANCH_ICON 0 + _p9k_declare -b POWERLEVEL9K_VCS_HIDE_TAGS 0 + _p9k_declare -a POWERLEVEL9K_VCS_GIT_REMOTE_ICONS + if (( $+_POWERLEVEL9K_VCS_GIT_REMOTE_ICONS )); then + (( $#_POWERLEVEL9K_VCS_GIT_REMOTE_ICONS & 1 )) && _POWERLEVEL9K_VCS_GIT_REMOTE_ICONS+=('') + else + local domain= icon= domain2icon=( + 'archlinux.org' VCS_GIT_ARCHLINUX_ICON + 'dev.azure.com|visualstudio.com' VCS_GIT_AZURE_ICON + 'bitbucket.org' VCS_GIT_BITBUCKET_ICON + 'codeberg.org' VCS_GIT_CODEBERG_ICON + 'debian.org' VCS_GIT_DEBIAN_ICON + 'freebsd.org' VCS_GIT_FREEBSD_ICON + 'freedesktop.org' VCS_GIT_FREEDESKTOP_ICON + 'gitea.com|gitea.io' VCS_GIT_GITEA_ICON + 'github.com' VCS_GIT_GITHUB_ICON + 'gitlab.com' VCS_GIT_GITLAB_ICON + 'gnome.org' VCS_GIT_GNOME_ICON + 'gnu.org' VCS_GIT_GNU_ICON + 'kde.org' VCS_GIT_KDE_ICON + 'kernel.org' VCS_GIT_LINUX_ICON + 'sr.ht' VCS_GIT_SOURCEHUT_ICON + ) + typeset -ga _POWERLEVEL9K_VCS_GIT_REMOTE_ICONS + for domain icon in "${domain2icon[@]}"; do + _POWERLEVEL9K_VCS_GIT_REMOTE_ICONS+=( + '(|[A-Za-z0-9][A-Za-z0-9+.-]#://)(|[^:/?#]#[.@])((#i)'$domain')(|[/:?#]*)' + $icon + ) + done + _POWERLEVEL9K_VCS_GIT_REMOTE_ICONS+=('*' VCS_GIT_ICON) + fi + _p9k_declare -i POWERLEVEL9K_CHANGESET_HASH_LENGTH 8 + # Specifies the maximum number of elements in the cache. When the cache grows over this limit, + # it gets cleared. This is meant to avoid memory leaks when a rogue prompt is filling the cache + # with data. + _p9k_declare -i POWERLEVEL9K_MAX_CACHE_SIZE 10000 + _p9k_declare -e POWERLEVEL9K_ANACONDA_LEFT_DELIMITER "(" + _p9k_declare -e POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER ")" + _p9k_declare -b POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION 1 + _p9k_declare -b POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE 1 + _p9k_declare -b POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS 0 + _p9k_declare -b POWERLEVEL9K_DISK_USAGE_ONLY_WARNING 0 + _p9k_declare -i POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL 90 + _p9k_declare -i POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL 95 + _p9k_declare -i POWERLEVEL9K_BATTERY_LOW_THRESHOLD 10 + _p9k_declare -i POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD 999 + _p9k_declare -b POWERLEVEL9K_BATTERY_VERBOSE 1 + _p9k_declare -a POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND -- + _p9k_declare -a POWERLEVEL9K_BATTERY_LEVEL_FOREGROUND -- + case $parameters[POWERLEVEL9K_BATTERY_STAGES] in + scalar*) typeset -ga _POWERLEVEL9K_BATTERY_STAGES=("${(@s::)${(g::)POWERLEVEL9K_BATTERY_STAGES}}");; + array*) typeset -ga _POWERLEVEL9K_BATTERY_STAGES=("${(@g::)POWERLEVEL9K_BATTERY_STAGES}");; + *) typeset -ga _POWERLEVEL9K_BATTERY_STAGES=();; + esac + local state + for state in CHARGED CHARGING LOW DISCONNECTED; do + _p9k_declare -i POWERLEVEL9K_BATTERY_${state}_HIDE_ABOVE_THRESHOLD $_POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD + local var=POWERLEVEL9K_BATTERY_${state}_STAGES + case $parameters[$var] in + scalar*) eval "typeset -ga _$var=(${(@qq)${(@s::)${(g::)${(P)var}}}})";; + array*) eval "typeset -ga _$var=(${(@qq)${(@g::)${(@P)var}}})";; + *) eval "typeset -ga _$var=(${(@qq)_POWERLEVEL9K_BATTERY_STAGES})";; + esac + local var=POWERLEVEL9K_BATTERY_${state}_LEVEL_BACKGROUND + case $parameters[$var] in + array*) eval "typeset -ga _$var=(${(@qq)${(@P)var}})";; + *) eval "typeset -ga _$var=(${(@qq)_POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND})";; + esac + local var=POWERLEVEL9K_BATTERY_${state}_LEVEL_FOREGROUND + case $parameters[$var] in + array*) eval "typeset -ga _$var=(${(@qq)${(@P)var}})";; + *) eval "typeset -ga _$var=(${(@qq)_POWERLEVEL9K_BATTERY_LEVEL_FOREGROUND})";; + esac + done + _p9k_declare -F POWERLEVEL9K_PUBLIC_IP_TIMEOUT 300 + _p9k_declare -a POWERLEVEL9K_PUBLIC_IP_METHODS -- dig curl wget + _p9k_declare -e POWERLEVEL9K_PUBLIC_IP_NONE "" + _p9k_declare -s POWERLEVEL9K_PUBLIC_IP_HOST "https://v4.ident.me/" + _p9k_declare -s POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE "" + _p9k_segment_in_use public_ip || _POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE= + _p9k_declare -b POWERLEVEL9K_ALWAYS_SHOW_CONTEXT 0 + _p9k_declare -b POWERLEVEL9K_ALWAYS_SHOW_USER 0 + _p9k_declare -e POWERLEVEL9K_CONTEXT_TEMPLATE "%n@%m" + _p9k_declare -e POWERLEVEL9K_USER_TEMPLATE "%n" + _p9k_declare -e POWERLEVEL9K_HOST_TEMPLATE "%m" + _p9k_declare -F POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3 + _p9k_declare -i POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION 2 + # Other options: "d h m s". + _p9k_declare -s POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT "H:M:S" + _p9k_declare -e POWERLEVEL9K_HOME_FOLDER_ABBREVIATION "~" + _p9k_declare -b POWERLEVEL9K_DIR_PATH_ABSOLUTE 0 + _p9k_declare -s POWERLEVEL9K_DIR_SHOW_WRITABLE '' + case $_POWERLEVEL9K_DIR_SHOW_WRITABLE in + true) _POWERLEVEL9K_DIR_SHOW_WRITABLE=1;; + v2) _POWERLEVEL9K_DIR_SHOW_WRITABLE=2;; + v3) _POWERLEVEL9K_DIR_SHOW_WRITABLE=3;; + *) _POWERLEVEL9K_DIR_SHOW_WRITABLE=0;; + esac + typeset -gi _POWERLEVEL9K_DIR_SHOW_WRITABLE + _p9k_declare -b POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER 0 + _p9k_declare -b POWERLEVEL9K_DIR_HYPERLINK 0 + _p9k_declare -s POWERLEVEL9K_SHORTEN_STRATEGY "" + local markers=( + .bzr + .citc + .git + .hg + .node-version + .python-version + .ruby-version + .shorten_folder_marker + .svn + .terraform + CVS + Cargo.toml + composer.json + go.mod + package.json + ) + _p9k_declare -s POWERLEVEL9K_SHORTEN_FOLDER_MARKER "(${(j:|:)markers})" + # 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. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -s POWERLEVEL9K_DIR_MAX_LENGTH 0 + # Individual elements are patterns. They are expanded with the options set + # by `emulate zsh && setopt extended_glob`. + _p9k_declare -a POWERLEVEL9K_DIR_PACKAGE_FILES -- package.json composer.json + # When dir is on the last prompt line, try to shorten it enough to leave at least this many + # columns for typing commands. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -i POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS 40 + # When dir 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. Applies + # only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -F POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT 50 + # POWERLEVEL9K_DIR_CLASSES allow you to specify custom styling and icons for different + # directories. + # + # POWERLEVEL9K_DIR_CLASSES must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. Icon. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. If there are no + # matches, there will be no icon and the styling is done according to POWERLEVEL9K_DIR_BACKGROUND, + # POWERLEVEL9K_DIR_FOREGROUND, etc. + # + # Example: + # + # POWERLEVEL9K_DIR_CLASSES=( + # '~/work(/*)#' WORK '(โ•ฏยฐโ–กยฐ๏ผ‰โ•ฏ๏ธต โ”ปโ”โ”ป' + # '~(/*)#' HOME 'โŒ‚' + # '*' DEFAULT '') + # + # POWERLEVEL9K_DIR_WORK_BACKGROUND=red + # POWERLEVEL9K_DIR_HOME_BACKGROUND=blue + # POWERLEVEL9K_DIR_DEFAULT_BACKGROUND=yellow + # + # With these settings, the current directory in the prompt may look like this: + # + # (โ•ฏยฐโ–กยฐ๏ผ‰โ•ฏ๏ธต โ”ปโ”โ”ป ~/work/projects/important/urgent + # + # โŒ‚ ~/best/powerlevel10k + _p9k_declare -a POWERLEVEL9K_DIR_CLASSES + _p9k_declare -i POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH + _p9k_declare -e POWERLEVEL9K_SHORTEN_DELIMITER + _p9k_declare -s POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER '' + case $_POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER in + first|last) _POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER+=:0;; + (first|last):(|-)<->);; + *) _POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER=;; + esac + [[ -z $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER ]] && _POWERLEVEL9K_DIR_TRUNCATE_BEFORE_MARKER= + _p9k_declare -i POWERLEVEL9K_SHORTEN_DIR_LENGTH + _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "" + : ${_POWERLEVEL9K_IP_INTERFACE:='.*'} + _p9k_segment_in_use ip || _POWERLEVEL9K_IP_INTERFACE= + _p9k_declare -s POWERLEVEL9K_VPN_IP_INTERFACE "(gpd|wg|(.*tun)|tailscale)[0-9]*|(zt.*)" + : ${_POWERLEVEL9K_VPN_IP_INTERFACE:='.*'} + _p9k_segment_in_use vpn_ip || _POWERLEVEL9K_VPN_IP_INTERFACE= + _p9k_declare -b POWERLEVEL9K_VPN_IP_SHOW_ALL 0 + _p9k_declare -i POWERLEVEL9K_LOAD_WHICH 5 + case $_POWERLEVEL9K_LOAD_WHICH in + 1) _POWERLEVEL9K_LOAD_WHICH=1;; + 15) _POWERLEVEL9K_LOAD_WHICH=3;; + *) _POWERLEVEL9K_LOAD_WHICH=2;; + esac + _p9k_declare -F POWERLEVEL9K_LOAD_WARNING_PCT 50 + _p9k_declare -F POWERLEVEL9K_LOAD_CRITICAL_PCT 70 + _p9k_declare -b POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY 0 + _p9k_declare -b POWERLEVEL9K_PHP_VERSION_PROJECT_ONLY 0 + _p9k_declare -b POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY 1 + _p9k_declare -b POWERLEVEL9K_GO_VERSION_PROJECT_ONLY 1 + _p9k_declare -b POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY 1 + _p9k_declare -b POWERLEVEL9K_PERLBREW_PROJECT_ONLY 1 + _p9k_declare -b POWERLEVEL9K_PERLBREW_SHOW_PREFIX 0 + _p9k_declare -b POWERLEVEL9K_JAVA_VERSION_PROJECT_ONLY 0 + _p9k_declare -b POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_NODENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_NODENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_NVM_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_NVM_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_RBENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_RBENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_SCALAENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_SCALAENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_SCALAENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_PHPENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_PHPENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_PHPENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_LUAENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_LUAENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_JENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_JENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_PLENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_PLENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_PYENV_SHOW_SYSTEM 1 + _p9k_declare -a POWERLEVEL9K_PYENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -a POWERLEVEL9K_GOENV_SOURCES -- shell local global + _p9k_declare -b POWERLEVEL9K_GOENV_SHOW_SYSTEM 1 + _p9k_declare -b POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_ASDF_SHOW_SYSTEM 1 + _p9k_declare -a POWERLEVEL9K_ASDF_SOURCES -- shell local global + local var + for var in ${parameters[(I)POWERLEVEL9K_ASDF_*_PROMPT_ALWAYS_SHOW]}; do + _p9k_declare -b $var $_POWERLEVEL9K_ASDF_PROMPT_ALWAYS_SHOW + done + for var in ${parameters[(I)POWERLEVEL9K_ASDF_*_SHOW_SYSTEM]}; do + _p9k_declare -b $var $_POWERLEVEL9K_ASDF_SHOW_SYSTEM + done + for var in ${parameters[(I)POWERLEVEL9K_ASDF_*_SOURCES]}; do + _p9k_declare -a $var -- $_POWERLEVEL9K_ASDF_SOURCES + done + _p9k_declare -b POWERLEVEL9K_HASKELL_STACK_PROMPT_ALWAYS_SHOW 1 + _p9k_declare -a POWERLEVEL9K_HASKELL_STACK_SOURCES -- shell local + _p9k_declare -b POWERLEVEL9K_RVM_SHOW_GEMSET 0 + _p9k_declare -b POWERLEVEL9K_RVM_SHOW_PREFIX 0 + _p9k_declare -b POWERLEVEL9K_CHRUBY_SHOW_VERSION 1 + _p9k_declare -b POWERLEVEL9K_CHRUBY_SHOW_ENGINE 1 + _p9k_declare -s POWERLEVEL9K_CHRUBY_SHOW_ENGINE_PATTERN + if (( _POWERLEVEL9K_CHRUBY_SHOW_ENGINE )); then + : ${_POWERLEVEL9K_CHRUBY_SHOW_ENGINE_PATTERN=*} + fi + _p9k_declare -b POWERLEVEL9K_STATUS_CROSS 0 + _p9k_declare -b POWERLEVEL9K_STATUS_OK 1 + _p9k_declare -b POWERLEVEL9K_STATUS_OK_PIPE 1 + _p9k_declare -b POWERLEVEL9K_STATUS_ERROR 1 + _p9k_declare -b POWERLEVEL9K_STATUS_ERROR_PIPE 1 + _p9k_declare -b POWERLEVEL9K_STATUS_ERROR_SIGNAL 1 + _p9k_declare -b POWERLEVEL9K_STATUS_SHOW_PIPESTATUS 1 + _p9k_declare -b POWERLEVEL9K_STATUS_HIDE_SIGNAME 0 + _p9k_declare -b POWERLEVEL9K_STATUS_VERBOSE_SIGNAME 1 + _p9k_declare -b POWERLEVEL9K_STATUS_EXTENDED_STATES 0 + _p9k_declare -b POWERLEVEL9K_STATUS_VERBOSE 1 + _p9k_declare -b POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE 0 + _p9k_declare -e POWERLEVEL9K_DATE_FORMAT "%D{%d.%m.%y}" + _p9k_declare -s POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND 1 + _p9k_declare -b POWERLEVEL9K_SHOW_CHANGESET 0 + _p9k_declare -e POWERLEVEL9K_VCS_LOADING_TEXT loading + _p9k_declare -a POWERLEVEL9K_VCS_GIT_HOOKS -- vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname + _p9k_declare -a POWERLEVEL9K_VCS_HG_HOOKS -- vcs-detect-changes + _p9k_declare -a POWERLEVEL9K_VCS_SVN_HOOKS -- vcs-detect-changes svn-detect-changes + # If it takes longer than this to fetch git repo status, display the prompt with a greyed out + # vcs segment and fix it asynchronously when the results come it. + _p9k_declare -F POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS 0.01 + (( POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS >= 0 )) || (( POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS = 0 )) + _p9k_declare -a POWERLEVEL9K_VCS_BACKENDS -- git + (( $+commands[git] )) || _POWERLEVEL9K_VCS_BACKENDS=(${_POWERLEVEL9K_VCS_BACKENDS:#git}) + _p9k_declare -b POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING 0 + _p9k_declare -i POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY -1 + _p9k_declare -i POWERLEVEL9K_VCS_STAGED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_CONFLICTED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM -1 + _p9k_declare -i POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM -1 + _p9k_declare -b POWERLEVEL9K_VCS_RECURSE_UNTRACKED_DIRS 0 + _p9k_declare -F POWERLEVEL9K_GITSTATUS_INIT_TIMEOUT_SEC 10 + _p9k_declare -b POWERLEVEL9K_DISABLE_GITSTATUS 0 + _p9k_declare -e POWERLEVEL9K_VI_INSERT_MODE_STRING "INSERT" + _p9k_declare -e POWERLEVEL9K_VI_COMMAND_MODE_STRING "NORMAL" + # VISUAL mode is shown as NORMAL unless POWERLEVEL9K_VI_VISUAL_MODE_STRING is explicitly set. + _p9k_declare -e POWERLEVEL9K_VI_VISUAL_MODE_STRING + # OVERWRITE mode is shown as INSERT unless POWERLEVEL9K_VI_OVERWRITE_MODE_STRING is explicitly set. + _p9k_declare -e POWERLEVEL9K_VI_OVERWRITE_MODE_STRING + _p9k_declare -s POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV true + _p9k_declare -b POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION 1 + _p9k_declare -e POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER "(" + _p9k_declare -e POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER ")" + _p9k_declare -a POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES -- virtualenv venv .venv env + _POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES="${(j.|.)_POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES}" + _p9k_declare -b POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION 1 + _p9k_declare -e POWERLEVEL9K_NODEENV_LEFT_DELIMITER "[" + _p9k_declare -e POWERLEVEL9K_NODEENV_RIGHT_DELIMITER "]" + _p9k_declare -b POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE 1 + _p9k_declare -a POWERLEVEL9K_KUBECONTEXT_SHORTEN -- + # Defines context classes for the purpose of applying different styling to different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES must be an array with even number of elements. The first + # element in each pair defines a pattern against which the current context (in the format it is + # displayed in the prompt) gets matched. The second element defines context class. Patterns are + # tried in order. The first match wins. + # + # If a non-empty class is assigned to a context, the segment is styled with + # POWERLEVEL9K_KUBECONTEXT__BACKGROUND and POWERLEVEL9K_KUBECONTEXT__FOREGROUND where is + # uppercased . Otherwise with POWERLEVEL9K_KUBECONTEXT_BACKGROUND and + # POWERLEVEL9K_KUBECONTEXT_FOREGROUND. + # + # Example: Use red background for contexts containing "prod", green for "testing" and yellow for + # everything else. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' prod + # '*testing*' testing + # '*' other) + # + # POWERLEVEL9K_KUBECONTEXT_PROD_BACKGROUND=red + # POWERLEVEL9K_KUBECONTEXT_TESTING_BACKGROUND=green + # POWERLEVEL9K_KUBECONTEXT_OTHER_BACKGROUND=yellow + _p9k_declare -a POWERLEVEL9K_KUBECONTEXT_CLASSES -- + _p9k_declare -a POWERLEVEL9K_AWS_CLASSES -- + _p9k_declare -a POWERLEVEL9K_AZURE_CLASSES -- + _p9k_declare -a POWERLEVEL9K_TERRAFORM_CLASSES -- + _p9k_declare -b POWERLEVEL9K_TERRAFORM_SHOW_DEFAULT 0 + _p9k_declare -a POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES -- 'service_account:*' SERVICE_ACCOUNT + # Specifies the format of java version. + # + # POWERLEVEL9K_JAVA_VERSION_FULL=true => 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03 + # POWERLEVEL9K_JAVA_VERSION_FULL=false => 1.8.0_212 + # + # These correspond to `java -fullversion` and `java -version` respectively. + _p9k_declare -b POWERLEVEL9K_JAVA_VERSION_FULL 1 + _p9k_declare -b POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE 0 + + # Format for the current time: 09:51:02. See `man 3 strftime`. + _p9k_declare -e 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. + _p9k_declare -b POWERLEVEL9K_TIME_UPDATE_ON_COMMAND 0 + # If set to true, time will update every second. + _p9k_declare -b POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME 0 + + _p9k_declare -b POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH 0 + typeset -g _p9k_nix_shell_cond='${IN_NIX_SHELL:#0}' + if (( _POWERLEVEL9K_NIX_SHELL_INFER_FROM_PATH )); then + _p9k_nix_shell_cond+='${path[(r)/nix/store/*]}' + fi + + local -i i=1 + while (( i <= $#_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS )); do + local segment=${${(U)_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[i]}//ฤฐ/I} + local var=POWERLEVEL9K_${segment}_LEFT_DISABLED + (( $+parameters[$var] )) || var=POWERLEVEL9K_${segment}_DISABLED + if [[ ${(P)var} == true ]]; then + _POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[i,i]=() + else + (( ++i )) + fi + done + + local -i i=1 + while (( i <= $#_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS )); do + local segment=${${(U)_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[i]}//ฤฐ/I} + local var=POWERLEVEL9K_${segment}_RIGHT_DISABLED + (( $+parameters[$var] )) || var=POWERLEVEL9K_${segment}_DISABLED + if [[ ${(P)var} == true ]]; then + _POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[i,i]=() + else + (( ++i )) + fi + done + + local var + for var in ${(@)${parameters[(I)POWERLEVEL9K_*]}/(#m)*/${(M)${parameters[_$MATCH]-$MATCH}:#$MATCH}}; do + case $parameters[$var] in + (scalar|integer|float)*) typeset -g _$var=${(P)var};; + array*) eval 'typeset -ga '_$var'=("${'$var'[@]}")';; + esac + done +} + +function _p9k_on_widget_zle-keymap-select() { _p9k_check_visual_mode; __p9k_reset_state=2; } +function _p9k_on_widget_overwrite-mode() { _p9k_check_visual_mode; __p9k_reset_state=2; } +function _p9k_on_widget_vi-replace() { _p9k_check_visual_mode; __p9k_reset_state=2; } + +if [[ $ZSH_VERSION == (5.<3->*|<6->.*) ]]; then + function _p9k_check_visual_mode() { + [[ ${KEYMAP:-} == vicmd ]] || return 0 + local region=${${REGION_ACTIVE:-0}/2/1} + [[ $region != $_p9k__region_active ]] || return 0 + _p9k__region_active=$region + __p9k_reset_state=2 + } +else + function _p9k_check_visual_mode() {} +fi + +function _p9k_on_widget_visual-mode() { _p9k_check_visual_mode; } +function _p9k_on_widget_visual-line-mode() { _p9k_check_visual_mode; } +function _p9k_on_widget_deactivate-region() { _p9k_check_visual_mode; } + +function _p9k_on_widget_zle-line-init() { + (( _p9k__cursor_hidden )) || return 0 + _p9k__cursor_hidden=0 + print -rn -- $_p9k__cnorm +} + +function _p9k_on_widget_zle-line-finish() { + (( $+_p9k__line_finished )) && return + + local P9K_PROMPT=transient + + _p9k__line_finished= + (( _p9k_reset_on_line_finish )) && __p9k_reset_state=2 + (( $+functions[p10k-on-post-prompt] )) && p10k-on-post-prompt + + local -i optimized + + if [[ -n $_p9k_transient_prompt ]]; then + if [[ $_POWERLEVEL9K_TRANSIENT_PROMPT == always || $_p9k__cwd == $_p9k__last_prompt_pwd ]]; then + optimized=1 + __p9k_reset_state=2 + else + _p9k__last_prompt_pwd=$_p9k__cwd + fi + fi + + if [[ $1 == int ]]; then + _p9k__must_restore_prompt=1 + if (( !_p9k__restore_prompt_fd )); then + sysopen -o cloexec -ru _p9k__restore_prompt_fd /dev/null + zle -F $_p9k__restore_prompt_fd _p9k_restore_prompt + fi + fi + + if (( __p9k_reset_state == 2 )); then + if (( optimized )); then + RPROMPT= PROMPT=$_p9k_transient_prompt _p9k_reset_prompt + else + _p9k_reset_prompt + fi + fi + + _p9k__line_finished='%{%}' +} + +function _p9k_on_widget_send-break() { + _p9k_on_widget_zle-line-finish int +} + +# Usage example: _p9k_display_segment 58 _p9k__1rkubecontext hide +function _p9k_display_segment() { + [[ $_p9k__display_v[$1] == $3 ]] && return + _p9k__display_v[$1]=$3 + [[ $3 == hide ]] && typeset -g $2= || unset $2 + __p9k_reset_state=2 +} + +function _p9k_redraw() { + zle -F $1 + exec {1}>&- + _p9k__redraw_fd=0 + + () { + local -h WIDGET=zle-line-pre-redraw + _p9k_widget_hook '' + } +} + +function _p9k_deschedule_redraw() { + (( _p9k__redraw_fd )) || return + zle -F $_p9k__redraw_fd + exec {_p9k__redraw_fd}>&- + _p9k__redraw_fd=0 +} + +function _p9k_widget_hook() { + _p9k_deschedule_redraw + + if (( ${+functions[p10k-on-post-widget]} || ${#_p9k_show_on_command} )); then + local -a P9K_COMMANDS + if [[ "$_p9k__last_buffer" == "$PREBUFFER$BUFFER" ]]; then + P9K_COMMANDS=(${_p9k__last_commands[@]}) + else + _p9k__last_buffer="$PREBUFFER$BUFFER" + if [[ -n "$_p9k__last_buffer" ]]; then + # this must run with user options + _p9k_parse_buffer "$_p9k__last_buffer" $_POWERLEVEL9K_COMMANDS_MAX_TOKEN_COUNT + fi + _p9k__last_commands=(${P9K_COMMANDS[@]}) + fi + fi + + eval "$__p9k_intro" + (( _p9k__restore_prompt_fd )) && _p9k_restore_prompt $_p9k__restore_prompt_fd + if [[ $1 == (clear-screen|z4h-clear-screen-*-top) ]]; then + P9K_TTY=new + _p9k__expanded=0 + _p9k_reset_prompt + fi + __p9k_reset_state=1 + _p9k_check_visual_mode + local pat idx var + for pat idx var in $_p9k_show_on_command; do + if (( $P9K_COMMANDS[(I)$pat] )); then + _p9k_display_segment $idx $var show + else + _p9k_display_segment $idx $var hide + fi + done + (( $+functions[p10k-on-post-widget] )) && p10k-on-post-widget "${@:2}" + (( $+functions[_p9k_on_widget_$1] )) && _p9k_on_widget_$1 + (( __p9k_reset_state == 2 )) && _p9k_reset_prompt + __p9k_reset_state=0 +} + +function _p9k_widget() { + local f=${widgets[._p9k_orig_$1]:-} + local -i res + [[ -z $f ]] || { + [[ $f == user:-z4h-* ]] && { + "${f#user:}" "${@:2}" + res=$? + } || { + zle ._p9k_orig_$1 -- "${@:2}" + res=$? + } + } + (( ! __p9k_enabled )) || [[ $CONTEXT != start ]] || _p9k_widget_hook "$@" + return res +} + +function _p9k_widget_zle-line-pre-redraw-impl() { + (( __p9k_enabled )) && [[ $CONTEXT == start ]] || return 0 + ! (( ${+functions[p10k-on-post-widget]} || ${#_p9k_show_on_command} || _p9k__restore_prompt_fd || _p9k__redraw_fd )) && + [[ ${KEYMAP:-} != vicmd ]] && + return + (( PENDING || KEYS_QUEUED_COUNT )) && { + (( _p9k__redraw_fd )) || { + sysopen -o cloexec -ru _p9k__redraw_fd /dev/null + zle -F $_p9k__redraw_fd _p9k_redraw + } + return + } + _p9k_widget_hook zle-line-pre-redraw +} + +function _p9k_widget_send-break() { + (( ! __p9k_enabled )) || [[ $CONTEXT != start ]] || { + _p9k_widget_hook send-break "$@" + } + local f=${widgets[._p9k_orig_send-break]:-} + [[ -z $f ]] || zle ._p9k_orig_send-break -- "$@" +} + +typeset -gi __p9k_widgets_wrapped=0 + +function _p9k_wrap_widgets() { + (( __p9k_widgets_wrapped )) && return + + typeset -gir __p9k_widgets_wrapped=1 + local -a widget_list + if [[ $ZSH_VERSION == (5.<3->*|<6->.*) ]]; then + local -aU widget_list=( + zle-line-pre-redraw + zle-line-init + zle-line-finish + zle-keymap-select + overwrite-mode + vi-replace + visual-mode + visual-line-mode + deactivate-region + clear-screen + z4h-clear-screen-soft-top + z4h-clear-screen-hard-top + send-break + $_POWERLEVEL9K_HOOK_WIDGETS + ) + else + # There is no zle-line-pre-redraw in zsh < 5.3, so we have to wrap all widgets + # with key bindings. This costs extra 3ms: 1.5ms to fetch the list of widgets and + # another 1.5ms to wrap them. + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + else + local tmpdir=/tmp + fi + local keymap tmp=$tmpdir/p10k.bindings.$sysparams[pid] + { + for keymap in $keymaps; do bindkey -M $keymap; done >$tmp + local -aU widget_list=( + zle-isearch-exit + zle-isearch-update + zle-line-init + zle-line-finish + zle-history-line-set + zle-keymap-select + send-break + $_POWERLEVEL9K_HOOK_WIDGETS + ${${${(f)"$(<$tmp)"}##* }:#(*\"|.*)} + ) + } always { + zf_rm -f -- $tmp + } + fi + + local widget + for widget in $widget_list; do + if (( ! $+functions[_p9k_widget_$widget] )); then + functions[_p9k_widget_$widget]='_p9k_widget '${(q)widget}' "$@"' + fi + if [[ $widget == zle-* && + $widgets[$widget] == user:azhw:* && + $functions[add-zle-hook-widget] ]]; then + add-zle-hook-widget $widget _p9k_widget_$widget + else + # The leading dot is to work around bugs in zsh-syntax-highlighting. + zle -A $widget ._p9k_orig_$widget + zle -N $widget _p9k_widget_$widget + fi + done 2>/dev/null # `zle -A` fails for inexisting widgets and complains to stderr + + case ${widgets[._p9k_orig_zle-line-pre-redraw]:-} in + user:-z4h-zle-line-pre-redraw) + function _p9k_widget_zle-line-pre-redraw() { + -z4h-zle-line-pre-redraw "$@" + _p9k_widget_zle-line-pre-redraw-impl + } + ;; + ?*) + function _p9k_widget_zle-line-pre-redraw() { + zle ._p9k_orig_zle-line-pre-redraw -- "$@" + local -i res=$? + _p9k_widget_zle-line-pre-redraw-impl + return res + } + ;; + '') + function _p9k_widget_zle-line-pre-redraw() { + _p9k_widget_zle-line-pre-redraw-impl + } + ;; + esac +} + +function _p9k_restore_prompt() { + eval "$__p9k_intro" + zle -F $1 + exec {1}>&- + _p9k__restore_prompt_fd=0 + + (( _p9k__must_restore_prompt )) || return 0 + _p9k__must_restore_prompt=0 + + unset _p9k__line_finished + _p9k__refresh_reason=restore + _p9k_set_prompt + _p9k__refresh_reason= + + _p9k__expanded=0 + _p9k_reset_prompt +} + +prompt__p9k_internal_nothing() { _p9k__prompt+='${_p9k__sss::=}'; } +instant_prompt__p9k_internal_nothing() { prompt__p9k_internal_nothing; } + +# _p9k_build_gap_post line_number +_p9k_build_gap_post() { + if [[ $1 == 1 ]]; then + local kind_l=first kind_u=FIRST + else + local kind_l=newline kind_u=NEWLINE + fi + _p9k_get_icon '' MULTILINE_${kind_u}_PROMPT_GAP_CHAR + local char=${_p9k__ret:- } + _p9k_prompt_length $char + if (( _p9k__ret != 1 || $#char != 1 )); then + >&2 print -rP -- "%F{red}WARNING!%f %BMULTILINE_${kind_u}_PROMPT_GAP_CHAR%b is not one character long. Will use ' '." + >&2 print -rP -- "Either change the value of %BPOWERLEVEL9K_MULTILINE_${kind_u}_PROMPT_GAP_CHAR%b or remove it." + char=' ' + fi + local style + _p9k_color prompt_multiline_${kind_l}_prompt_gap BACKGROUND "" + [[ -n $_p9k__ret ]] && _p9k_background $_p9k__ret + style+=$_p9k__ret + _p9k_color prompt_multiline_${kind_l}_prompt_gap FOREGROUND "" + [[ -n $_p9k__ret ]] && _p9k_foreground $_p9k__ret + style+=$_p9k__ret + _p9k_escape_style $style + style=$_p9k__ret + local exp=_POWERLEVEL9K_MULTILINE_${kind_u}_PROMPT_GAP_EXPANSION + (( $+parameters[$exp] )) && exp=${(P)exp} || exp='${P9K_GAP}' + [[ $char == '.' ]] && local s=',' || local s='.' + _p9k__ret=$'${${_p9k__g+\n}:-'$style'${${${_p9k__m:#-*}:+' + _p9k__ret+='${${_p9k__'$1'g+${(pl.$((_p9k__m+1)).. .)}}:-' + if [[ $exp == '${P9K_GAP}' ]]; then + _p9k__ret+='${(pl'$s'$((_p9k__m+1))'$s$s$char$s')}' + else + _p9k__ret+='${${P9K_GAP::=${(pl'$s'$((_p9k__m+1))'$s$s$char$s')}}+}' + _p9k__ret+='${:-"'$exp'"}' + style=1 + fi + _p9k__ret+='}' + if (( __p9k_ksh_arrays )); then + _p9k__ret+=$'$_p9k__rprompt${_p9k_t[$((!_p9k__ind))]}}:-\n}' + else + _p9k__ret+=$'$_p9k__rprompt${_p9k_t[$((1+!_p9k__ind))]}}:-\n}' + fi + [[ -n $style ]] && _p9k__ret+='%b%k%f' + _p9k__ret+='}' +} + +_p9k_init_lines() { + local -a left_segments=($_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS) + local -a right_segments=($_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS) + + if (( _POWERLEVEL9K_PROMPT_ON_NEWLINE )); then + left_segments+=(newline _p9k_internal_nothing) + fi + + local -i num_left_lines=$((1 + ${#${(@M)left_segments:#newline}})) + local -i num_right_lines=$((1 + ${#${(@M)right_segments:#newline}})) + if (( num_right_lines > num_left_lines )); then + repeat $((num_right_lines - num_left_lines)) left_segments=(newline $left_segments) + local -i num_lines=num_right_lines + else + if (( _POWERLEVEL9K_RPROMPT_ON_NEWLINE )); then + repeat $((num_left_lines - num_right_lines)) right_segments=(newline $right_segments) + else + repeat $((num_left_lines - num_right_lines)) right_segments+=newline + fi + local -i num_lines=num_left_lines + fi + + local -i i + for i in {1..$num_lines}; do + local -i left_end=${left_segments[(i)newline]} + local -i right_end=${right_segments[(i)newline]} + _p9k_line_segments_left+="${(pj:\0:)left_segments[1,left_end-1]}" + _p9k_line_segments_right+="${(pj:\0:)right_segments[1,right_end-1]}" + (( left_end > $#left_segments )) && left_segments=() || shift left_end left_segments + (( right_end > $#right_segments )) && right_segments=() || shift right_end right_segments + + _p9k_get_icon '' LEFT_SEGMENT_SEPARATOR + _p9k_get_icon 'prompt_empty_line' LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL $_p9k__ret + _p9k_escape $_p9k__ret + _p9k_line_prefix_left+='${_p9k__'$i'l-${${:-${_p9k__bg::=NONE}${_p9k__i::=0}${_p9k__sss::=%f'$_p9k__ret'}}+}' + _p9k_line_suffix_left+='%b%k$_p9k__sss%b%k%f' + + _p9k_escape ${(g::)_POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL} + [[ -n $_p9k__ret ]] && _p9k_line_never_empty_right+=1 || _p9k_line_never_empty_right+=0 + _p9k_line_prefix_right+='${_p9k__'$i'r-${${:-${_p9k__bg::=NONE}${_p9k__i::=0}${_p9k__sss::='$_p9k__ret'}}+}' + _p9k_line_suffix_right+='$_p9k__sss%b%k%f}' # gets overridden for _p9k_emulate_zero_rprompt_indent + if (( i == num_lines )); then + # it's safe to use _p9k_prompt_length on the last line because it cannot have prompt connection + _p9k_prompt_length ${(e)_p9k__ret} + (( _p9k__ret )) || _p9k_line_never_empty_right[-1]=0 + fi + done + + _p9k_get_icon '' LEFT_SEGMENT_END_SEPARATOR + if [[ -n $_p9k__ret ]]; then + _p9k__ret+=%b%k%f + # Not escaped for historical reasons. + _p9k__ret='${:-"'$_p9k__ret'"}' + if (( _POWERLEVEL9K_PROMPT_ON_NEWLINE )); then + _p9k_line_suffix_left[-2]+=$_p9k__ret + else + _p9k_line_suffix_left[-1]+=$_p9k__ret + fi + fi + + for i in {1..$num_lines}; do _p9k_line_suffix_left[i]+='}'; done + + if (( num_lines > 1 )); then + for i in {1..$((num_lines-1))}; do + _p9k_build_gap_post $i + _p9k_line_gap_post+=$_p9k__ret + done + + if [[ $+_POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then + _p9k_get_icon '' MULTILINE_FIRST_PROMPT_PREFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + # Not escaped for historical reasons. + _p9k__ret='${_p9k__1l_frame-"'$_p9k__ret'"}' + _p9k_line_prefix_left[1]=$_p9k__ret$_p9k_line_prefix_left[1] + fi + fi + + if [[ $+_POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then + _p9k_get_icon '' MULTILINE_LAST_PROMPT_PREFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + # Not escaped for historical reasons. + _p9k__ret='${_p9k__'$num_lines'l_frame-"'$_p9k__ret'"}' + _p9k_line_prefix_left[-1]=$_p9k__ret$_p9k_line_prefix_left[-1] + fi + fi + + _p9k_get_icon '' MULTILINE_FIRST_PROMPT_SUFFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + _p9k_line_suffix_right[1]+='${_p9k__1r_frame-'${(qqq)_p9k__ret}'}' + _p9k_line_never_empty_right[1]=1 + fi + + _p9k_get_icon '' MULTILINE_LAST_PROMPT_SUFFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + _p9k_line_suffix_right[-1]+='${_p9k__'$num_lines'r_frame-'${(qqq)_p9k__ret}'}' + # it's safe to use _p9k_prompt_length on the last line because it cannot have prompt connection + _p9k_prompt_length $_p9k__ret + (( _p9k__ret )) && _p9k_line_never_empty_right[-1]=1 + fi + + if (( num_lines > 2 )); then + if [[ $+_POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then + _p9k_get_icon '' MULTILINE_NEWLINE_PROMPT_PREFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + for i in {2..$((num_lines-1))}; do + # Not escaped for historical reasons. + _p9k_line_prefix_left[i]='${_p9k__'$i'l_frame-"'$_p9k__ret'"}'$_p9k_line_prefix_left[i] + done + fi + fi + + _p9k_get_icon '' MULTILINE_NEWLINE_PROMPT_SUFFIX + if [[ -n $_p9k__ret ]]; then + [[ _p9k__ret == *%* ]] && _p9k__ret+=%b%k%f + for i in {2..$((num_lines-1))}; do + _p9k_line_suffix_right[i]+='${_p9k__'$i'r_frame-'${(qqq)_p9k__ret}'}' + done + _p9k_line_never_empty_right[2,-2]=${(@)_p9k_line_never_empty_right[2,-2]/0/1} + fi + fi + fi +} + +_p9k_all_params_eq() { + local key + for key in ${parameters[(I)${~1}]}; do + [[ ${(P)key} == $2 ]] || return + done +} + +_p9k_init_display() { + _p9k_display_k=(empty_line 1 ruler 3) + local -i n=3 i + local name + for i in {1..$#_p9k_line_segments_left}; do + local -i j=$((-$#_p9k_line_segments_left+i-1)) + _p9k_display_k+=( + $i $((n+=2)) $j $n + $i/left_frame $((n+=2)) $j/left_frame $n + $i/right_frame $((n+=2)) $j/right_frame $n + $i/left $((n+=2)) $j/left $n + $i/right $((n+=2)) $j/right $n + $i/gap $((n+=2)) $j/gap $n) + for name in ${${(@0)_p9k_line_segments_left[i]}%_joined}; do + _p9k_display_k+=($i/left/$name $((n+=2)) $j/left/$name $n) + done + for name in ${${(@0)_p9k_line_segments_right[i]}%_joined}; do + _p9k_display_k+=($i/right/$name $((n+=2)) $j/right/$name $n) + done + done +} + +_p9k_init_prompt() { + _p9k_t=($'\n' $'%{\n%}' '') + _p9k_prompt_overflow_bug && _p9k_t[2]=$'%{%G\n%}' + + _p9k_init_lines + + _p9k_gap_pre='${${:-${_p9k__x::=0}${_p9k__y::=1024}${_p9k__p::=$_p9k__lprompt$_p9k__rprompt}' + repeat 10; do + _p9k_gap_pre+='${_p9k__m::=$(((_p9k__x+_p9k__y)/2))}' + _p9k_gap_pre+='${_p9k__xy::=${${(%):-$_p9k__p%$_p9k__m(l./$_p9k__m;$_p9k__y./$_p9k__x;$_p9k__m)}##*/}}' + _p9k_gap_pre+='${_p9k__x::=${_p9k__xy%;*}}' + _p9k_gap_pre+='${_p9k__y::=${_p9k__xy#*;}}' + done + _p9k_gap_pre+='${_p9k__m::=$((_p9k__clm-_p9k__x-_p9k__ind-1))}' + _p9k_gap_pre+='}+}' + + _p9k_prompt_prefix_left='${${_p9k__clm::=$COLUMNS}+}${${COLUMNS::=1024}+}' + _p9k_prompt_prefix_right='${_p9k__'$#_p9k_line_segments_left'-${${_p9k__clm::=$COLUMNS}+}${${COLUMNS::=1024}+}' + _p9k_prompt_suffix_left='${${COLUMNS::=$_p9k__clm}+}' + _p9k_prompt_suffix_right='${${COLUMNS::=$_p9k__clm}+}}' + + if _p9k_segment_in_use vi_mode || _p9k_segment_in_use prompt_char; then + _p9k_prompt_prefix_left+='${${_p9k__keymap::=${KEYMAP:-$_p9k__keymap}}+}' + fi + if { _p9k_segment_in_use vi_mode && (( $+_POWERLEVEL9K_VI_OVERWRITE_MODE_STRING )) } || + { _p9k_segment_in_use prompt_char && (( _POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE )) }; then + _p9k_prompt_prefix_left+='${${_p9k__zle_state::=${ZLE_STATE:-$_p9k__zle_state}}+}' + fi + _p9k_prompt_prefix_left+='%b%k%f' + + # Bug fixed in: https://github.com/zsh-users/zsh/commit/3eea35d0853bddae13fa6f122669935a01618bf9. + # If affects most terminals when RPROMPT is non-empty and ZLE_RPROMPT_INDENT is zero. + # We can work around it as long as RPROMPT ends with a space. + if [[ -n $_p9k_line_segments_right[-1] && $_p9k_line_never_empty_right[-1] == 0 && + $ZLE_RPROMPT_INDENT == 0 ]] && + _p9k_all_params_eq '_POWERLEVEL9K_*WHITESPACE_BETWEEN_RIGHT_SEGMENTS' ' ' && + _p9k_all_params_eq '_POWERLEVEL9K_*RIGHT_RIGHT_WHITESPACE' ' ' && + _p9k_all_params_eq '_POWERLEVEL9K_*RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL' '' && + [[ $ZSH_VERSION != (5.7.<2->*|5.<8->*|<6->.*) ]]; then + _p9k_emulate_zero_rprompt_indent=1 + _p9k_prompt_prefix_left+='${${:-${_p9k__real_zle_rprompt_indent:=$ZLE_RPROMPT_INDENT}${ZLE_RPROMPT_INDENT::=1}${_p9k__ind::=0}}+}' + _p9k_line_suffix_right[-1]='${_p9k__sss:+${_p9k__sss% }%E}}' + else + _p9k_emulate_zero_rprompt_indent=0 + _p9k_prompt_prefix_left+='${${_p9k__ind::=${${ZLE_RPROMPT_INDENT:-1}/#-*/0}}+}' + fi + + if (( _POWERLEVEL9K_TERM_SHELL_INTEGRATION )); then + _p9k_prompt_prefix_left+=$'%{\e]133;A\a%}' + _p9k_prompt_suffix_left+=$'%{\e]133;B\a%}' + if [[ $TERM_PROGRAM == WarpTerminal ]]; then + _p9k_prompt_prefix_right=$'%{\e]133;P;k=r\a%}'$_p9k_prompt_prefix_right + _p9k_prompt_suffix_right+=$'%{\e]133;B\a%}' + fi + if (( $+_z4h_iterm_cmd && _z4h_can_save_restore_screen == 1 )); then + _p9k_prompt_prefix_left+=$'%{\ePtmux;\e\e]133;A\a\e\\%}' + _p9k_prompt_suffix_left+=$'%{\ePtmux;\e\e]133;B\a\e\\%}' + if [[ $TERM_PROGRAM == WarpTerminal ]]; then + _p9k_prompt_prefix_right=$'%{\ePtmux;\e\e]133;P;k=r\a\e\\%}'$_p9k_prompt_prefix_right + _p9k_prompt_suffix_right+=$'%{\ePtmux;\e\e]133;B\a\e\\%}' + fi + fi + fi + + if (( _POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT > 0 )); then + _p9k_t+=${(pl.$_POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT..\n.)} + else + _p9k_t+='' + fi + _p9k_empty_line_idx=$#_p9k_t + if (( __p9k_ksh_arrays )); then + _p9k_prompt_prefix_left+='${_p9k_t[${_p9k__empty_line_i:-'$#_p9k_t'}-1]}' + else + _p9k_prompt_prefix_left+='${_p9k_t[${_p9k__empty_line_i:-'$#_p9k_t'}]}' + fi + + local -i num_lines=$#_p9k_line_segments_left + if (( $+terminfo[cuu1] )); then + _p9k_escape $terminfo[cuu1] + if (( __p9k_ksh_arrays )); then + local scroll=$'${_p9k_t[${_p9k__ruler_i:-1}-1]:+\n'$_p9k__ret'}' + else + local scroll=$'${_p9k_t[${_p9k__ruler_i:-1}]:+\n'$_p9k__ret'}' + fi + if (( num_lines > 1 )); then + local -i line_index= + for line_index in {1..$((num_lines-1))}; do + scroll='${_p9k__'$line_index-$'\n}'$scroll'${_p9k__'$line_index-$_p9k__ret'}' + done + fi + _p9k_prompt_prefix_left+='%{${_p9k__ipe-'$scroll'}%}' + fi + + _p9k_get_icon '' RULER_CHAR + local ruler_char=$_p9k__ret + _p9k_prompt_length $ruler_char + (( _p9k__ret == 1 && $#ruler_char == 1 )) || ruler_char=' ' + _p9k_color prompt_ruler BACKGROUND "" + if [[ -z $_p9k__ret && $ruler_char == ' ' ]]; then + local ruler=$'\n' + else + _p9k_background $_p9k__ret + local ruler=%b$_p9k__ret + _p9k_color prompt_ruler FOREGROUND "" + _p9k_foreground $_p9k__ret + ruler+=$_p9k__ret + [[ $ruler_char == '.' ]] && local sep=',' || local sep='.' + ruler+='${(pl'$sep'${$((_p9k__clm-_p9k__ind))/#-*/0}'$sep$sep$ruler_char$sep')}%k%f' + if (( __p9k_ksh_arrays )); then + ruler+='${_p9k_t[$((!_p9k__ind))]}' + else + ruler+='${_p9k_t[$((1+!_p9k__ind))]}' + fi + fi + _p9k_t+=$ruler + _p9k_ruler_idx=$#_p9k_t + if (( __p9k_ksh_arrays )); then + _p9k_prompt_prefix_left+='${(e)_p9k_t[${_p9k__ruler_i:-'$#_p9k_t'}-1]}' + else + _p9k_prompt_prefix_left+='${(e)_p9k_t[${_p9k__ruler_i:-'$#_p9k_t'}]}' + fi + + ( _p9k_segment_in_use time && (( _POWERLEVEL9K_TIME_UPDATE_ON_COMMAND )) ) + _p9k_reset_on_line_finish=$((!$?)) + + _p9k_t+=$_p9k_gap_pre + _p9k_gap_pre='${(e)_p9k_t['$(($#_p9k_t - __p9k_ksh_arrays))']}' + _p9k_t+=$_p9k_prompt_prefix_left + _p9k_prompt_prefix_left='${(e)_p9k_t['$(($#_p9k_t - __p9k_ksh_arrays))']}' +} + +_p9k_init_ssh() { + # The following code is based on Pure: + # https://github.com/sindresorhus/pure/blob/e8abf9d37185ec9b7b4398ca9c5eba555a1028eb/pure.zsh. + # + # License: https://github.com/sindresorhus/pure/blob/e8abf9d37185ec9b7b4398ca9c5eba555a1028eb/license. + + [[ -n $P9K_SSH && $_P9K_SSH_TTY == $TTY ]] && return + typeset -gix P9K_SSH=0 + typeset -gx _P9K_SSH_TTY=$TTY + if [[ -n $SSH_CLIENT || -n $SSH_TTY || -n $SSH_CONNECTION ]]; then + P9K_SSH=1 + return 0 + fi + + # When changing user on a remote system, the $SSH_CONNECTION environment variable can be lost. + # Attempt detection via `who`. + (( $+commands[who] )) || return + + local ipv6='(([0-9a-fA-F]+:)|:){2,}[0-9a-fA-F]+' # Simplified, only checks partial pattern. + local ipv4='([0-9]{1,3}\.){3}[0-9]+' # Simplified, allows invalid ranges. + # Assume two non-consecutive periods represents a hostname. Matches `x.y.z`, but not `x.y`. + local hostname='([.][^. ]+){2}' + + local w + w="$(who -m 2>/dev/null)" || w=${(@M)${(f)"$(who 2>/dev/null)"}:#*[[:space:]]${TTY#/dev/}[[:space:]]*} + + # Usually the remote address is surrounded by parenthesis but not on all systems (e.g., Busybox). + [[ $w =~ "\(?($ipv4|$ipv6|$hostname)\)?\$" ]] && P9K_SSH=1 +} + +_p9k_init_toolbox() { + [[ -z $P9K_TOOLBOX_NAME ]] || return 0 + if [[ -f /run/.containerenv && -r /run/.containerenv ]]; then + local name=(${(Q)${${(@M)${(f)"$(|4801)}\1$DEFAULT_USER\1$P9K_SSH\1$+commands[uname]\1' + _p9k__param_pat+=$'$__p9k_root_dir\1$functions[p10k-on-init]\1$functions[p10k-on-pre-prompt]\1' + _p9k__param_pat+=$'$functions[p10k-on-post-widget]\1$functions[p10k-on-post-prompt]\1' + _p9k__param_pat+=$'$+commands[git]\1$terminfo[colors]\1${+_z4h_iterm_cmd}\1' + _p9k__param_pat+=$'$_z4h_can_save_restore_screen' + local MATCH + IFS=$'\1' _p9k__param_pat+="${(@)${(@o)parameters[(I)POWERLEVEL9K_*]}:/(#m)*/\${${(q)MATCH}-$IFS\}}" + IFS=$'\2' _p9k__param_sig="${(e)_p9k__param_pat}" +} + +function _p9k_set_os() { + _p9k_os=$1 + _p9k_get_icon prompt_os_icon $2 + _p9k_os_icon=$_p9k__ret +} + +function _p9k_init_cacheable() { + _p9k_init_icons + _p9k_init_params + _p9k_init_prompt + _p9k_init_display + + # https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda#backward-compatibility + if [[ $VTE_VERSION != (<1-4602>|4801) ]]; then + _p9k_term_has_href=1 + fi + + local elem func + local -i i=0 + + for i in {1..$#_p9k_line_segments_left}; do + for elem in ${${${(@0)_p9k_line_segments_left[i]}%_joined}//-/_}; do + local var=POWERLEVEL9K_${${(U)elem}//ฤฐ/I}_SHOW_ON_COMMAND + (( $+parameters[$var] )) || continue + _p9k_show_on_command+=( + $'(|*[/\0])('${(j.|.)${(P)var}}')' + $((1+_p9k_display_k[$i/left/$elem])) + _p9k__${i}l$elem) + done + for elem in ${${${(@0)_p9k_line_segments_right[i]}%_joined}//-/_}; do + local var=POWERLEVEL9K_${${(U)elem}//ฤฐ/I}_SHOW_ON_COMMAND + (( $+parameters[$var] )) || continue + local cmds=(${(P)var}) + _p9k_show_on_command+=( + $'(|*[/\0])('${(j.|.)${(P)var}}')' + $((1+$_p9k_display_k[$i/right/$elem])) + _p9k__${i}r$elem) + done + done + + if [[ $_POWERLEVEL9K_TRANSIENT_PROMPT != off ]]; then + local sep=$'\1' + _p9k_transient_prompt='%b%k%s%u%(?'$sep + _p9k_color prompt_prompt_char_OK_VIINS FOREGROUND 76 + _p9k_foreground $_p9k__ret + _p9k_transient_prompt+=$_p9k__ret + _p9k_transient_prompt+='${${P9K_CONTENT::="โฏ"}+}' + _p9k_param prompt_prompt_char_OK_VIINS CONTENT_EXPANSION '${P9K_CONTENT}' + _p9k_transient_prompt+='${:-"'$_p9k__ret'"}' + _p9k_transient_prompt+=$sep + _p9k_color prompt_prompt_char_ERROR_VIINS FOREGROUND 196 + _p9k_foreground $_p9k__ret + _p9k_transient_prompt+=$_p9k__ret + _p9k_transient_prompt+='${${P9K_CONTENT::="โฏ"}+}' + _p9k_param prompt_prompt_char_ERROR_VIINS CONTENT_EXPANSION '${P9K_CONTENT}' + _p9k_transient_prompt+='${:-"'$_p9k__ret'"}' + _p9k_transient_prompt+=')%b%k%f%s%u' + _p9k_get_icon '' LEFT_SEGMENT_END_SEPARATOR + if [[ $_p9k__ret != (| ) ]]; then + _p9k__ret+=%b%k%f + # Not escaped for historical reasons. + _p9k__ret='${:-"'$_p9k__ret'"}' + fi + _p9k_transient_prompt+=$_p9k__ret + if (( _POWERLEVEL9K_TERM_SHELL_INTEGRATION )); then + _p9k_transient_prompt=$'%{\e]133;A\a%}'$_p9k_transient_prompt$'%{\e]133;B\a%}' + if (( $+_z4h_iterm_cmd && _z4h_can_save_restore_screen == 1 )); then + _p9k_transient_prompt=$'%{\ePtmux;\e\e]133;A\a\e\\%}'$_p9k_transient_prompt$'%{\ePtmux;\e\e]133;B\a\e\\%}' + fi + fi + fi + + _p9k_uname="$(uname)" + [[ $_p9k_uname == Linux ]] && _p9k_uname_o="$(uname -o 2>/dev/null)" + _p9k_uname_m="$(uname -m)" + + if [[ $_p9k_uname == Linux && $_p9k_uname_o == Android ]]; then + _p9k_set_os Android ANDROID_ICON + else + case $_p9k_uname in + SunOS) _p9k_set_os Solaris SUNOS_ICON;; + Darwin) _p9k_set_os OSX APPLE_ICON;; + CYGWIN*|MSYS*|MINGW*) _p9k_set_os Windows WINDOWS_ICON;; + FreeBSD|OpenBSD|DragonFly) _p9k_set_os BSD FREEBSD_ICON;; + Linux) + _p9k_os='Linux' + local os_release_id + if [[ -r /etc/os-release ]]; then + local lines=(${(f)"$( 0 )); then + local state + for state in ${(k)__p9k_vcs_states}; do + _p9k_param prompt_vcs_$state CONTENT_EXPANSION x + if [[ -z $_p9k__ret ]]; then + _p9k_vcs_index=-1 + break + fi + done + fi + if (( _p9k_vcs_index == -1 )); then + _p9k_vcs_index=0 + _p9k_vcs_line_index=0 + _p9k_vcs_side= + fi + fi +} + +_p9k_init_vcs() { + if ! _p9k_segment_in_use vcs || (( ! $#_POWERLEVEL9K_VCS_BACKENDS )); then + (( $+functions[gitstatus_stop_p9k_] )) && gitstatus_stop_p9k_ POWERLEVEL9K + unset _p9k_preinit + return + fi + + _p9k_vcs_info_init + if (( $+functions[_p9k_preinit] )); then + if (( $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )); then + () { + trap 'return 130' INT + { + gitstatus_start_p9k_ -t $_POWERLEVEL9K_GITSTATUS_INIT_TIMEOUT_SEC POWERLEVEL9K + } always { + trap ':' INT + } + } + fi + (( $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )) || _p9k__instant_prompt_disabled=1 + return 0 + fi + (( _POWERLEVEL9K_DISABLE_GITSTATUS )) && return + (( $_POWERLEVEL9K_VCS_BACKENDS[(I)git] )) || return + + local gitstatus_dir=${_POWERLEVEL9K_GITSTATUS_DIR:-${__p9k_root_dir}/gitstatus} + + typeset -g _p9k_preinit="function _p9k_preinit() { + (( $+commands[git] )) || { unfunction _p9k_preinit; return 1 } + [[ \$ZSH_VERSION == ${(q)ZSH_VERSION} ]] || return + [[ -r ${(q)gitstatus_dir}/gitstatus.plugin.zsh ]] || return + builtin source ${(q)gitstatus_dir}/gitstatus.plugin.zsh _p9k_ || return + GITSTATUS_AUTO_INSTALL=${(q)GITSTATUS_AUTO_INSTALL} \ + GITSTATUS_DAEMON=${(q)GITSTATUS_DAEMON} \ + GITSTATUS_CACHE_DIR=${(q)GITSTATUS_CACHE_DIR} \ + GITSTATUS_NUM_THREADS=${(q)GITSTATUS_NUM_THREADS} \ + GITSTATUS_LOG_LEVEL=${(q)GITSTATUS_LOG_LEVEL} \ + GITSTATUS_ENABLE_LOGGING=${(q)GITSTATUS_ENABLE_LOGGING} \ + gitstatus_start_p9k_ \ + -s $_POWERLEVEL9K_VCS_STAGED_MAX_NUM \ + -u $_POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM \ + -d $_POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM \ + -c $_POWERLEVEL9K_VCS_CONFLICTED_MAX_NUM \ + -m $_POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY \ + ${${_POWERLEVEL9K_VCS_RECURSE_UNTRACKED_DIRS:#0}:+-e} \ + -a POWERLEVEL9K + }" + builtin source $gitstatus_dir/gitstatus.plugin.zsh _p9k_ || return + () { + trap 'return 130' INT + { + gitstatus_start_p9k_ \ + -s $_POWERLEVEL9K_VCS_STAGED_MAX_NUM \ + -u $_POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM \ + -d $_POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM \ + -c $_POWERLEVEL9K_VCS_CONFLICTED_MAX_NUM \ + -m $_POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY \ + -t $_POWERLEVEL9K_GITSTATUS_INIT_TIMEOUT_SEC \ + ${${_POWERLEVEL9K_VCS_RECURSE_UNTRACKED_DIRS:#0}:+-e} \ + POWERLEVEL9K + } always { + trap ':' INT + } + } + (( $+GITSTATUS_DAEMON_PID_POWERLEVEL9K )) || _p9k__instant_prompt_disabled=1 +} + +function _p9k_iterm2_precmd() { + builtin zle && return + if (( _p9k__iterm_cmd )) && [[ -t 1 ]]; then + (( _p9k__iterm_cmd == 1 )) && builtin print -n '\e]133;C;\a' + builtin printf '\e]133;D;%s\a' $1 + fi + typeset -gi _p9k__iterm_cmd=1 +} + +function _p9k_iterm2_preexec() { + [[ -t 1 ]] && builtin print -n '\e]133;C;\a' + typeset -gi _p9k__iterm_cmd=2 +} + +_p9k_init() { + _p9k_init_vars + _p9k_restore_state || _p9k_init_cacheable + + typeset -g P9K_OS_ICON=$_p9k_os_icon + + local -a _p9k__async_segments_compute + + local -i i + local elem + + _p9k__prompt_side=left + _p9k__segment_index=1 + for i in {1..$#_p9k_line_segments_left}; do + for elem in ${${(@0)_p9k_line_segments_left[i]}%_joined}; do + local f_init=_p9k_prompt_${elem}_init + (( $+functions[$f_init] )) && $f_init + (( ++_p9k__segment_index )) + done + done + + _p9k__prompt_side=right + _p9k__segment_index=1 + for i in {1..$#_p9k_line_segments_right}; do + for elem in ${${(@0)_p9k_line_segments_right[i]}%_joined}; do + local f_init=_p9k_prompt_${elem}_init + (( $+functions[$f_init] )) && $f_init + (( ++_p9k__segment_index )) + done + done + + if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE || + -n $_POWERLEVEL9K_IP_INTERFACE || + -n $_POWERLEVEL9K_VPN_IP_INTERFACE ]]; then + _p9k_prompt_net_iface_init + fi + + if [[ -n $_p9k__async_segments_compute ]]; then + functions[_p9k_async_segments_compute]=${(pj:\n:)_p9k__async_segments_compute} + _p9k_worker_start + fi + + local k v + for k v in ${(kv)_p9k_display_k}; do + [[ $k == -* ]] && continue + _p9k__display_v[v]=$k + _p9k__display_v[v+1]=show + done + _p9k__display_v[2]=hide + _p9k__display_v[4]=hide + + if (( $+functions[iterm2_decorate_prompt] )); then + _p9k__iterm2_decorate_prompt=$functions[iterm2_decorate_prompt] + function iterm2_decorate_prompt() { + typeset -g ITERM2_PRECMD_PS1=$PROMPT + typeset -g ITERM2_SHOULD_DECORATE_PROMPT= + } + fi + if (( $+functions[iterm2_precmd] )); then + _p9k__iterm2_precmd=$functions[iterm2_precmd] + functions[iterm2_precmd]='local _p9k_status=$?; zle && return; () { return $_p9k_status; }; '$_p9k__iterm2_precmd + fi + + if (( _POWERLEVEL9K_TERM_SHELL_INTEGRATION && + ! $+_z4h_iterm_cmd && + ! $+functions[iterm2_decorate_prompt] && + ! $+functions[iterm2_precmd] )); then + typeset -gi _p9k__iterm_cmd=0 + fi + + if _p9k_segment_in_use todo; then + if [[ -n ${_p9k__todo_command::=${commands[todo.sh]}} ]]; then + local todo_global=/etc/todo/config + elif [[ -n ${_p9k__todo_command::=${commands[todo-txt]}} ]]; then + local todo_global=/etc/todo-txt/config + fi + if [[ -n $_p9k__todo_command ]]; then + _p9k__todo_file="$(exec -a $_p9k__todo_command ${commands[bash]:-:} 3>&1 &>/dev/null -c " + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo/config + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${XDG_CONFIG_HOME:-\$HOME/.config}/todo/config + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=${(qqq)_p9k__todo_command:h}/todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${TODOTXT_GLOBAL_CFG_FILE:-${(qqq)todo_global}} + [ -r \"\$TODOTXT_CFG_FILE\" ] || exit + source \"\$TODOTXT_CFG_FILE\" + printf "%s" \"\$TODO_FILE\" >&3")" + fi + fi + + if _p9k_segment_in_use dir && + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && $+commands[jq] == 0 ]]; then + print -rP -- '%F{yellow}WARNING!%f %BPOWERLEVEL9K_SHORTEN_STRATEGY=truncate_with_package_name%b requires %F{green}jq%f.' + print -rP -- 'Either install %F{green}jq%f or change the value of %BPOWERLEVEL9K_SHORTEN_STRATEGY%b.' + fi + + _p9k_init_vcs + + if (( _p9k__instant_prompt_disabled )); then + (( _POWERLEVEL9K_DISABLE_INSTANT_PROMPT )) && unset __p9k_instant_prompt_erased + _p9k_delete_instant_prompt + _p9k_dumped_instant_prompt_sigs=() + fi + + if (( $+__p9k_instant_prompt_sourced && __p9k_instant_prompt_sourced != __p9k_instant_prompt_version )); then + _p9k_delete_instant_prompt + _p9k_dumped_instant_prompt_sigs=() + fi + + if (( $+__p9k_instant_prompt_erased )); then + unset __p9k_instant_prompt_erased + if [[ -w $TTY ]]; then + local tty=$TTY + elif [[ -w /dev/tty ]]; then + local tty=/dev/tty + else + local tty=/dev/null + fi + { + >&2 echo -E - "" + >&2 echo -E - "${(%):-[%1FERROR%f]: When using instant prompt, Powerlevel10k must be loaded before the first prompt.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):-You can:}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - %BRecommended%b: Change the way Powerlevel10k is loaded from %B$__p9k_zshrc_u%b.}" + if (( _p9k_term_has_href )); then + >&2 echo - "${(%):- See \e]8;;https://github.com/romkatv/powerlevel10k#installation\ahttps://github.com/romkatv/powerlevel10k#installation\e]8;;\a.}" + else + >&2 echo - "${(%):- See https://github.com/romkatv/powerlevel10k#installation.}" + fi + if (( $+zsh_defer_options )); then + >&2 echo -E - "" + >&2 echo -E - "${(%):- NOTE: Do not use %1Fzsh-defer%f to load %Upowerlevel10k.zsh-theme%u.}" + elif (( $+functions[zinit] )); then + >&2 echo -E - "" + >&2 echo -E - "${(%):- NOTE: If using %2Fzinit%f to load %3F'romkatv/powerlevel10k'%f, %Bdo not apply%b %1Fice wait%f.}" + elif (( $+functions[zplugin] )); then + >&2 echo -E - "" + >&2 echo -E - "${(%):- NOTE: If using %2Fzplugin%f to load %3F'romkatv/powerlevel10k'%f, %Bdo not apply%b %1Fice wait%f.}" + fi + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + >&2 echo -E - "${(%):- * Zsh will start %Bquickly%b.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - Disable instant prompt either by running %Bp10k configure%b or by manually}" + >&2 echo -E - "${(%):- defining the following parameter:}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- %3Ftypeset%f -g POWERLEVEL9K_INSTANT_PROMPT=off}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" + >&2 echo -E - "${(%):- * Zsh will start %Bslowly%b.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- - Do nothing.}" + >&2 echo -E - "" + >&2 echo -E - "${(%):- * You %Bwill%b see this error message every time you start zsh.}" + >&2 echo -E - "${(%):- * Zsh will start %Bslowly%b.}" + >&2 echo -E - "" + } 2>>$tty + fi +} + +_p9k_deinit() { + (( $+functions[_p9k_preinit] )) && unfunction _p9k_preinit + (( $+functions[gitstatus_stop_p9k_] )) && gitstatus_stop_p9k_ POWERLEVEL9K + _p9k_worker_stop + if (( _p9k__state_dump_fd )); then + zle -F $_p9k__state_dump_fd + exec {_p9k__state_dump_fd}>&- + fi + if (( _p9k__restore_prompt_fd )); then + zle -F $_p9k__restore_prompt_fd + exec {_p9k__restore_prompt_fd}>&- + fi + if (( _p9k__redraw_fd )); then + zle -F $_p9k__redraw_fd + exec {_p9k__redraw_fd}>&- + fi + (( $+_p9k__iterm2_precmd )) && functions[iterm2_precmd]=$_p9k__iterm2_precmd + (( $+_p9k__iterm2_decorate_prompt )) && functions[iterm2_decorate_prompt]=$_p9k__iterm2_decorate_prompt + unset -m '(_POWERLEVEL9K_|P9K_|_p9k_)*~(P9K_SSH|_P9K_SSH_TTY|P9K_TOOLBOX_NAME|P9K_TTY|_P9K_TTY)' + [[ -n $__p9k_locale ]] || unset __p9k_locale +} + +typeset -gi __p9k_enabled=0 +typeset -gi __p9k_configured=0 +typeset -gri __p9k_instant_prompt_disabled=1 + +# `typeset -g` doesn't roundtrip in zsh prior to 5.4. +if [[ $ZSH_VERSION == (5.<4->*|<6->.*) ]]; then + typeset -gri __p9k_dumps_enabled=1 +else + typeset -gri __p9k_dumps_enabled=0 +fi + +_p9k_do_nothing() { true; } + +_p9k_precmd_first() { + eval "$__p9k_intro" + if [[ -n $KITTY_SHELL_INTEGRATION && KITTY_SHELL_INTEGRATION[(wIe)no-prompt-mark] -eq 0 ]]; then + KITTY_SHELL_INTEGRATION+=' no-prompt-mark' + (( $+__p9k_force_term_shell_integration )) || typeset -gri __p9k_force_term_shell_integration=1 + elif [[ $TERM_PROGRAM == WarpTerminal ]]; then + (( $+__p9k_force_term_shell_integration )) || typeset -gri __p9k_force_term_shell_integration=1 + fi + typeset -ga precmd_functions=(${precmd_functions:#_p9k_precmd_first}) +} + +_p9k_setup() { + (( __p9k_enabled )) && return + + prompt_opts=(percent subst) + if (( ! $+__p9k_instant_prompt_active )); then + prompt_opts+=sp + prompt_opts+=cr + fi + + prompt_powerlevel9k_teardown + __p9k_enabled=1 + typeset -ga preexec_functions=(_p9k_preexec1 $preexec_functions _p9k_preexec2) + typeset -ga precmd_functions=(_p9k_do_nothing _p9k_precmd_first $precmd_functions _p9k_precmd) +} + +prompt_powerlevel9k_setup() { + _p9k_restore_special_params + eval "$__p9k_intro" + _p9k_setup +} + +prompt_powerlevel9k_teardown() { + _p9k_restore_special_params + eval "$__p9k_intro" + add-zsh-hook -D precmd '(_p9k_|powerlevel9k_)*' + add-zsh-hook -D preexec '(_p9k_|powerlevel9k_)*' + PROMPT='%m%# ' + RPROMPT= + if (( __p9k_enabled )); then + _p9k_deinit + __p9k_enabled=0 + fi +} + +typeset -gr __p9k_p10k_usage="Usage: %2Fp10k%f %Bcommand%b [options] + +Commands: + + %Bconfigure%b run interactive configuration wizard + %Breload%b reload configuration + %Bsegment%b print a user-defined prompt segment + %Bdisplay%b show, hide or toggle prompt parts + %Bhelp%b print this help message + +Print help for a specific command: + + %2Fp10k%f %Bhelp%b command" + +typeset -gr __p9k_p10k_segment_usage="Usage: %2Fp10k%f %Bsegment%b [-h] [{+|-}re] [-s state] [-b bg] [-f fg] [-i icon] [-c cond] [-t text] + +Print a user-defined prompt segment. Can be called only during prompt rendering. + +Options: + -t text segment's main content; will undergo prompt expansion: '%%F{blue}%%*%%f' will + show as %F{blue}%*%f; default is empty + -i icon segment's icon; default is empty + -r icon is a symbolic reference that needs to be resolved; for example, 'LOCK_ICON' + +r icon is already resolved and should be printed literally; for example, 'โญ'; + this is the default; you can also use \$'\u2B50' if you don't want to have + non-ascii characters in source code + -b bg background color; for example, 'blue', '4', or '#0000ff'; empty value means + transparent background, as in '%%k'; default is black + -f fg foreground color; for example, 'blue', '4', or '#0000ff'; empty value means + default foreground color, as in '%%f'; default is empty + -s state segment's state for the purpose of applying styling options; if you want to + to be able to use POWERLEVEL9K parameters to specify different colors or icons + depending on some property, use different states for different values of that + property + -c condition; if empty after parameter expansion and process substitution, the + segment is hidden; this is an advanced feature, use with caution; default is '1' + -e segment's main content will undergo parameter expansion and process + substitution; the content will be surrounded with double quotes and thus + should quote its own double quotes; this is an advanced feature, use with + caution + +e segment's main content should not undergo parameter expansion and process + substitution; this is the default + -h print this help message + +Example: 'core' segment tells you if there is a file name 'core' in the current directory. + +- Segment's icon is 'โญ'. +- Segment's text is the file's size in bytes. +- If you have permissions to delete the file, state is DELETABLE. If not, it's PROTECTED. + + zmodload -F zsh/stat b:zstat + + function prompt_core() { + local size=() + if ! zstat -A size +size core 2>/dev/null; then + # No 'core' file in the current directory. + return + fi + if [[ -w . ]]; then + local state=DELETABLE + else + local state=PROTECTED + fi + p10k segment -s \$state -i 'โญ' -f blue -t \${size[1]}b + } + +To enable this segment, add 'core' to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or +POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. + +Example customizations: + + # Override default foreground. + POWERLEVEL9K_CORE_FOREGROUND=red + + # Override foreground when DELETABLE. + POWERLEVEL9K_CORE_DELETABLE_BACKGROUND=green + + # Override icon when PROTECTED. + POWERLEVEL9K_CORE_PROTECTED_VISUAL_IDENTIFIER_EXPANSION='โŽ' + + # Don't show file size when PROTECTED. + POWERLEVEL9K_CORE_PROTECTED_CONTENT_EXPANSION=''" + +typeset -gr __p9k_p10k_configure_usage="Usage: %2Fp10k%f %Bconfigure%b + +Run interactive configuration wizard." + +typeset -gr __p9k_p10k_reload_usage="Usage: %2Fp10k%f %Breload%b + +Reload configuration." + +typeset -gr __p9k_p10k_finalize_usage="Usage: %2Fp10k%f %Bfinalize%b + +Perform the final stage of initialization. Must be called at the very end of zshrc." + +typeset -gr __p9k_p10k_display_usage="Usage: %2Fp10k%f %Bdisplay%b part-pattern=state-list... + + Show, hide or toggle prompt parts. If called from zle, the current + prompt is refreshed. + +Usage: %2Fp10k%f %Bdisplay%b -a [part-pattern]... + + Populate array \`reply\` with states of prompt parts matching the patterns. + If no patterns are supplied, assume \`*\`. + +Usage: %2Fp10k%f %Bdisplay%b -r + + Redisplay prompt. + +Parts: + empty_line empty line (duh) + ruler ruler; if POWERLEVEL9K_RULER_CHAR=' ', it's essentially another + new_line + N prompt line number N, 1-based; counting from the top if positive, + from the bottom if negative + N/left_frame left frame on the Nth line + N/left left prompt on the Nth line + N/gap gap between left and right prompts on the Nth line + N/right right prompt on the Nth line + N/right_frame right frame on the Nth line + N/left/S segment S within N/left (dir, time, etc.) + N/right/S segment S within N/right (dir, time, etc.) + +Part States: + show the part is displayed + hide the part is not displayed + print the part is printed in precmd; only applicable to empty_line and + ruler; unlike show, the effects of print cannot be undone with hide; + print used to look better after \`clear\` but this is no longer the + case; it's best to avoid it unless you know what you are doing + +part-pattern is a glob pattern for parts. Examples: + + */kubecontext all kubecontext prompt segments, regardless of where + they are + 1/(right|right_frame) all prompt segments and frame from the right side of + the first line + +state-list is a comma-separated list of states. Must have at least one element. +If more than one, states will rotate. + +Example: Bind Ctrl+P to toggle right prompt. + + function toggle-right-prompt() { p10k display '*/right'=hide,show; } + zle -N toggle-right-prompt + bindkey '^P' toggle-right-prompt + +Example: Print the current state of all prompt parts: + + typeset -A reply + p10k display -a '*' + printf '%%-32s = %%q\n' \${(@kv)reply} | sort +" + +# 0 -- reset-prompt not blocked +# 1 -- reset-prompt blocked and not needed +# 2 -- reset-prompt blocked and needed +typeset -gi __p9k_reset_state + +function p10k() { + [[ $# != 1 || $1 != finalize ]] || { p10k-instant-prompt-finalize; return 0 } + + eval "$__p9k_intro_no_reply" + + if (( !ARGC )); then + print -rP -- $__p9k_p10k_usage >&2 + return 1 + fi + + case $1 in + segment) + local REPLY + local -a reply + shift + local -i OPTIND + local OPTARG opt state bg=0 fg icon cond text ref=0 expand=0 + while getopts ':s:b:f:i:c:t:reh' opt; do + case $opt in + s) state=$OPTARG;; + b) bg=$OPTARG;; + f) fg=$OPTARG;; + i) icon=$OPTARG;; + c) cond=${OPTARG:-'${:-}'};; + t) text=$OPTARG;; + r) ref=1;; + e) expand=1;; + +r) ref=0;; + +e) expand=0;; + h) print -rP -- $__p9k_p10k_segment_usage; return 0;; + ?) print -rP -- $__p9k_p10k_segment_usage >&2; return 1;; + esac + done + if (( OPTIND <= ARGC )); then + print -rP -- $__p9k_p10k_segment_usage >&2 + return 1 + fi + if [[ -z $_p9k__prompt_side ]]; then + print -rP -- "%1F[ERROR]%f %Bp10k segment%b: can be called only during prompt rendering." >&2 + if (( !ARGC )); then + print -rP -- "" + print -rP -- "For help, type:" >&2 + print -rP -- "" + print -rP -- " %2Fp10k%f %Bhelp%b %Bsegment%b" >&2 + fi + return 1 + fi + (( ref )) || icon=$'\1'$icon + typeset -i _p9k__has_upglob + "_p9k_${_p9k__prompt_side}_prompt_segment" "prompt_${_p9k__segment_name}${state:+_${${(U)state}//ฤฐ/I}}" \ + "$bg" "${fg:-$_p9k_color1}" "$icon" "$expand" "$cond" "$text" + return 0 + ;; + display) + if (( ARGC == 1 )); then + print -rP -- $__p9k_p10k_display_usage >&2 + return 1 + fi + shift + local -i k dump + local opt prev new pair list name var + while getopts ':har' opt; do + case $opt in + r) + if (( __p9k_reset_state > 0 )); then + __p9k_reset_state=2 + else + __p9k_reset_state=-1 + fi + ;; + a) dump=1;; + h) print -rP -- $__p9k_p10k_display_usage; return 0;; + ?) print -rP -- $__p9k_p10k_display_usage >&2; return 1;; + esac + done + if (( dump )); then + reply=() + shift $((OPTIND-1)) + (( ARGC )) || set -- '*' + for opt; do + for k in ${(u@)_p9k_display_k[(I)$opt]:/(#m)*/$_p9k_display_k[$MATCH]}; do + reply+=($_p9k__display_v[k,k+1]) + done + done + if (( __p9k_reset_state == -1 )); then + _p9k_reset_prompt + fi + return 0 + fi + local REPLY + local -a reply + for opt in "${@:$OPTIND}"; do + pair=(${(s:=:)opt}) + list=(${(s:,:)${pair[2]}}) + if [[ ${(b)pair[1]} == $pair[1] ]]; then # this branch is purely for optimization + local ks=($_p9k_display_k[$pair[1]]) + else + local ks=(${(u@)_p9k_display_k[(I)$pair[1]]:/(#m)*/$_p9k_display_k[$MATCH]}) + fi + for k in $ks; do + if (( $#list == 1 )); then # this branch is purely for optimization + [[ $_p9k__display_v[k+1] == $list[1] ]] && continue + new=$list[1] + else + new=${list[list[(I)$_p9k__display_v[k+1]]+1]:-$list[1]} + [[ $_p9k__display_v[k+1] == $new ]] && continue + fi + _p9k__display_v[k+1]=$new + name=$_p9k__display_v[k] + if [[ $name == (empty_line|ruler) ]]; then + var=_p9k__${name}_i + [[ $new == show ]] && unset $var || typeset -gi $var=3 + elif [[ $name == (#b)(<->)(*) ]]; then + var=_p9k__${match[1]}${${${${match[2]//\/}/#left/l}/#right/r}/#gap/g} + [[ $new == hide ]] && typeset -g $var= || unset $var + fi + if (( __p9k_reset_state > 0 )); then + __p9k_reset_state=2 + else + __p9k_reset_state=-1 + fi + done + done + if (( __p9k_reset_state == -1 )); then + _p9k_reset_prompt + fi + ;; + configure) + if (( ARGC > 1 )); then + print -rP -- $__p9k_p10k_configure_usage >&2 + return 1 + fi + local REPLY + local -a reply + p9k_configure "$@" || return + ;; + reload) + if (( ARGC > 1 )); then + print -rP -- $__p9k_p10k_reload_usage >&2 + return 1 + fi + (( $+_p9k__force_must_init )) || return 0 + _p9k__force_must_init=1 + ;; + help) + local var=__p9k_p10k_$2_usage + if (( $+parameters[$var] )); then + print -rP -- ${(P)var} + return 0 + elif (( ARGC == 1 )); then + print -rP -- $__p9k_p10k_usage + return 0 + else + print -rP -- $__p9k_p10k_usage >&2 + return 1 + fi + ;; + finalize) + print -rP -- $__p9k_p10k_finalize_usage >&2 + return 1 + ;; + clear-instant-prompt) + if (( $+__p9k_instant_prompt_active )); then + _p9k_clear_instant_prompt + unset __p9k_instant_prompt_active + fi + return 0 + ;; + *) + print -rP -- $__p9k_p10k_usage >&2 + return 1 + ;; + esac +} + +# Hook for zplugin. +powerlevel10k_plugin_unload() { prompt_powerlevel9k_teardown; } + +function p10k-instant-prompt-finalize() { + unsetopt local_options + (( ${+__p9k_instant_prompt_active} )) && unsetopt prompt_cr prompt_sp || setopt prompt_cr prompt_sp +} + +autoload -Uz add-zsh-hook + +zmodload zsh/datetime +zmodload zsh/mathfunc +zmodload zsh/parameter 2>/dev/null # https://github.com/romkatv/gitstatus/issues/58#issuecomment-553407177 +zmodload zsh/system +zmodload zsh/termcap +zmodload zsh/terminfo +zmodload zsh/zleparameter +zmodload -F zsh/stat b:zstat +zmodload -F zsh/net/socket b:zsocket +zmodload -F zsh/files b:zf_mv b:zf_rm + +if [[ $__p9k_dump_file != $__p9k_instant_prompt_dump_file && -n $__p9k_instant_prompt_dump_file ]]; then + _p9k_delete_instant_prompt + zf_rm -f -- $__p9k_dump_file{,.zwc} 2>/dev/null + zf_rm -f -- $__p9k_instant_prompt_dump_file{,.zwc} 2>/dev/null +fi + +typeset -g P9K_VERSION=1.20.10 +unset VSCODE_SHELL_INTEGRATION + +_p9k_init_ssh +_p9k_init_toolbox +prompt_powerlevel9k_setup diff --git a/src/powerlevel10k/internal/p10k.zsh.zwc b/src/powerlevel10k/internal/p10k.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..b997fa4455bc3bd74acf06cd105a03daeada4670 GIT binary patch literal 817224 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

&wM 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

NebdE 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' '' + '>' '' + '>&' '' + '<' '' + '<&' '' + '<>' '' + '&>|' '' + '>|' '' + '&>>' '' + '>>' '' + '>>&' '' + '&>>|' '' + '>>|' '' + '<<<' '' +) + +typeset -grA __p9k_pb_term=( + '|' '' + '||' '' + ';' '' + '&' '' + '&&' '' + '|&' '' + '&!' '' + '&|' '' + ';;' '' + ';&' '' + ';|' '' + '(' '' + ')' '' + '()' '' # handled specially + '}' '' # handled specially +) + +typeset -grA __p9k_pb_term_skip=( + '(' '\)' + ';;' '\)|esac' + ';&' '\)|esac' + ';|' '\)|esac' +) + +# Usage: _p9k_parse_buffer [token-limit] +# +# Parses the specified command line buffer and pupulates array P9K_COMMANDS +# with commands from it. Terminates early and returns 1 if there are more +# tokens than the specified limit. +# +# Broken: +# +# --------------- +# : $(x) +# --------------- +# : `x` +# --------------- +# ${x/} +# --------------- +# - -- x +# --------------- +# command -p -p x +# --------------- +# * +# --------------- +# x=$y; $x +# --------------- +# alias x=y; y +# --------------- +# x < ]] || return 2 + + local rcquotes + [[ -o rcquotes ]] && rcquotes=rcquotes + + eval "$__p9k_intro" + setopt no_nomatch $rcquotes + + typeset -ga P9K_COMMANDS=() + + local -r id='(<->|[[:alpha:]_][[:IDENT:]]#)' + local -r var="\$$id|\${$id}|\"\$$id\"|\"\${$id}\"" + + local -i e ic c=${2:-'1 << 62'} + local skip n s r state token cmd prev + local -a aln alp alf v + + if [[ -o interactive_comments ]]; then + ic=1 + local tokens=(${(Z+C+)1}) + else + local tokens=(${(z)1}) + fi + + { + while (( $#tokens )); do + (( e = $#state )) + + while (( $#tokens == alp[-1] )); do + aln[-1]=() + alp[-1]=() + if (( $#tokens == alf[-1] )); then + alf[-1]=() + (( e = 0 )) + fi + done + + while (( c-- > 0 )) || return; do + token=$tokens[1] + tokens[1]=() + if (( $+galiases[$token] )); then + (( $aln[(eI)p$token] )) && break + s=$galiases[$token] + n=p$token + elif (( e )); then + break + elif (( $+aliases[$token] )); then + (( $aln[(eI)p$token] )) && break + s=$aliases[$token] + n=p$token + elif [[ $token == ?*.?* ]] && (( $+saliases[${token##*.}] )); then + r=${token##*.} + (( $aln[(eI)s$r] )) && break + s=${saliases[$r]%% #} + n=s$r + else + break + fi + aln+=$n + alp+=$#tokens + [[ $s == *' ' ]] && alf+=$#tokens + (( ic )) && tokens[1,0]=(${(Z+C+)s}) || tokens[1,0]=(${(z)s}) + done + + case $token in + '<<'(|-)) + state=h + continue + ;; + *('`'|['<>=$']'(')*) + if [[ $token == ('`'[^'`']##'`'|'"`'[^'`']##'`"'|'$('[^')']##')'|'"$('[^')']##')"'|['<>=']'('[^')']##')') ]]; then + s=${${token##('"'|)(['$<>']|)?}%%?('"'|)} + (( ic )) && tokens+=(';' ${(Z+C+)s}) || tokens+=(';' ${(z)s}) + fi + ;; + esac + + case $state in + *r) + state[-1]= + continue + ;; + a) + if [[ $token == $skip ]]; then + if [[ $token == '{' ]]; then + P9K_COMMANDS+=$cmd + cmd= + state= + else + skip='{' + fi + continue + else + state=t + fi + ;& # fall through + t|p*) + if (( $+__p9k_pb_term[$token] )); then + if [[ $token == '()' ]]; then + state= + else + P9K_COMMANDS+=$cmd + if [[ $token == '}' ]]; then + state=a + skip=always + else + skip=$__p9k_pb_term_skip[$token] + state=${skip:+s} + fi + fi + cmd= + continue + elif [[ $state == t ]]; then + continue + elif [[ $state == *x ]]; then + if (( $+__p9k_pb_redirect[$token] )); then + prev= + state[-1]=r + continue + else + state[-1]= + fi + fi + ;; + s) + if [[ $token == $~skip ]]; then + state= + fi + continue + ;; + h) + while (( $#tokens )); do + (( e = ${tokens[(i)${(Q)token}]} )) + if [[ $tokens[e-1] == ';' && $tokens[e+1] == ';' ]]; then + tokens[1,e]=() + break + else + tokens[1,e]=() + fi + done + while (( $#alp && alp[-1] >= $#tokens )); do + aln[-1]=() + alp[-1]=() + done + state=t + continue + ;; + esac + + if (( $+__p9k_pb_redirect[${token#<0-255>}] )); then + state+=r + continue + fi + + if [[ $token == *'$'* ]]; then + if [[ $token == $~var ]]; then + n=${${token##[^[:IDENT:]]}%%[^[:IDENT:]]} + [[ $token == *'"' ]] && v=("${(P)n}") || v=(${(P)n}) + tokens[1,0]=(${(@qq)v}) + continue + fi + fi + + case $state in + '') + if (( $+__p9k_pb_cmd_skip[$token] )); then + skip=$__p9k_pb_cmd_skip[$token] + [[ $token == '}' ]] && state=a || state=${skip:+s} + continue + fi + if [[ $token == *=* ]]; then + v=${(S)token/#(<->|([[:alpha:]_][[:IDENT:]]#(|'['*[^\\](\\\\)#']')))(|'+')=} + if (( $#v < $#token )); then + if [[ $v == '(' ]]; then + state=s + skip='\)' + fi + continue + fi + fi + : ${token::=${(Q)${~token}}} + ;; + p2) + if [[ -n $prev ]]; then + prev= + else + : ${token::=${(Q)${~token}}} + if [[ $token == '{'$~id'}' ]]; then + state=p2x + prev=$token + else + state=p + fi + continue + fi + ;& # fall through + p) + if [[ -n $prev ]]; then + token=$prev + prev= + else + : ${token::=${(Q)${~token}}} + case $token in + '{'$~id'}') prev=$token; state=px; continue;; + [^-]*) ;; + --) state=p1; continue;; + $~skip) state=p2; continue;; + *) continue;; + esac + fi + ;; + p1) + if [[ -n $prev ]]; then + token=$prev + prev= + else + : ${token::=${(Q)${~token}}} + if [[ $token == '{'$~id'}' ]]; then + state=p1x + prev=$token + continue + fi + fi + ;; + esac + + if (( $+__p9k_pb_precommand[$token] )); then + prev= + state=p + skip=$__p9k_pb_precommand[$token] + cmd+=$token$'\0' + else + state=t + [[ $token == ('(('*'))'|'`'*'`'|'$'*|['<>=']'('*')'|*$'\0'*) ]] || cmd+=$token$'\0' + fi + done + } always { + [[ $state == (px|p1x) ]] && cmd+=$prev + P9K_COMMANDS+=$cmd + P9K_COMMANDS=(${(u)P9K_COMMANDS%$'\0'}) + } +} diff --git a/src/powerlevel10k/internal/parser.zsh.zwc b/src/powerlevel10k/internal/parser.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..f379cc6785c94238958de2b00d09d6a6f1fca136 GIT binary patch literal 17512 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 b;Z?j%2QI%ea`~MRy*y^$_4&2 + return 1 +fi + +local -i in_z4h_wizard=0 +[[ $force == 0 && $+functions[z4h] == 1 && -n $Z4H && -e $Z4H/welcome ]] && in_z4h_wizard=1 + +local -i success=0 + +local -ri force + +local -r font_base_url='https://github.com/romkatv/powerlevel10k-media/raw/master' + +local -ri prompt_indent=2 + +local -rA pure_original=(grey 242 red 1 yellow 3 blue 4 magenta 5 cyan 6 white 7) +local -rA pure_snazzy=(grey 242 red '#FF5C57' yellow '#F3F99D' blue '#57C7FF' magenta '#FF6AC1' cyan '#9AEDFE' white '#F1F1F0') +local -ra bg_color=(240 238 236 234) +local -ra sep_color=(248 246 244 242) +local -ra prefix_color=(250 248 246 244) + +local -r left_circle='\uE0B6' +local -r right_circle='\uE0B4' +local -r left_arc='\uE0B7' +local -r right_arc='\uE0B5' +local -r left_triangle='\uE0B2' +local -r right_triangle='\uE0B0' +local -r left_angle='\uE0B3' +local -r right_angle='\uE0B1' +local -r fade_in='โ–‘โ–’โ–“' +local -r fade_out='โ–“โ–’โ–‘' +local -r vertical_bar='\u2502' + +local -r cursor='%1{\e[07m \e[27m%}' + +local -r time_24h='16:23:42' +local -r time_12h='04:23:42 PM' + +local -ra lean_left=( + '%$frame_color[$color]Fโ•ญโ”€ ' '${extra_icons[1]:+%f$extra_icons[1] }%31F$extra_icons[2]%B%39F~%b%31F/%B%39Fsrc%b%f $prefixes[1]%76F$extra_icons[3]master%f ' + '%$frame_color[$color]Fโ•ฐโ”€' '%76F$prompt_char%f ${buffer:-$cursor}' +) + +local -ra lean_right=( + ' $prefixes[2]%101F$extra_icons[4]5s%f${time:+ $prefixes[3]%66F$extra_icons[5]$time%f}' ' %$frame_color[$color]Fโ”€โ•ฎ%f' + '' ' %$frame_color[$color]Fโ”€โ•ฏ%f' +) + +local -ra lean_8colors_left=( + '%$frame_color[$color]Fโ•ญโ”€ ' '${extra_icons[1]:+%f$extra_icons[1] }%4F$extra_icons[2]%4F~/src%f $prefixes[1]%2F$extra_icons[3]master%f ' + '%$frame_color[$color]Fโ•ฐโ”€' '%2F$prompt_char%f ${buffer:-$cursor}' +) + +local -ra lean_8colors_right=( + ' $prefixes[2]%3F$extra_icons[4]5s%f${time:+ $prefixes[3]%6F$extra_icons[5]$time%f}' ' %$frame_color[$color]Fโ”€โ•ฎ%f' + '' ' %$frame_color[$color]Fโ”€โ•ฏ%f' +) + +local -ra classic_left=( + '%$frame_color[$color]Fโ•ญโ”€' '%F{$bg_color[$color]}$left_tail%K{$bg_color[$color]} ${extra_icons[1]:+%255F$extra_icons[1] %$sep_color[$color]F$left_subsep%f }%31F$extra_icons[2]%B%39F~%b%K{$bg_color[$color]}%31F/%B%39Fsrc%b%K{$bg_color[$color]} %$sep_color[$color]F$left_subsep%f %$prefix_color[$color]F$prefixes[1]%76F$extra_icons[3]master %k%$bg_color[$color]F$left_head%f' + '%$frame_color[$color]Fโ•ฐโ”€' '%f ${buffer:-$cursor}' +) + +local -ra classic_right=( + '%$bg_color[$color]F$right_head%K{$bg_color[$color]}%f %$prefix_color[$color]F$prefixes[2]%101F5s $extra_icons[4]${time:+%$sep_color[$color]F$right_subsep %$prefix_color[$color]F$prefixes[3]%66F$time $extra_icons[5]}%k%F{$bg_color[$color]}$right_tail%f' '%$frame_color[$color]Fโ”€โ•ฎ%f' + '' '%$frame_color[$color]Fโ”€โ•ฏ%f' +) + +local -ra pure_left=( + '' '%F{$pure_color[blue]}~/src%f %F{$pure_color[grey]}master%f ${pure_use_rprompt-%F{$pure_color[yellow]\}5s%f }' + '' '%F{$pure_color[magenta]}$prompt_char%f ${buffer:-$cursor}' +) + +local -ra pure_right=( + '${pure_use_rprompt+%F{$pure_color[yellow]\}5s%f${time:+ }}${time:+%F{$pure_color[grey]\}$time%f}' '' + '' '' +) + +local -ra rainbow_left=( + '%$frame_color[$color]Fโ•ญโ”€' '%F{${${extra_icons[1]:+7}:-4}}$left_tail${extra_icons[1]:+%K{7\}%232F $extra_icons[1] %K{4\}%7F$left_sep}%K{4}%254F $extra_icons[2]%B%255F~%b%K{4}%254F/%B%255Fsrc%b%K{4} %K{2}%4F$left_sep %0F$prefixes[1]$extra_icons[3]master %k%2F$left_head%f' + '%$frame_color[$color]Fโ•ฐโ”€' '%f ${buffer:-$cursor}' +) + +local -ra rainbow_right=( + '%3F$right_head%K{3} %0F$prefixes[2]5s $extra_icons[4]%3F${time:+%7F$right_sep%K{7\} %0F$prefixes[3]$time $extra_icons[5]%7F}%k$right_tail%f' '%$frame_color[$color]Fโ”€โ•ฎ%f' + '' '%$frame_color[$color]Fโ”€โ•ฏ%f' +) + +function prompt_length() { + local -i COLUMNS=1024 + local -i x y=$#1 m + if (( y )); then + while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do + x=y + (( y *= 2 )) + done + while (( y > x + 1 )); do + (( m = x + (y - x) / 2 )) + (( ${${(%):-$1%$m(l.x.y)}[-1]} = m )) + done + fi + typeset -g REPLY=$x +} + +function print_prompt() { + [[ $parameters[extra_icons] == scalar* ]] && eval "local -a extra_icons=$extra_icons" + [[ $parameters[pure_color] == scalar* ]] && eval "local -A pure_color=$pure_color" + [[ $parameters[prefixes] == scalar* ]] && eval "local -a prefixes=$prefixes" + + local left=${style}_left + local right=${style}_right + left=("${(@P)left}") + right=("${(@P)right}") + (( disable_rprompt )) && right=() + eval "left=(${(@)left:/(#b)(*)/\"$match[1]\"})" + eval "right=(${(@)right:/(#b)(*)/\"$match[1]\"})" + if (( num_lines == 1)); then + left=($left[2] $left[4]) + right=($right[1] $right[3]) + else + local c=76 + [[ $style == pure ]] && c=$pure_color[magenta] + [[ $style == lean_8colors ]] && c=2 + (( left_frame )) || left=('' $left[2] '' "%F{$c}$prompt_char%f ${buffer:-$cursor}") + (( right_frame )) || right=($right[1] '' '' '') + fi + local -i left_indent=prompt_indent + local -i right_indent=prompt_indent + prompt_length ${(g::):-$left[1]$left[2]$right[1]$right[2]} + local -i width=REPLY + while (( wizard_columns - width <= left_indent + right_indent )); do + if (( right_indent )); then + (( --right_indent )) + elif (( left_indent )); then + (( --left_indent )) + else + print -P ' [%3Fnot enough horizontal space to display this%f]' + return 0 + fi + done + local -i i + for ((i = 1; i < $#left; i+=2)); do + local l=${(g::):-$left[i]$left[i+1]} + local r=${(g::):-$right[i]$right[i+1]} + prompt_length $l$r + local -i gap=$((wizard_columns - left_indent - right_indent - REPLY)) + (( num_lines == 2 && i == 1 )) && local fill=$gap_char || local fill=' ' + print -n -- ${(pl:$left_indent:: :)} + print -nP -- $l + print -nP -- "%$frame_color[$color]F${(pl:$gap::$fill:)}%f" + print -P -- $r + done +} + +function href() { + local url=${${1//\%/%%}//\\/\\\\} + if (( _p9k_term_has_href )); then + print -r -- '%{\e]8;;'$url'\a%}'$url'%{\e]8;;\a%}' + else + print -r -- $url + fi +} + +function flowing() { + (( ${wizard_columns:-0} )) || local -i wizard_columns=COLUMNS + local opt + local -i centered indentation + while getopts 'ci:' opt; do + case $opt in + i) indentation=$OPTARG;; + c) centered=1;; + +c) centered=0;; + \?) exit 1;; + esac + done + shift $((OPTIND-1)) + local line word lines=() + for word in "$@"; do + prompt_length ${(g::):-"$line $word"} + if (( REPLY > wizard_columns )); then + [[ -z $line ]] || lines+=$line + line= + fi + if [[ -n $line ]]; then + line+=' ' + elif (( $#lines )); then + line=${(pl:$indentation:: :)} + fi + line+=$word + done + [[ -z $line ]] || lines+=$line + for line in $lines; do + prompt_length ${(g::)line} + (( centered && REPLY < wizard_columns )) && print -n -- ${(pl:$(((wizard_columns - REPLY) / 2)):: :)} + print -P -- $line + done +} + +function clear() { + if (( $+commands[clear] )) && command clear 2>/dev/null; then + return + fi + echoti clear 2>/dev/null + print -n -- "\e[H\e[2J\e[3J" +} + +function hide_cursor() { + (( $+terminfo[cnorm] )) || return + echoti civis 2>/dev/null +} + +function show_cursor() { + local cnorm=${terminfo[cnorm]-} + if [[ $cnorm == *$'\e[?25h'(|'\e'*) ]]; then + print -n '\e[?25h' + else + print -n $cnorm + fi +} + +function consume_input() { + local key + while true; do + [[ -t 2 ]] + read -t0 -k key || break + done 2>/dev/null +} + +function quit() { + consume_input + if [[ $1 == '-c' ]]; then + print -Pr -- '' + print -Pr -- '%b%k%f%u%s' + print -Pr -- '%F{3}--- stack trace (most recent call first) ---%f' + print -lr -- $funcfiletrace + print -Pr -- '%F{3}--- end of stack trace ---%f' + print -Pr -- '' + print -Pr -- 'Press %BENTER%b to continue.' + hide_cursor + read -s + fi + restore_screen + print + if (( force )); then + flowing Powerlevel10k configuration wizard has been aborted. To run it again, type: + print -P "" + print -P " %2Fp10k%f %Bconfigure%b" + print -P "" + else + flowing \ + Powerlevel10k configuration wizard has been aborted. It will run again \ + next time unless you define at least one Powerlevel10k configuration option. \ + To define an option that does nothing except for disabling Powerlevel10k \ + configuration wizard, type the following command: + print -P "" + print -P " %2Fecho%f %3F'POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true'%f >>! $__p9k_zshrc_u" + print -P "" + flowing To run Powerlevel10k configuration wizard right now, type: + print -P "" + print -P " %2Fp10k%f %Bconfigure%b" + print -P "" + fi + function quit() {} + stty echo 2>/dev/null + show_cursor + exit 1 +} + +local screen_widgets=() +local -i max_priority +local -i prompt_idx +local choice + +function add_widget() { + local priority=$1 + shift + local render="${(j: :)${(@q)*}}" + screen_widgets+=("$priority" "$render") + (( priority <= max_priority )) || max_priority=priority +} + +function render_screen_pass() { + local -i pass=$1 + local -i prev_pass cur_pass + local prev_render cur_render + for cur_pass cur_render in "${(@)screen_widgets}" 0 ''; do + if (( prev_pass <= pass && (cur_pass == 0 || cur_pass > pass) )); then + eval $prev_render + fi + prev_pass=cur_pass + prev_render=$cur_render + done +} + +function get_columns() { return 'COLUMNS > 88 ? 88 : COLUMNS' } +functions -M get_columns 0 0 + +function render_screen() { + { + hide_cursor + while true; do + while true; do + typeset -gi wizard_columns='get_columns()' + typeset -gi wizard_lines=LINES + if (( wizard_columns < __p9k_wizard_columns )); then + clear + flowing -c %1FNot enough horizontal space.%f + print + flowing Make terminal window %Bwider%b or press %BCtrl-C%b to abort Powerlevel10k configuration wizard. + elif (( wizard_lines < __p9k_wizard_lines )); then + clear + flowing -c %1FNot enough vertical space.%f + print + flowing Make terminal window %Btaller%b or press %BCtrl-C%b to abort Powerlevel10k configuration wizard. + else + break + fi + while (( get_columns() == wizard_columns && LINES == wizard_lines )); do + sleep 1 + done + done + + local -a passes + () { + local -i pass + local render + for pass render in "${(@)screen_widgets}"; do + passes+=$pass + done + passes=(${(onu)passes}) + } + + local -i pass + for pass in $passes; do + local content="$(render_screen_pass $pass)" + local lines=("${(@f)content}") + (( $#lines > wizard_lines )) && continue + clear + print -rn -- $content + return 0 + done + + clear + flowing -c %1FNot enough vertical space.%f + print + flowing Make terminal window %Btaller%b or press %BCtrl-C%b to abort Powerlevel10k configuration wizard. + while (( get_columns() == wizard_columns && LINES == wizard_lines )); do + sleep 1 + done + done + } always { + show_cursor + } +} + +function add_prompt_n() { + add_widget 0 "$@" print_prompt + local var + for var; do + eval "local ${(q)var}" + done + if (( num_lines == 2 )); then + add_widget $(( 100 - ++prompt_idx )) print -P ' [%3Fnot enough vertical space to display this%f]' + fi +} + +function add_prompt() { + add_widget 0 print + add_widget 1 + add_prompt_n "$@" + add_widget 0 print + add_widget 2 +} + +function ask() { + local choices=$1 + local -i lines columns wizard_lines wizard_columns + add_widget 0 print -P "(q) Quit and do nothing." + add_widget 0 print + add_widget $((max_priority + 1)) + add_widget 0 print -P "%BChoice [${choices}q]: %b" + while true; do + =true + if (( LINES != lines || get_columns() != columns )); then + render_screen + lines=wizard_lines + columns=wizard_columns + fi + typeset -g choice= + if read -t1 -k choice; then + choice=${(L)choice} + if [[ $choice == q ]]; then + quit + fi + if [[ $choices == *$choice* ]]; then + screen_widgets=() + max_priority=0 + prompt_idx=0 + return + fi + fi + done +} + +local -i greeting_printed=0 + +function print_greeting() { + (( greeting_printed )) && return + if (( in_z4h_wizard )); then + flowing -c %3FZsh for Humans%f uses %4FPowerlevel10k%f to print command \ + line prompt. This wizard will ask you a few questions and configure \ + prompt for you. + elif (( force )); then + flowing -c This is %4FPowerlevel10k configuration wizard%f. \ + It will ask you a few questions and configure your prompt. + else + flowing -c This is %4FPowerlevel10k configuration wizard%f. \ + You are seeing it because you haven\'t defined any \ + Powerlevel10k configuration options. It will ask \ + you a few questions and configure your prompt. + fi + print -P "" +} + +function iterm_get() { + /usr/libexec/PlistBuddy -c "Print :$1" ~/Library/Preferences/com.googlecode.iterm2.plist +} + +local terminal iterm2_font_size iterm2_old_font=0 can_install_font=0 + +() { + [[ $P9K_SSH == 0 ]] || return + if [[ "$(uname)" == Linux && "$(uname -o)" == Android ]]; then + (( $+commands[termux-reload-settings] )) || return + (( $+commands[curl] )) || return + if [[ -f ~/.termux/font.ttf ]]; then + [[ -r ~/.termux/font.ttf ]] || return + [[ -w ~/.termux/font.ttf ]] || return + ! grep -q 'MesloLGS NF' ~/.termux/font.ttf 2>/dev/null || return + fi + if [[ -f ~/.termux ]]; then + [[ -d ~/.termux && -w ~/.termux ]] || return + else + [[ -w ~ ]] || return + fi + terminal=Termux + return 0 + fi + if [[ "$(uname)" == Darwin && $TERM_PROGRAM == iTerm.app ]]; then + (( $+commands[curl] )) || return + [[ $TERM_PROGRAM_VERSION == [2-9]* ]] || return + if [[ -f ~/Library/Fonts ]]; then + [[ -d ~/Library/Fonts && -w ~/Library/Fonts ]] || return + else + [[ -d ~/Library && -w ~/Library ]] || return + fi + [[ -x /usr/libexec/PlistBuddy ]] || return + [[ -x /usr/bin/plutil ]] || return + [[ -x /usr/bin/defaults ]] || return + [[ -f ~/Library/Preferences/com.googlecode.iterm2.plist ]] || return + [[ -r ~/Library/Preferences/com.googlecode.iterm2.plist ]] || return + [[ -w ~/Library/Preferences/com.googlecode.iterm2.plist ]] || return + local guid1 && guid1="$(iterm_get '"Default Bookmark Guid"' 2>/dev/null)" || return + local guid2 && guid2="$(iterm_get '"New Bookmarks":0:"Guid"' 2>/dev/null)" || return + local font && font="$(iterm_get '"New Bookmarks":0:"Normal Font"' 2>/dev/null)" || return + [[ $guid1 == $guid2 ]] || return + [[ $font != 'MesloLGS-NF-Regular '<-> ]] || return + [[ $font == (#b)*' '(<->) ]] || return + [[ $font == 'MesloLGSNer-Regular '<-> ]] && iterm2_old_font=1 + iterm2_font_size=$match[1] + terminal=iTerm2 + return 0 + fi + return 1 +} && can_install_font=1 + +function run_command() { + local msg=$1 + shift + [[ -n $msg ]] && print -nP -- "$msg ..." + local err && err="$("$@" 2>&1)" || { + print -P " %1FERROR%f" + print -P "" + print -nP "%BCommand:%b " + print -r -- "${(@q)*}" + if [[ -n $err ]]; then + print -P "" + print -r -- $err + fi + quit -c + } + [[ -n $msg ]] && print -P " %2FOK%f" +} + +function install_font() { + clear + case $terminal in + Termux) + command mkdir -p -- ~/.termux || quit -c + run_command "Downloading %BMesloLGS NF Regular.ttf%b" \ + curl -fsSL -o ~/.termux/font.ttf "$font_base_url/MesloLGS%20NF%20Regular.ttf" + run_command "Reloading %BTermux%b settings" termux-reload-settings + ;; + iTerm2) + command mkdir -p -- ~/Library/Fonts || quit -c + local style + for style in Regular Bold Italic 'Bold Italic'; do + local file="MesloLGS NF ${style}.ttf" + run_command "Downloading %B$file%b" \ + curl -fsSL -o ~/Library/Fonts/$file.tmp "$font_base_url/${file// /%20}" + command mv -f -- ~/Library/Fonts/$file{.tmp,} || quit -c + done + print -nP -- "Changing %BiTerm2%b settings ..." + local size=$iterm2_font_size + [[ $size == 12 ]] && size=13 + local k t v settings=( + '"Normal Font"' string '"MesloLGS-NF-Regular '$size'"' + '"Terminal Type"' string '"xterm-256color"' + '"Horizontal Spacing"' real 1 + '"Vertical Spacing"' real 1 + '"Minimum Contrast"' real 0 + '"Use Bold Font"' bool 1 + '"Use Bright Bold"' bool 1 + '"Use Italic Font"' bool 1 + '"ASCII Anti Aliased"' bool 1 + '"Non-ASCII Anti Aliased"' bool 1 + '"Use Non-ASCII Font"' bool 0 + '"Ambiguous Double Width"' bool 0 + '"Draw Powerline Glyphs"' bool 1 + '"Only The Default BG Color Uses Transparency"' bool 1 + ) + for k t v in $settings; do + /usr/libexec/PlistBuddy -c "Set :\"New Bookmarks\":0:$k $v" \ + ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null && continue + run_command "" /usr/libexec/PlistBuddy -c \ + "Add :\"New Bookmarks\":0:$k $t $v" ~/Library/Preferences/com.googlecode.iterm2.plist + done + print -P " %2FOK%f" + print -nP "Updating %BiTerm2%b settings cache ..." + run_command "" /usr/bin/defaults read com.googlecode.iterm2 + sleep 3 + print -P " %2FOK%f" + sleep 1 + clear + hide_cursor + print + flowing +c "%2FMeslo Nerd Font%f" successfully installed. + print -P "" + () { + local out + out=$(/usr/bin/defaults read 'Apple Global Domain' NSQuitAlwaysKeepsWindows 2>/dev/null) || return + [[ $out == 1 ]] || return + out="$(iterm_get OpenNoWindowsAtStartup 2>/dev/null)" || return + [[ $out == false ]] + } + if (( $? )); then + flowing +c Please "%Brestart iTerm2%b" for the changes to take effect. + print -P "" + flowing +c -i 5 " 1. Click" "%BiTerm2 โ†’ Quit iTerm2%b" or press "%BโŒ˜ Q%b." + flowing +c -i 5 " 2. Open %BiTerm2%b." + print -P "" + flowing +c "It's" important to "%Brestart iTerm2%b" by following the instructions above. \ + "It's" "%Bnot enough%b" to close iTerm2 by clicking on the red circle. You must \ + click "%BiTerm2 โ†’ Quit iTerm2%b" or press "%BโŒ˜ Q%b." + else + flowing +c Please "%Brestart your computer%b" for the changes to take effect. + fi + while true; do sleep 60 2>/dev/null; done + ;; + esac + + return 0 +} + +function ask_font() { + (( can_install_font )) || return 0 + add_widget 0 print_greeting + if (( iterm2_old_font )); then + add_widget 0 flowing -c A new version of '%2FMeslo Nerd Font%f' is available. '%BInstall?%b' + else + add_widget 0 flowing -c %BInstall '%b%2FMeslo Nerd Font%f%B?%b' + fi + add_widget 0 print + add_widget 0 print -P "%B(y) Yes (recommended).%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(n) No. Use the current font.%b" + add_widget 0 print + add_widget 1 + ask yn + greeting_printed=1 + case $choice in + y) + ask_remove_font || return + install_font + ;; + n) ;; + esac + return 0 +} + +function print_file_path() { + local file=$1 + if (( ${(m)#file} > wizard_columns - 2 )); then + file[wizard_columns-4,-1]='...' + fi + add_widget 0 print -P " %B${file//\%/%%}%b" +} + +function ask_remove_font() { + local font + local -a fonts + local -i protected + for font in {,/System,~}/Library/Fonts/**/*[Mm]eslo*.(ttf|otf)(N:A); do + [[ -f $font && -r $font ]] || continue + [[ $font == ~/Library/Fonts/'MesloLGS NF '(Regular|Bold|Italic|Bold\ Italic).ttf ]] && continue + [[ "$(<$font)" == *"MesloLGS NF"$'\0'* ]] || continue + fonts+=$font + [[ -w ${font:h} ]] || protected=1 + done + (( $#fonts )) || return 0 + add_widget 0 flowing -c A variant of "%2FMeslo Nerd Font%f" is already installed. + add_widget 0 print -P "" + for font in $fonts; do + add_widget 0 print_file_path $font + done + add_widget 0 print -P "" + if (( protected )); then + if (( $#fonts == 1 )); then + add_widget 0 flowing Please %Bdelete%b this file and run '%2Fp10k%f %Bconfigure%b.' + else + add_widget 0 flowing Please %Bdelete%b these files and run '%2Fp10k%f %Bconfigure%b.' + fi + add_widget 0 print + restore_screen + local pass render + for pass render in "${(@)screen_widgets}"; do + (( pass == 0 )) && eval $render + done + exit 1 + fi + if (( $#fonts == 1 )); then + add_widget 0 flowing -c "%BDelete this file?%b" + else + add_widget 0 flowing -c "%BDelete these files?%b" + fi + add_widget 0 print -P "" + add_widget 0 print -P "%B(y) Yes (recommended).%b" + add_widget 0 print -P "" + add_widget 0 print -P "(r) Restart from the beginning." + ask yr + case $choice in + r) return 1;; + y) zf_rm -f -- $fonts || quit -c;; + esac + return 0 +} + +function ask_diamond() { + local extra + add_widget 0 print_greeting + add_widget 0 flowing -c %BDoes this look like a%b %2Fdiamond%f '%B(rotated square)?%b' + add_widget 0 flowing -c reference: "$(href https://graphemica.com/%E2%97%86)" + add_widget 0 print + add_widget 0 flowing -c -- "---> \uE0B2\uE0B0 <---" + add_widget 0 print + add_widget 3 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print + add_widget 2 + if (( can_install_font )); then + extra+=r + add_widget 0 print -P "(r) Restart from the beginning." + fi + ask yn$extra + greeting_printed=1 + case $choice in + r) return 1;; + y) cap_diamond=1;; + n) cap_diamond=0;; + esac + return 0 +} + +function ask_lock() { + [[ -n $2 ]] && add_widget 0 flowing -c "$2" + add_widget 0 flowing -c "%BDoes this look like a %b%2Flock%f%B?%b" + add_widget 0 flowing -c "reference: $(href https://fontawesome.com/icons/lock)" + add_widget 0 print + add_widget 0 flowing -c -- "---> $1 <---" + add_widget 0 print + add_widget 3 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) cap_lock=1;; + n) cap_lock=0;; + esac + return 0 +} + +function ask_python() { + add_widget 0 flowing -c %BDoes this look like a "%b%2FPython logo%f%B?%b" + add_widget 0 flowing -c reference: "$(href https://fontawesome.com/icons/python)" + add_widget 0 print -P "" + add_widget 0 flowing -c -- "---> \uE63C <---" + add_widget 0 print -P "" + add_widget 3 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print -P "" + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) cap_python=1;; + n) cap_python=0;; + esac + return 0 +} + +function ask_quotes() { + add_widget 0 flowing -c %BDoes this look like%b "%2F><%f" %Bbut taller and "fatter?%b" + add_widget 0 print -P "" + add_widget 0 flowing -c -- "---> \u276F\u276E <---" + add_widget 0 print -P "" + add_widget 3 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print -P "" + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) cap_quotes=1;; + n) cap_quotes=0;; + esac + return 0 +} + +function ask_arrow() { + # This condition holds as long as zsh is compiled with unicode 9 support. + if (( ${(m)#${(g::)1}} != 1 )); then + cap_arrow=0 + return + fi + [[ -n $2 ]] && add_widget 0 flowing -c "$2" + add_widget 0 flowing -c %BDoes this look like an%b "%2Fupwards arrow%f%B?%b" + add_widget 0 flowing -c reference: "$(href https://graphemica.com/%F0%9F%A0%89)" + add_widget 0 print -P "" + add_widget 0 flowing -c -- "---> $1 <---" + add_widget 0 print -P "" + add_widget 3 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print -P "" + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) cap_arrow=1;; + n) cap_arrow=0;; + esac + return 0 +} + +function print_indented() { + local -i max_width=$1 + local text=$2 + local -i indent='(wizard_columns - max_width) / 2' + print -P "${(l:$indent:: :)}$text" +} + +function ask_width() { + add_widget 0 flowing -c %BWhat digit is the%b "%2Fdownwards arrow%f" %Bpointing "at?%b" + add_widget 0 print -P "" + add_widget 0 print_indented 11 '%3F\UF0734%f %3F\UF0734%f %3F\UF0734%f %2F\UF072E%f' + add_widget 0 print_indented 11 ' 111222' + add_widget 0 print -P "" + add_widget 3 + add_widget 0 print -P "%B(1) It is pointing at '1'.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(2) It is pointing at '2'.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(3) Something else.%b" + add_widget 0 print -P "" + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask 123r + case $choice in + r) return 1;; + 1) cap_arrow=1;; + 2|3) cap_arrow=0;; + esac + return 0 +} + +function ask_icon_padding() { + if [[ $POWERLEVEL9K_MODE == (powerline|compatible|ascii) ]]; then + POWERLEVEL9K_ICON_PADDING=none + return 0 + fi + + local text="X" + text+="%1F${icons[VCS_GIT_ICON]// }%fX" + text+="%2F${icons[VCS_GIT_GITHUB_ICON]// }%fX" + text+="%3F${icons[TIME_ICON]// }%fX" + text+="%4F${icons[RUBY_ICON]// }%fX" + text+="%5F${icons[HOME_ICON]// }%fX" + text+="%6F${icons[HOME_SUB_ICON]// }%fX" + text+="%1F${icons[FOLDER_ICON]// }%fX" + text+="%2F${icons[RAM_ICON]// }%fX" + + add_widget 0 flowing -c %BDo all these icons "%b%2Ffit between the crosses%f%B?%b" + add_widget 0 print -P "" + add_widget 0 flowing -c -- "---> $text <---" + add_widget 0 print -P "" + add_widget 3 + add_widget 0 flowing +c -i 5 "%B(y) Yes." Icons are very close to the crosses but there is "%b%2Fno overlap%f%B.%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 flowing +c -i 5 "%B(n) No." Some icons "%b%2Foverlap%f%B" neighbouring crosses.%b + add_widget 0 print -P "" + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) + POWERLEVEL9K_ICON_PADDING=none + options+='small icons' + ;; + n) + POWERLEVEL9K_ICON_PADDING=moderate + options+='large icons' + up_triangle+=' ' + down_triangle+=' ' + slanted_bar='\uE0BD ' + ;; + esac + return 0 +} + +function ask_style() { + if (( terminfo[colors] < 256 )); then + style=lean_8colors + left_frame=0 + right_frame=0 + frame_color=(0 7 2 4) + color_name=(Black White Green Blue) + options+=lean_8colors + return 0 + fi + local extra + add_widget 0 flowing -c "%BPrompt Style%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(1) Lean.%b" + add_prompt style=lean left_frame=0 right_frame=0 + add_widget 0 print -P "%B(2) Classic.%b" + add_prompt style=classic + add_widget 0 print -P "%B(3) Rainbow.%b" + add_prompt style=rainbow + if [[ $POWERLEVEL9K_MODE != ascii ]]; then + extra+=4 + add_widget 0 print -P "%B(4) Pure.%b" + add_prompt style=pure + fi + add_widget 0 print -P "(r) Restart from the beginning." + ask 123${extra}r + case $choice in + r) return 1;; + 1) style=lean; left_frame=0; right_frame=0; options+=lean;; + 2) style=classic; options+=classic;; + 3) style=rainbow; options+=rainbow;; + 4) style=pure; empty_line=1; options+=pure;; + esac + return 0 +} + +function ask_charset() { + [[ $style == (lean*|classic|rainbow) && $POWERLEVEL9K_MODE != ascii ]] || return 0 + add_widget 0 flowing -c "%BCharacter Set%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(1) Unicode.%b" + add_prompt + add_widget 0 print -P "%B(2) ASCII.%b" + add_prompt \ + left_sep= \ + right_sep= \ + left_subsep='|' \ + right_subsep='|' \ + left_head= \ + right_head= \ + prompt_char='>' \ + left_frame=0 \ + right_frame=0 + add_widget 0 print -P "(r) Restart from the beginning." + ask 12r + case $choice in + r) return 1;; + 1) options+=unicode;; + 2) + options+=ascii + left_sep= + right_sep= + left_subsep='|' + right_subsep='|' + left_head= + right_head= + prompt_char='>' + left_frame=0 + right_frame=0 + POWERLEVEL9K_MODE=ascii + POWERLEVEL9K_ICON_PADDING=none + cap_diamond=0 + cap_python=0 + cap_arrow=0 + cap_lock=0 + cap_quotes=0 + ;; + esac + return 0 +} + +function ask_color_scheme() { + (( terminfo[colors] < 256 )) && return + if [[ $style == lean ]]; then + add_widget 0 flowing -c "%BPrompt Colors%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(1) 256 colors.%b" + add_prompt style=lean + add_widget 0 print -P "%B(2) 8 colors.%b" + add_prompt style=lean_8colors + add_widget 0 print -P "(r) Restart from the beginning." + ask 12r + case $choice in + r) return 1;; + 1) style=lean;; + 2) + style=lean_8colors + frame_color=(0 7 2 4) + color_name=(Black White Green Blue) + ;; + esac + options=(${options:#lean} $style) + elif [[ $style == pure && $has_truecolor == 1 ]]; then + add_widget 0 flowing -c "%BPrompt Colors%b" + add_widget 0 print -P "" + add_widget 1 + add_widget 0 print -P "%B(1) Original.%b" + add_prompt "pure_color=(${(j: :)${(@q)${(@kv)pure_original}}})" + add_widget 0 print -P "%B(2) Snazzy.%b" + add_prompt "pure_color=(${(j: :)${(@q)${(@kv)pure_snazzy}}})" + add_widget 0 print -P "(r) Restart from the beginning." + ask 12r + case $choice in + r) return 1;; + 1) + pure_color=(${(kv)pure_original}) + options+=original + ;; + 2) + pure_color=(${(kv)pure_snazzy}) + options+=snazzy + ;; + esac + fi + return 0 +} + +function ask_color() { + [[ $style != classic ]] && return + add_widget 0 flowing -c "%BPrompt Color%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(1) $color_name[1].%b" + add_prompt color=1 + add_widget 0 print -P "%B(2) $color_name[2].%b" + add_prompt color=2 + add_widget 0 print -P "%B(3) $color_name[3].%b" + add_prompt color=3 + add_widget 0 print -P "%B(4) $color_name[4].%b" + add_prompt color=4 + add_widget 0 print -P "(r) Restart from the beginning." + ask 1234r + case $choice in + r) return 1;; + [1-4]) color=$choice;; + esac + options+=${${(L)color_name[color]}//ฤฑ/i} + return 0 +} + +function print_frame_marker() { + local label="(1) $color_name[1]." + local -i n='wizard_columns - 7' + local -i m=$((n - $#label)) + print -P "${(l:$n:: :)}frame" + print -P "%B$label%b${(l:$m:: :)} |" + print -P "${(l:$n:: :)} v" +} + +function ask_ornaments_color() { + [[ $style != (rainbow|lean*) || $num_lines == 1 ]] && return + [[ $gap_char == ' ' && $left_frame == 0 && $right_frame == 0 ]] && return + local ornaments=() + [[ $gap_char != ' ' ]] && ornaments+=Connection + (( left_frame || right_frame )) && ornaments+=Frame + add_widget 0 flowing -c "%B${(j: & :)ornaments} Color%b" + if (( left_frame || right_frame )); then + add_widget 0 print_frame_marker + add_widget 3 print -P "%B(1) $color_name[1].%b" + add_prompt_n color=1 + add_widget 0 print + add_widget 2 + else + add_widget 1 + add_widget 0 print -P "%B(1) $color_name[1].%b" + add_prompt color=1 + fi + add_widget 0 print -P "%B(2) $color_name[2].%b" + add_prompt color=2 + add_widget 0 print -P "%B(3) $color_name[3].%b" + add_prompt color=3 + add_widget 0 print -P "%B(4) $color_name[4].%b" + add_prompt color=4 + add_widget 0 print -P "(r) Restart from the beginning." + ask 1234r + case $choice in + r) return 1;; + [1-4]) color=$choice;; + esac + options+=${${(L)color_name[color]}//ฤฑ/i}-ornaments + return 0 +} + +function ask_time() { + local extra + add_widget 0 flowing -c "%BShow current time?%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(n) No.%b" + add_prompt time= + add_widget 0 print -P "%B(1) 12-hour format.%b" + add_prompt time=$time_12h + add_widget 0 print -P "%B(2) 24-hour format.%b" + add_prompt time=$time_24h + add_widget 0 print -P "(r) Restart from the beginning." + ask n12r + case $choice in + r) return 1;; + n) time=;; + 1) time=$time_12h; options+='12h time';; + 2) time=$time_24h; options+='24h time';; + esac + return 0 +} + +function ask_use_rprompt() { + [[ $style != pure ]] && return + add_widget 0 flowing -c "%BNon-permanent content location%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(1) Left.%b" + add_prompt + add_widget 0 print -P "%B(2) Right.%b" + add_prompt pure_use_rprompt= + add_widget 0 print -P "(r) Restart from the beginning." + ask 12r + case $choice in + r) return 1;; + 1) ;; + 2) pure_use_rprompt=; options+=rprompt;; + esac + return 0 +} + +function os_icon_name() { + local uname="$(uname)" + if [[ $uname == Linux && "$(uname -o 2>/dev/null)" == Android ]]; then + echo ANDROID_ICON + else + case $uname in + SunOS) echo SUNOS_ICON;; + Darwin) echo APPLE_ICON;; + CYGWIN_NT-*|MSYS_NT-*|MINGW64_NT-*|MINGW32_NT-*) echo WINDOWS_ICON;; + FreeBSD|OpenBSD|DragonFly) echo FREEBSD_ICON;; + Linux) + local os_release_id + if [[ -r /etc/os-release ]]; then + local lines=(${(f)"$(*|<6->.*) ]]; then + instant_prompt=off + options+=instant_prompt=auto-off + return 0 + fi + if (( $+functions[z4h] )); then + instant_prompt=quiet + options+=instant_prompt=auto-quiet + return + fi + add_widget 0 flowing -c "%BInstant Prompt Mode%b" + add_widget 0 print_instant_prompt_link + add_widget 1 + add_widget 0 print + add_widget 2 + add_widget 0 flowing +c -i 5 "%B(1) Verbose (recommended).%b" + add_widget 0 print + add_widget 1 + add_widget 0 flowing +c -i 5 "%B(2) Quiet.%b" Choose this if you\'ve read and understood \ + instant prompt documentation. + add_widget 0 print + add_widget 1 + add_widget 0 flowing +c -i 5 "%B(3) Off.%b" Choose this if you\'ve tried instant prompt \ + and found it incompatible with your zsh configuration files. + add_widget 0 print + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask 123r + case $choice in + r) return 1;; + 1) instant_prompt=verbose; options+=instant_prompt=verbose;; + 2) instant_prompt=quiet; options+=instant_prompt=quiet;; + 3) instant_prompt=off; options+=instant_prompt=off;; + esac + return 0 +} + +function ask_transient_prompt() { + local disable_rprompt=$((num_lines == 1)) + local p=76 + [[ $style == pure ]] && p=$pure_color[magenta] + [[ $style == lean_8colors ]] && p=2 + p="%F{$p}$prompt_char%f" + add_widget 0 flowing -c "%BEnable Transient Prompt?%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print + add_widget 1 + add_widget 0 print -P "${(pl:$prompt_indent:: :)}$p %2Fgit%f pull" + add_widget 3 + add_widget 0 print -P "${(pl:$prompt_indent:: :)}$p %2Fgit%f branch x" + (( empty_line )) && add_widget 0 print + add_prompt_n buffer="%2Fgit%f checkout x$cursor" + add_widget 0 print + add_widget 2 + add_widget 0 print -P "%B(n) No.%b" + add_widget 0 print + add_widget 1 + add_widget 0 buffer="%2Fgit%f pull" print_prompt + add_widget 3 + (( empty_line )) && { add_widget 0 print; add_widget 3 } + add_prompt_n buffer="%2Fgit%f branch x" + (( empty_line )) && add_widget 0 print + add_prompt_n buffer="%2Fgit%f checkout x$cursor" + add_widget 0 print + add_widget 2 + add_widget 0 print -P "(r) Restart from the beginning." + ask ynr + case $choice in + r) return 1;; + y) transient_prompt=1; options+=transient_prompt;; + n) transient_prompt=0;; + esac + return 0 +} + +function ask_config_overwrite() { + config_backup= + config_backup_u=0 + if [[ ! -e $__p9k_cfg_path ]]; then + return 0 + fi + add_widget 0 flowing -c Powerlevel10k config file already exists. + add_widget 0 flowing -c "%BOverwrite" "%b%2F${__p9k_cfg_path_u//\\/\\\\}%f%B?%b" + add_widget 0 print -P "" + add_widget 0 print -P "%B(y) Yes.%b" + add_widget 0 print -P "" + add_widget 0 print -P "(r) Restart from the beginning." + ask yr + case $choice in + r) return 1;; + y) + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + local tmpdir_u='$TMPDIR' + else + local tmpdir=/tmp + local tmpdir_u=/tmp + fi + if (( ! $+commands[mktemp] )) || + ! config_backup=$(mktemp $tmpdir/$__p9k_cfg_basename.XXXXXXXXXX 2>/dev/null); then + config_backup=$tmpdir/$__p9k_cfg_basename.$EPOCHREALTIME + fi + cp $__p9k_cfg_path $config_backup || quit -c + config_backup_u=$tmpdir_u/${(q-)config_backup:t} + ;; + esac + return 0 +} + +function ask_zshrc_edit() { + zshrc_content= + zshrc_backup= + zshrc_backup_u= + zshrc_has_cfg=0 + zshrc_has_instant_prompt=0 + write_zshrc=0 + + if (( $+functions[z4h] )); then + zshrc_has_cfg=1 + zshrc_has_instant_prompt=1 + return + fi + + check_zshrc_integration || quit -c + [[ $instant_prompt == off ]] && zshrc_has_instant_prompt=1 + (( zshrc_has_cfg && zshrc_has_instant_prompt )) && return + + add_widget 0 flowing -c %BApply changes to "%b%2F${__p9k_zshrc_u//\\/\\\\}%f%B?%b" + add_widget 0 print -P "" + add_widget 1 + local modifiable=y + if [[ ! -w $__p9k_zd ]]; then + modifiable= + add_widget 0 flowing -c %3FWARNING:%f %2F${__p9k_zd_u//\\/\\\\}%f %3Fis readonly.%f + add_widget 0 print -P "" + elif [[ -e $__p9k_zshrc && ! -w $__p9k_zshrc ]]; then + local -a stat + zstat -A stat +uid -- $__p9k_zshrc || quit -c + if (( stat[1] == EUID )); then + add_widget 0 flowing -c %3FNOTE:%f %2F${__p9k_zshrc_u//\\/\\\\}%f %3Fis readonly.%f + else + modifiable= + add_widget 0 flowing -c \ + %3FWARNING:%f %2F${__p9k_zshrc_u//\\/\\\\}%f %3Fis readonly and \ + not owned by the user. Cannot modify it.%f + fi + add_widget 0 print -P "" + fi + if [[ $modifiable == y ]]; then + add_widget 0 print -P "%B(y) Yes (recommended).%b" + else + add_widget 0 print -P "%1F(y) Yes (disabled).%f" + fi + add_widget 0 print -P "" + add_widget 0 flowing +c -i 5 "%B(n) No." I know which changes to apply and will do it myself.%b + add_widget 0 print -P "" + add_widget 0 print -P "(r) Restart from the beginning." + ask ${modifiable}nr + case $choice in + r) return 1;; + n) return 0;; + y) + write_zshrc=1 + if [[ -n $zshrc_content ]]; then + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + local tmpdir_u='$TMPDIR' + else + local tmpdir=/tmp + local tmpdir_u=/tmp + fi + if (( ! $+commands[mktemp] )) || + ! zshrc_backup="$(mktemp $tmpdir/.zshrc.XXXXXXXXXX 2>/dev/null)"; then + zshrc_backup=$tmpdir/.zshrc.$EPOCHREALTIME + fi + cp -p $__p9k_zshrc $zshrc_backup || quit -c + local -i writable=1 + if [[ ! -w $zshrc_backup ]]; then + chmod u+w -- $zshrc_backup || quit -c + writable=0 + fi + print -r -- $zshrc_content >$zshrc_backup || quit -c + (( writable )) || chmod u-w -- $zshrc_backup || quit -c + zshrc_backup_u=$tmpdir_u/${(q-)zshrc_backup:t} + fi + ;; + esac + return 0 +} + +function generate_config() { + local base && base="$(<$__p9k_root_dir/config/p10k-${style//_/-}.zsh)" || return + local lines=("${(@f)base}") + + function sub() { + lines=("${(@)lines/#(#b)([[:space:]]#)typeset -g POWERLEVEL9K_$1=*/$match[1]typeset -g POWERLEVEL9K_$1=$2}") + } + + function uncomment() { + lines=("${(@)lines/#(#b)([[:space:]]#)\# $1( |)/$match[1]$1$match[2]$match[2]}") + } + + function rep() { + lines=("${(@)lines//$1/$2}") + } + + if [[ $style == pure ]]; then + rep "local grey=242" "local grey='$pure_color[grey]'" + rep "local red=1" "local red='$pure_color[red]'" + rep "local yellow=3" "local yellow='$pure_color[yellow]'" + rep "local blue=4" "local blue='$pure_color[blue]'" + rep "local magenta=5" "local magenta='$pure_color[magenta]'" + rep "local cyan=6" "local cyan='$pure_color[cyan]'" + rep "local white=7" "local white='$pure_color[white]'" + else + sub MODE $POWERLEVEL9K_MODE + + sub ICON_PADDING $POWERLEVEL9K_ICON_PADDING + + if [[ $POWERLEVEL9K_MODE == compatible ]]; then + sub STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION "'ั…'" + sub STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION "'ั…'" + sub STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION "'ั…'" + fi + + if [[ $POWERLEVEL9K_MODE == (compatible|powerline) ]]; then + uncomment 'typeset -g POWERLEVEL9K_LOCK_ICON' + sub LOCK_ICON "'โˆ…'" + uncomment 'typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION' + sub NORDVPN_VISUAL_IDENTIFIER_EXPANSION "'nord'" + uncomment 'typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION' + sub RANGER_VISUAL_IDENTIFIER_EXPANSION "'โ–ฒ'" + uncomment 'typeset -g POWERLEVEL9K_YAZI_VISUAL_IDENTIFIER_EXPANSION' + sub YAZI_VISUAL_IDENTIFIER_EXPANSION "'โ–ฒ'" + uncomment 'typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION' + sub KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION "'โ—‹'" + uncomment 'typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION' + sub AZURE_VISUAL_IDENTIFIER_EXPANSION "'az'" + uncomment 'typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION' + sub AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION "'eb'" + uncomment 'typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION' + sub BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION "'โ‰ก'" + fi + + if [[ $POWERLEVEL9K_MODE == (awesome-patched|awesome-fontconfig) && $cap_python == 0 ]]; then + uncomment 'typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION' + uncomment 'typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION' + uncomment 'typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION' + uncomment 'typeset -g POWERLEVEL9K_PYTHON_ICON' + sub VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION "'๐Ÿ'" + sub ANACONDA_VISUAL_IDENTIFIER_EXPANSION "'๐Ÿ'" + sub PYENV_VISUAL_IDENTIFIER_EXPANSION "'๐Ÿ'" + sub PYTHON_ICON "'๐Ÿ'" + fi + + case $POWERLEVEL9K_MODE in + nerdfont-complete) + sub BATTERY_STAGES "'\uf58d\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf578'" + ;; + nerdfont-v3) + sub BATTERY_STAGES "'\UF008E\UF007A\UF007B\UF007C\UF007D\UF007E\UF007F\UF0080\UF0081\UF0082\UF0079'" + ;; + esac + + if [[ $style == (classic|rainbow) ]]; then + if [[ $style == classic ]]; then + sub BACKGROUND $bg_color[$color] + sub LEFT_SUBSEGMENT_SEPARATOR "'%$sep_color[$color]F$left_subsep'" + sub RIGHT_SUBSEGMENT_SEPARATOR "'%$sep_color[$color]F$right_subsep'" + sub VCS_LOADING_FOREGROUND $sep_color[$color] + rep '%248F' "%$prefix_color[$color]F" + else + sub LEFT_SUBSEGMENT_SEPARATOR "'$left_subsep'" + sub RIGHT_SUBSEGMENT_SEPARATOR "'$right_subsep'" + fi + sub RULER_FOREGROUND $frame_color[$color] + sub MULTILINE_FIRST_PROMPT_GAP_FOREGROUND $frame_color[$color] + sub MULTILINE_FIRST_PROMPT_PREFIX "'%$frame_color[$color]Fโ•ญโ”€'" + sub MULTILINE_NEWLINE_PROMPT_PREFIX "'%$frame_color[$color]Fโ”œโ”€'" + sub MULTILINE_LAST_PROMPT_PREFIX "'%$frame_color[$color]Fโ•ฐโ”€'" + sub MULTILINE_FIRST_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ•ฎ'" + sub MULTILINE_NEWLINE_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ”ค'" + sub MULTILINE_LAST_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ•ฏ'" + sub LEFT_SEGMENT_SEPARATOR "'$left_sep'" + sub RIGHT_SEGMENT_SEPARATOR "'$right_sep'" + sub LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL "'$left_tail'" + sub LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL "'$left_head'" + sub RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL "'$right_head'" + sub RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL "'$right_tail'" + fi + + if [[ -n ${(j::)extra_icons} ]]; then + local branch_icon=${icons[VCS_BRANCH_ICON]// } + sub VCS_BRANCH_ICON "'$branch_icon '" + uncomment os_icon + else + uncomment 'typeset -g POWERLEVEL9K_DIR_CLASSES' + uncomment 'typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION' + uncomment 'typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION' + uncomment 'typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION' + sub VCS_VISUAL_IDENTIFIER_EXPANSION '' + sub COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION '' + sub TIME_VISUAL_IDENTIFIER_EXPANSION '' + fi + + if [[ -n ${(j::)prefixes} ]]; then + uncomment 'typeset -g POWERLEVEL9K_VCS_PREFIX' + uncomment 'typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX' + uncomment 'typeset -g POWERLEVEL9K_CONTEXT_PREFIX' + uncomment 'typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX' + uncomment 'typeset -g POWERLEVEL9K_TIME_PREFIX' + uncomment 'typeset -g POWERLEVEL9K_TOOLBOX_PREFIX' + if [[ $style == (lean|classic) ]]; then + [[ $style == classic ]] && local fg="%$prefix_color[$color]F" || local fg="%f" + sub VCS_PREFIX "'${fg}on '" + sub COMMAND_EXECUTION_TIME_PREFIX "'${fg}took '" + sub CONTEXT_PREFIX "'${fg}with '" + sub KUBECONTEXT_PREFIX "'${fg}at '" + sub TIME_PREFIX "'${fg}at '" + sub TOOLBOX_PREFIX "'${fg}in '" + fi + fi + + sub MULTILINE_FIRST_PROMPT_GAP_CHAR "'$gap_char'" + + if [[ $style == (classic|rainbow) && $num_lines == 2 ]]; then + if (( ! right_frame )); then + sub MULTILINE_FIRST_PROMPT_SUFFIX '' + sub MULTILINE_NEWLINE_PROMPT_SUFFIX '' + sub MULTILINE_LAST_PROMPT_SUFFIX '' + fi + if (( ! left_frame )); then + sub MULTILINE_FIRST_PROMPT_PREFIX '' + sub MULTILINE_NEWLINE_PROMPT_PREFIX '' + sub MULTILINE_LAST_PROMPT_PREFIX '' + sub STATUS_OK false + sub STATUS_ERROR false + fi + fi + + if [[ $style == lean* ]]; then + sub RULER_FOREGROUND $frame_color[$color] + sub MULTILINE_FIRST_PROMPT_GAP_FOREGROUND $frame_color[$color] + if (( right_frame )); then + sub MULTILINE_FIRST_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ•ฎ'" + sub MULTILINE_NEWLINE_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ”ค'" + sub MULTILINE_LAST_PROMPT_SUFFIX "'%$frame_color[$color]Fโ”€โ•ฏ'" + sub RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL "' '" + fi + if (( left_frame )); then + sub MULTILINE_FIRST_PROMPT_PREFIX "'%$frame_color[$color]Fโ•ญโ”€'" + sub MULTILINE_NEWLINE_PROMPT_PREFIX "'%$frame_color[$color]Fโ”œโ”€'" + sub MULTILINE_LAST_PROMPT_PREFIX "'%$frame_color[$color]Fโ•ฐโ”€'" + sub LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL "' '" + fi + fi + + if [[ $style == (classic|rainbow) ]]; then + if (( num_lines == 2 && ! left_frame )); then + uncomment prompt_char + else + uncomment vi_mode + fi + fi + + if [[ $POWERLEVEL9K_MODE == ascii ]]; then + sub 'STATUS_OK_VISUAL_IDENTIFIER_EXPANSION' "'ok'" + sub 'STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION' "'ok'" + sub 'STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION' "'err'" + sub 'STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION' "" + sub 'STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION' "'err'" + sub 'BATTERY_STAGES' "('battery')" + sub 'PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION' "'>'" + sub 'PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION' "'<'" + sub 'PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION' "'V'" + sub 'PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION' "'^'" + rep "-i 'โญ'" "-i '*'" + rep 'โ€ฆ' '..' + rep 'โ‡ฃ' '<' + rep 'โ‡ก' '>' + rep 'โ‡ ' '<-' + rep 'โ‡ข' '->' + rep 'โ”€' '-' + fi + fi + + if (( $+pure_use_rprompt )); then + local segment + for segment in command_execution_time virtualenv context; do + rep " $segment" " tmp_$segment" + uncomment $segment + rep " tmp_$segment " " # $segment" + done + fi + + if [[ -n $time ]]; then + uncomment time + if [[ $time == $time_12h ]]; then + sub TIME_FORMAT "'%D{%I:%M:%S %p}'" + fi + fi + + if (( num_lines == 1 )); then + local -a tmp + local line + for line in "$lines[@]"; do + [[ $line == (' newline'*|*'===[ Line #'*) ]] || tmp+=$line + done + lines=("$tmp[@]") + fi + + (( empty_line )) && sub PROMPT_ADD_NEWLINE true || sub PROMPT_ADD_NEWLINE false + + sub INSTANT_PROMPT $instant_prompt + (( transient_prompt )) && sub TRANSIENT_PROMPT always + + local header=${(%):-"# Generated by Powerlevel10k configuration wizard on %D{%Y-%m-%d at %H:%M %Z}."}$'\n' + header+="# Based on romkatv/powerlevel10k/config/p10k-${style//_/-}.zsh" + if [[ $commands[sum] == ('/bin'|'/usr/bin'|'/usr/local/bin')'/sum' ]]; then + local -a sum + if sum=($(sum <<<${base//$'\r\n'/$'\n'} 2>/dev/null)) && (( $#sum == 2 )); then + header+=", checksum $sum[1]" + fi + fi + header+=$'.\n' + local line="# Wizard options: $options[1]" + local opt + for opt in $options[2,-1]; do + if (( $#line + $#opt > 85 )); then + header+=$line + header+=$',\n' + line="# $opt" + else + line+=", $opt" + fi + done + header+=$line + header+=$'.\n# Type `p10k configure` to generate another config.\n#' + + command mkdir -p -- ${__p9k_cfg_path:h} || return + + if [[ -e $__p9k_cfg_path ]]; then + zf_rm -f -- $__p9k_cfg_path || return + fi + print -lr -- "$header" "$lines[@]" >$__p9k_cfg_path +} + +function change_zshrc() { + (( write_zshrc )) || return 0 + + local tmp=$__p9k_zshrc.${(%):-%n}.tmp.$$ + [[ ! -e $__p9k_zshrc ]] || cp -p $__p9k_zshrc $tmp || return + + { + local -i writable=1 + if [[ -e $tmp && ! -w $tmp ]]; then + chmod u+w -- $tmp || return + writable=0 + fi + + print -n >$tmp || return + + if (( !zshrc_has_instant_prompt )); then + >>$tmp print -r -- "# Enable Powerlevel10k instant prompt. Should stay close to the top of ${(%)__p9k_zshrc_u}. +# Initialization code that may require console input (password prompts, [y/n] +# confirmations, etc.) must go above this block; everything else may go below. +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" || return + fi + if [[ -n $zshrc_content ]]; then + (( zshrc_has_instant_prompt )) || print >>$tmp || return + >>$tmp print -r -- $zshrc_content || return + fi + if (( !zshrc_has_cfg )); then + >>$tmp print -r -- " +# To customize prompt, run \`p10k configure\` or edit ${(%)__p9k_cfg_path_u}. +[[ ! -f ${(%)__p9k_cfg_path_u} ]] || source ${(%)__p9k_cfg_path_u}" || return + fi + (( writable )) || chmod u-w -- $tmp || return + command mv -f -- $tmp $__p9k_zshrc || return + } always { + zf_rm -f -- $tmp + } + + if [[ -n $zshrc_backup_u ]]; then + print -rP "" + flowing +c See "%B${__p9k_zshrc_u//\\/\\\\}%b" changes: + print -rP " + %2Fdiff%f %B$zshrc_backup_u%b %B$__p9k_zshrc_u%b" + fi + return 0 +} + +function check_zshrc_integration() { + typeset -g zshrc_content= + typeset -gi zshrc_has_cfg=0 zshrc_has_instant_prompt=0 + [[ -e $__p9k_zshrc ]] || return 0 + zshrc_content="$(<$__p9k_zshrc)" || return + local lines=(${(f)zshrc_content}) + local f0=$__p9k_cfg_path_o + local f1=${(q)f0} + local f2=${(q-)f0} + local f3=${(qq)f0} + local f4=${(qqq)f0} + local g1=${${(q)__p9k_cfg_path_o}/#(#b)${(q)HOME}\//'~/'} + local h0='${ZDOTDIR:-~}/.p10k.zsh' + local h1='${ZDOTDIR:-$HOME}/.p10k.zsh' + local h2='"${ZDOTDIR:-$HOME}/.p10k.zsh"' + local h3='"${ZDOTDIR:-$HOME}"/.p10k.zsh' + local h4='${ZDOTDIR}/.p10k.zsh' + local h5='"${ZDOTDIR}/.p10k.zsh"' + local h6='"${ZDOTDIR}"/.p10k.zsh' + local h7='$ZDOTDIR/.p10k.zsh' + local h8='"$ZDOTDIR/.p10k.zsh"' + local h9='"$ZDOTDIR"/.p10k.zsh' + local h10='$POWERLEVEL9K_CONFIG_FILE' + local h11='"$POWERLEVEL9K_CONFIG_FILE"' + if [[ -n ${(@M)lines:#(#b)[^#]#([^[:IDENT:]]|)source[[:space:]]##(|--[[:space:]]##)($f1|$f2|$f3|$f4|$g1|$h0|$h1|$h2|$h3|$h4|$h5|$h6|$h7|$h8|$h9|$h10|$h11)(|[[:space:]]*|'#'*)} ]]; then + zshrc_has_cfg=1 + fi + local pre='${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh' + if [[ -n ${(@M)lines:#(#b)[^#]#([^[:IDENT:]]|)source[[:space:]]##($pre|\"$pre\")(|[[:space:]]*|'#'*)} ]]; then + zshrc_has_instant_prompt=1 + fi + return 0 +} + +() { + (( force )) && return + _p9k_can_configure -q || return 0 + local zshrc_content zshrc_has_cfg zshrc_has_instant_prompt + check_zshrc_integration 2>/dev/null || return 0 + (( zshrc_has_cfg )) || return 0 + [[ -s $__p9k_cfg_path ]] || return 0 + print -P "" + flowing \ + Powerlevel10k configuration file "($__p9k_cfg_path_u)" was not sourced. This \ + might have been caused by errors in zsh startup files, most likely in \ + $__p9k_zshrc_u. See above for any indication of such errors and fix them. If \ + there are no errors, try running Powerlevel10k configuration wizard: + print -P '' + print -P ' %2Fp10k%f %Bconfigure%b' + print -P '' + flowing \ + If you do nothing, you will see this message again when you start zsh. You can \ + suppress it by defining %BPOWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true%b in \ + $__p9k_zshrc_u. + print -P '' + return 1 +} || return + +if (( $+terminfo[smcup] && $+terminfo[rmcup] )) && echoti smcup 2>/dev/null; then + function restore_screen() { + echoti rmcup 2>/dev/null + function restore_screen() {} + } +else + function restore_screen() {} +fi + +{ # always + +if (( force )); then + _p9k_can_configure || return +else + _p9k_can_configure -q || return +fi + +zmodload zsh/terminfo zsh/datetime || return + +if [[ $ZSH_VERSION == (5.7.<1->*|5.<8->*|<6->.*) && $COLORTERM == (24bit|truecolor) ]]; then + local -ir has_truecolor=1 +else + local -ir has_truecolor=0 +fi + +stty -echo 2>/dev/null + +while true; do + local instant_prompt=verbose zshrc_content= zshrc_backup= zshrc_backup_u= + local -i zshrc_has_cfg=0 zshrc_has_instant_prompt=0 write_zshrc=0 + local POWERLEVEL9K_MODE= POWERLEVEL9K_ICON_PADDING=moderate style= config_backup= config_backup_u= + local gap_char=' ' prompt_char='โฏ' down_triangle='\uE0BC' up_triangle='\uE0BA' slanted_bar='\u2571' + local left_subsep= right_subsep= left_tail= right_tail= left_head= right_head= time= + local -i num_lines=2 empty_line=0 color=2 left_frame=1 right_frame=1 transient_prompt=0 + local -i cap_diamond=0 cap_python=0 cap_arrow=0 cap_lock=0 cap_quotes=0 + local -a extra_icons=('' '' '') + local -a frame_color=(244 242 240 238) + local -a color_name=(Lightest Light Dark Darkest) + local -a prefixes=('' '') + local -a options=() + if (( has_truecolor )); then + local -A pure_color=(${(kv)pure_snazzy}) + else + local -A pure_color=(${(kv)pure_original}) + fi + + unset pure_use_rprompt + + if [[ -o multibyte && $TERM != (dumb|linux) && $langinfo[CODESET] == (utf|UTF)(-|)8 ]]; then + ask_font || continue + ask_diamond || continue + if [[ $AWESOME_GLYPHS_LOADED == 1 ]]; then + POWERLEVEL9K_MODE=awesome-mapped-fontconfig + else + ask_lock '\uF023' || continue + if (( ! cap_lock )); then + ask_lock '\uE138' "Let's try another one." || continue + if (( cap_lock )); then + if (( cap_diamond )); then + POWERLEVEL9K_MODE=awesome-patched + ask_python || continue + else + POWERLEVEL9K_MODE=flat + fi + else + if (( cap_diamond )); then + POWERLEVEL9K_MODE=powerline + else + ask_quotes || continue + (( cap_quotes )) && POWERLEVEL9K_MODE=compatible || POWERLEVEL9K_MODE=ascii + fi + fi + elif (( ! cap_diamond )); then + POWERLEVEL9K_MODE=awesome-fontconfig + else + ask_arrow '\UF0737' || continue + if (( cap_arrow )); then + ask_width || continue + fi + if (( cap_arrow )); then + POWERLEVEL9K_MODE=nerdfont-v3 + else + ask_arrow '\uFC35' "Let's try another one." || continue + if (( cap_arrow )); then + POWERLEVEL9K_MODE=nerdfont-complete + else + POWERLEVEL9K_MODE=awesome-fontconfig + ask_python || continue + fi + fi + fi + fi + else + POWERLEVEL9K_MODE=ascii + fi + + if [[ $POWERLEVEL9K_MODE == powerline ]]; then + options+=powerline + elif (( cap_diamond )); then + options+="$POWERLEVEL9K_MODE + powerline" + else + options+="$POWERLEVEL9K_MODE" + fi + (( cap_python )) && options[-1]+=' + python' + if (( cap_diamond )); then + left_sep=$right_triangle + right_sep=$left_triangle + left_subsep=$right_angle + right_subsep=$left_angle + left_head=$right_triangle + right_head=$left_triangle + else + left_sep= + right_sep= + left_head= + right_head= + if [[ $POWERLEVEL9K_MODE == ascii ]]; then + left_subsep='|' + right_subsep='|' + prompt_char='>' + left_frame=0 + right_frame=0 + else + left_subsep=$vertical_bar + right_subsep=$vertical_bar + fi + fi + + _p9k_init_icons + ask_icon_padding || continue + _p9k_init_icons + + ask_style || continue + ask_charset || continue + ask_color_scheme || continue + ask_color || continue + ask_use_rprompt || continue + ask_time || continue + ask_separators || continue + ask_heads || continue + ask_tails || continue + ask_num_lines || continue + ask_gap_char || continue + ask_frame || continue + ask_ornaments_color || continue + ask_empty_line || continue + ask_extra_icons || continue + ask_prefixes || continue + ask_transient_prompt || continue + ask_instant_prompt || continue + ask_config_overwrite || continue + ask_zshrc_edit || continue + break +done + +restore_screen + +if (( !in_z4h_wizard )); then + print + + flowing +c New config: "%U${__p9k_cfg_path_u//\\/\\\\}%u." + if [[ -n $config_backup ]]; then + flowing +c Backup of the old config: "%U${config_backup_u//\\/\\\\}%u." + fi + if [[ -n $zshrc_backup ]]; then + flowing +c Backup of "%U${__p9k_zshrc_u//\\/\\\\}%u:" "%U${zshrc_backup_u//\\/\\\\}%u." + fi +fi + +generate_config || return +change_zshrc || return + +if (( !in_z4h_wizard )); then + print -rP "" + flowing +c File feature requests and bug reports at "$(href https://github.com/romkatv/powerlevel10k/issues)" + print -rP "" +fi + +success=1 + +} always { + (( success )) || quit + consume_input + stty echo 2>/dev/null + show_cursor + restore_screen +} diff --git a/src/powerlevel10k/internal/worker.zsh b/src/powerlevel10k/internal/worker.zsh new file mode 100644 index 0000000..269e8aa --- /dev/null +++ b/src/powerlevel10k/internal/worker.zsh @@ -0,0 +1,219 @@ +# invoked in worker: _p9k_worker_main +function _p9k_worker_main() { + mkfifo -- $_p9k__worker_file_prefix.fifo || return + echo -nE - s$_p9k_worker_pgid$'\x1e' || return + exec <$_p9k__worker_file_prefix.fifo || return + zf_rm -- $_p9k__worker_file_prefix.fifo || return + + local -i reset + local req fd + local -a ready + local _p9k_worker_request_id + local -A _p9k_worker_fds # fd => id$'\x1f'callback + local -A _p9k_worker_inflight # id => inflight count + + function _p9k_worker_reply() { + print -nr -- e${(pj:\n:)@}$'\x1e' || kill -- -$_p9k_worker_pgid + } + + # usage: _p9k_worker_async + function _p9k_worker_async() { + local fd async=$1 + sysopen -r -o cloexec -u fd <(() { eval $async; } && print -n '\x1e') || return + (( ++_p9k_worker_inflight[$_p9k_worker_request_id] )) + _p9k_worker_fds[$fd]=$_p9k_worker_request_id$'\x1f'$2 + } + + trap '' PIPE + + { + while zselect -a ready 0 ${(k)_p9k_worker_fds}; do + [[ $ready[1] == -r ]] || return + for fd in ${ready:1}; do + if [[ $fd == 0 ]]; then + local buf= + [[ -t 0 ]] # https://www.zsh.org/mla/workers/2020/msg00207.html + if sysread -t 0 'buf[$#buf+1]'; then + while [[ $buf != *$'\x1e' ]]; do + sysread 'buf[$#buf+1]' || return + done + else + (( $? == 4 )) || return + fi + for req in ${(ps:\x1e:)buf}; do + _p9k_worker_request_id=${req%%$'\x1f'*} + () { eval $req[$#_p9k_worker_request_id+2,-1] } + (( $+_p9k_worker_inflight[$_p9k_worker_request_id] )) && continue + print -rn -- d$_p9k_worker_request_id$'\x1e' || return + done + else + local REPLY= + while true; do + if sysread -i $fd 'REPLY[$#REPLY+1]'; then + [[ $REPLY == *$'\x1e' ]] || continue + else + (( $? == 5 )) || return + break + fi + done + local cb=$_p9k_worker_fds[$fd] + _p9k_worker_request_id=${cb%%$'\x1f'*} + unset "_p9k_worker_fds[$fd]" + exec {fd}>&- + if [[ $REPLY == *$'\x1e' ]]; then + REPLY[-1]="" + () { eval $cb[$#_p9k_worker_request_id+2,-1] } + fi + if (( --_p9k_worker_inflight[$_p9k_worker_request_id] == 0 )); then + unset "_p9k_worker_inflight[$_p9k_worker_request_id]" + print -rn -- d$_p9k_worker_request_id$'\x1e' || return + fi + fi + done + done + } always { + kill -- -$_p9k_worker_pgid + } +} + +# invoked in master: _p9k_worker_invoke +function _p9k_worker_invoke() { + [[ -n $_p9k__worker_resp_fd ]] || return + local req=$1$'\x1f'$2$'\x1e' + if [[ -n $_p9k__worker_req_fd && $+_p9k__worker_request_map[$1] == 0 ]]; then + _p9k__worker_request_map[$1]= + print -rnu $_p9k__worker_req_fd -- $req + else + _p9k__worker_request_map[$1]=$req + fi +} + +function _p9k_worker_cleanup() { + # __p9k_intro bugs out here in some cases for some reason. + emulate -L zsh + [[ $_p9k__worker_shell_pid == $sysparams[pid] ]] && _p9k_worker_stop + return 0 +} + +function _p9k_worker_stop() { + # See comments in _p9k_worker_cleanup. + emulate -L zsh + add-zsh-hook -D zshexit _p9k_worker_cleanup + [[ -n $_p9k__worker_resp_fd ]] && zle -F $_p9k__worker_resp_fd + [[ -n $_p9k__worker_resp_fd ]] && exec {_p9k__worker_resp_fd}>&- + [[ -n $_p9k__worker_req_fd ]] && exec {_p9k__worker_req_fd}>&- + [[ -n $_p9k__worker_pid ]] && kill -- -$_p9k__worker_pid 2>/dev/null + [[ -n $_p9k__worker_file_prefix ]] && zf_rm -f -- $_p9k__worker_file_prefix.fifo + _p9k__worker_pid= + _p9k__worker_req_fd= + _p9k__worker_resp_fd= + _p9k__worker_shell_pid= + _p9k__worker_request_map=() + return 0 +} + +function _p9k_worker_receive() { + eval "$__p9k_intro" + + [[ -z $_p9k__worker_resp_fd ]] && return + + { + (( $# <= 1 )) || return + + local buf resp + + [[ -t $_p9k__worker_resp_fd ]] # https://www.zsh.org/mla/workers/2020/msg00207.html + if sysread -i $_p9k__worker_resp_fd -t 0 'buf[$#buf+1]'; then + while [[ $buf == *[^$'\x05\x1e']$'\x05'# ]]; do + sysread -i $_p9k__worker_resp_fd 'buf[$#buf+1]' || return + done + else + (( $? == 4 )) || return + fi + + local -i reset max_reset + for resp in ${(ps:\x1e:)${buf//$'\x05'}}; do + local arg=$resp[2,-1] + case $resp[1] in + d) + local req=$_p9k__worker_request_map[$arg] + if [[ -n $req ]]; then + _p9k__worker_request_map[$arg]= + print -rnu $_p9k__worker_req_fd -- $req || return + else + unset "_p9k__worker_request_map[$arg]" + fi + ;; + e) + () { eval $arg } + (( reset > max_reset )) && max_reset=reset + ;; + s) + [[ -z $_p9k__worker_req_fd ]] || return + [[ $arg == <1-> ]] || return + _p9k__worker_pid=$arg + sysopen -w -o cloexec -u _p9k__worker_req_fd $_p9k__worker_file_prefix.fifo || return + local req= + for req in $_p9k__worker_request_map; do + print -rnu $_p9k__worker_req_fd -- $req || return + done + _p9k__worker_request_map=({${(k)^_p9k__worker_request_map},''}) + ;; + *) + return 1 + ;; + esac + done + + if (( max_reset == 2 )); then + _p9k__refresh_reason=worker + _p9k_set_prompt + _p9k__refresh_reason='' + fi + (( max_reset )) && _p9k_reset_prompt + return 0 + } always { + (( $? )) && _p9k_worker_stop + } +} + +function _p9k_worker_start() { + setopt monitor || return + { + [[ -n $_p9k__worker_resp_fd ]] && return + + if [[ -n "$TMPDIR" && ( ( -d "$TMPDIR" && -w "$TMPDIR" ) || ! ( -d /tmp && -w /tmp ) ) ]]; then + local tmpdir=$TMPDIR + else + local tmpdir=/tmp + fi + _p9k__worker_file_prefix=$tmpdir/p10k.worker.$EUID.$sysparams[pid].$EPOCHSECONDS + + sysopen -r -o cloexec -u _p9k__worker_resp_fd <( + exec 0$_p9k__worker_file_prefix.log + setopt xtrace + else + exec 2>/dev/null + fi + builtin cd -q / || return + zmodload zsh/zselect || return + ! { zselect -t0 || (( $? != 1 )) } || return + local _p9k_worker_pgid=$sysparams[pid] + _p9k_worker_main & + { + trap '' PIPE + while syswrite $'\x05'; do zselect -t 1000; done + zf_rm -f $_p9k__worker_file_prefix.fifo + kill -- -$_p9k_worker_pgid + } & + exec =true) || return + _p9k__worker_pid=$sysparams[procsubstpid] + zle -F $_p9k__worker_resp_fd _p9k_worker_receive + _p9k__worker_shell_pid=$sysparams[pid] + add-zsh-hook zshexit _p9k_worker_cleanup + } always { + (( $? )) && _p9k_worker_stop + } +} diff --git a/src/powerlevel10k/internal/worker.zsh.zwc b/src/powerlevel10k/internal/worker.zsh.zwc new file mode 100644 index 0000000000000000000000000000000000000000..5bbb38b43b7bf4b2bc4517f5576b652f008a339e GIT binary patch literal 17568 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 jleh&l3a*PDRc_PC!6FrSanFYXSno%j@?|QsQgL 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

gF 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/dev/null):#*.(utf|UTF)(-|)8}) || return + (( $#loc )) || return + typeset -g __p9k_locale=${loc[(r)(#i)C.UTF(-|)8]:-${loc[(r)(#i)en_US.UTF(-|)8]:-$loc[1]}} + fi + [[ -n $__p9k_locale ]] +} + +() { + eval "$__p9k_intro" + if (( $+__p9k_sourced )); then + (( $+functions[_p9k_setup] )) && _p9k_setup + return 0 + fi + typeset -gr __p9k_dump_file=${XDG_CACHE_HOME:-~/.cache}/p10k-dump-${(%):-%n}.zsh + if [[ $__p9k_dump_file != $__p9k_instant_prompt_dump_file ]] && (( ! $+functions[_p9k_preinit] )) && source $__p9k_dump_file 2>/dev/null && (( $+functions[_p9k_preinit] )); then + _p9k_preinit + fi + typeset -gr __p9k_sourced=13 + if [[ $ZSH_VERSION == (5.<1->*|<6->.*) ]]; then + if [[ -w $__p9k_root_dir && -w $__p9k_root_dir/internal && -w $__p9k_root_dir/gitstatus ]]; then + local f + for f in $__p9k_root_dir/{powerlevel9k.zsh-theme,powerlevel10k.zsh-theme,internal/p10k.zsh,internal/icons.zsh,internal/configure.zsh,internal/worker.zsh,internal/parser.zsh,gitstatus/gitstatus.plugin.zsh,gitstatus/install}; do + [[ $f.zwc -nt $f ]] && continue + zmodload -F zsh/files b:zf_mv b:zf_rm + local tmp=$f.tmp.$$.zwc + { + # `zf_mv -f src dst` fails on NTFS if `dst` is not writable, hence `zf_rm`. + zf_rm -f -- $f.zwc && zcompile -R -- $tmp $f && zf_mv -f -- $tmp $f.zwc + } always { + (( $? )) && zf_rm -f -- $tmp + } + done + fi + fi + builtin source $__p9k_root_dir/internal/p10k.zsh || true +} + +(( $+__p9k_instant_prompt_active )) && unsetopt prompt_cr prompt_sp || setopt prompt_cr prompt_sp + +(( ${#__p9k_src_opts} )) && setopt ${__p9k_src_opts[@]} +'builtin' 'unset' '__p9k_src_opts' diff --git a/src/powerlevel10k/powerlevel10k.zsh-theme.zwc b/src/powerlevel10k/powerlevel10k.zsh-theme.zwc new file mode 100644 index 0000000000000000000000000000000000000000..5ec2e545db13eee68743ce68401e6df7ce35a6b2 GIT binary patch literal 8552 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 literal 0 HcmV?d00001 diff --git a/src/powerlevel10k/powerlevel9k.zsh-theme b/src/powerlevel10k/powerlevel9k.zsh-theme new file mode 100644 index 0000000..328cd83 --- /dev/null +++ b/src/powerlevel10k/powerlevel9k.zsh-theme @@ -0,0 +1 @@ +'builtin' 'source' "${POWERLEVEL9K_INSTALLATION_DIR:-${${(%):-%x}:A:h}}/powerlevel10k.zsh-theme" diff --git a/src/powerlevel10k/powerlevel9k.zsh-theme.zwc b/src/powerlevel10k/powerlevel9k.zsh-theme.zwc new file mode 100644 index 0000000000000000000000000000000000000000..1739224ff104582e6439d581c42649c29c41b7c8 GIT binary patch literal 560 zcmZQ)V`X8GU}P}Wvt%F!r~(x=LKP|iX-ObH0mS+l`MIh3$wj3V`g-{py1A9QRmBn%|LV0 zfS3`8HG$X{h(Ta(QfX#RNoL+$hPlQ0rA5i9a~bCK^auEdy9W8VhPnD!ddGYE1&28L z_&A1m`uoMZcm`SN_VoAkYp7~k>8e&tuyVA@m@om!1wi*8oG=e$2Ma43I}-`v0@Q*v YXs8x0AV)DUIWjPa07D0R(9k1X0O*i}x&QzG literal 0 HcmV?d00001 diff --git a/src/powerlevel10k/prompt_powerlevel10k_setup b/src/powerlevel10k/prompt_powerlevel10k_setup new file mode 100644 index 0000000..328cd83 --- /dev/null +++ b/src/powerlevel10k/prompt_powerlevel10k_setup @@ -0,0 +1 @@ +'builtin' 'source' "${POWERLEVEL9K_INSTALLATION_DIR:-${${(%):-%x}:A:h}}/powerlevel10k.zsh-theme" diff --git a/src/powerlevel10k/prompt_powerlevel9k_setup b/src/powerlevel10k/prompt_powerlevel9k_setup new file mode 100644 index 0000000..328cd83 --- /dev/null +++ b/src/powerlevel10k/prompt_powerlevel9k_setup @@ -0,0 +1 @@ +'builtin' 'source' "${POWERLEVEL9K_INSTALLATION_DIR:-${${(%):-%x}:A:h}}/powerlevel10k.zsh-theme"