Full Code of Powerlevel9k/powerlevel9k for AI

master 66d53c02476c cached
111 files
416.5 KB
127.0k tokens
1 requests
Download .txt
Showing preview only (444K chars total). Download the full file or copy to clipboard to get everything.
Repository: Powerlevel9k/powerlevel9k
Branch: master
Commit: 66d53c02476c
Files: 111
Total size: 416.5 KB

Directory structure:
gitextract_7q9jqrz3/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── ISSUE_TEMPLATE.md
│   │   └── PERFORMANCE_ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .gitmodules
├── .travis.yml
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── TESTS.md
├── debug/
│   ├── font-issues.zsh
│   └── iterm.zsh
├── docker/
│   ├── antibody/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── antigen/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── base-4.3.11/
│   │   └── Dockerfile
│   ├── base-5.0.3/
│   │   └── Dockerfile
│   ├── base-5.1.1/
│   │   └── Dockerfile
│   ├── base-5.2/
│   │   └── Dockerfile
│   ├── base-5.3.1/
│   │   └── Dockerfile
│   ├── base-5.4.2/
│   │   └── Dockerfile
│   ├── base-5.5.1/
│   │   └── Dockerfile
│   ├── dotfile/
│   │   ├── Dockerfile
│   │   └── zshrc
│   ├── fred-sudoers
│   ├── omz/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── prezto/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   ├── zgen/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zim/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   ├── zplug/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zplugin/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc.plugins
│   ├── zpm/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zshing/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   └── zulu/
│       ├── Dockerfile
│       └── install.zsh
├── functions/
│   ├── colors.zsh
│   ├── icons.zsh
│   ├── utilities.zsh
│   └── vcs.zsh
├── powerlevel9k.zsh-theme
├── test/
│   ├── core/
│   │   ├── color_overriding.spec
│   │   ├── joining_segments.spec
│   │   ├── prompt.spec
│   │   └── visual_identifier.spec
│   ├── functions/
│   │   ├── colors.spec
│   │   ├── icons.spec
│   │   └── utilities.spec
│   ├── powerlevel9k.spec
│   ├── segments/
│   │   ├── anaconda.spec
│   │   ├── aws_eb_env.spec
│   │   ├── background_jobs.spec
│   │   ├── battery.spec
│   │   ├── command_execution_time.spec
│   │   ├── context.spec
│   │   ├── custom.spec
│   │   ├── detect_virt.spec
│   │   ├── dir.spec
│   │   ├── disk_usage.spec
│   │   ├── go_version.spec
│   │   ├── ip.spec
│   │   ├── kubecontext.spec
│   │   ├── laravel_version.spec
│   │   ├── load.spec
│   │   ├── newline.spec
│   │   ├── node_version.spec
│   │   ├── nodeenv.spec
│   │   ├── nvm.spec
│   │   ├── php_version.spec
│   │   ├── public_ip.spec
│   │   ├── ram.spec
│   │   ├── rust_version.spec
│   │   ├── ssh.spec
│   │   ├── status.spec
│   │   ├── swap.spec
│   │   ├── swift_version.spec
│   │   ├── symfony_version.spec
│   │   ├── todo.spec
│   │   ├── vcs-git.spec
│   │   ├── vcs-hg.spec
│   │   ├── vi_mode.spec
│   │   └── vpn_ip.spec
│   └── suite.spec
├── test-bsd-vm/
│   ├── Vagrantfile
│   ├── bootstrap-zero.sh
│   └── bootstrap.sh
├── test-in-docker
├── test-vm/
│   ├── README.md
│   ├── Vagrantfile
│   ├── antigen.sh
│   ├── bootstrap.sh
│   ├── omz.sh
│   └── prezto.sh
└── test-vm-providers/
    ├── plain.sh
    └── setup-environment.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

Thanks for opening an issue! For a project that deals with as many different things as P9k, debugging problems can be difficult. Please follow the guide, below, to create a bug report that will help us help you!

### Before Opening a Bug
P9k is lovingly maintained by volunteers, and we are happy to help you! You can help us by first making sure your issue hasn't already been solved before opening a new one. Please check the [Troubleshooting Guide](https://github.com/bhilburn/powerlevel9k/wiki/Troubleshooting) first. Many issues are actually local configuration problems, which may have previously been solved by another user - be sure to also [search the existing issues](https://github.com/bhilburn/powerlevel9k/issues?utf8=%E2%9C%93&q=is%3Aissue) before opening a new one.

Once you've done these things, you can delete this section and proceed `=)`

-----

#### Describe Your Issue
What is happening?

Most issues are best explained with a screenshot. Please share one if you can!

#### Have you tried to debug or fix it?

Have you tinkered with your settings, and what happened when you did? Did you find a bit of code that you think might be the culprit? Let us know what you've done so far!

#### Environment Information

This information will help us understand your configuration.

  - What version of ZSH are you using? You can use `zsh --version` to see this.
  - Do you use a ZSH framework (e.g., Oh-My-ZSH, Antigen)?
  - How did you install P9k (cloning the repo, by tarball, a package from your OS, etc.,)?
  - What version of P9k are you using?
  - Which terminal emulator do you use?

#### Issues with Fonts & Icons
You may delete this section if your issue is not font / icon related.

  - Which font do you use?
  - Which [font configuration mode](https://github.com/bhilburn/powerlevel9k/wiki/About-Fonts) are you using? You can check this with (`echo $POWERLEVEL9K_MODE`).
  - Please share the contents of `$P9k/debug/font-issues.zsh`.
  - If this is an icon problem, does the output of `$ get_icon_names` look correct?


================================================
FILE: .github/ISSUE_TEMPLATE/PERFORMANCE_ISSUE_TEMPLATE.md
================================================
---
name: Performance Issue
about: For performance Issues
title: "[Performance]"
labels: performance
assignees: ''

---

Sorry to hear that the performance of P9K is not adequate. To fix this, please provide us with some hints.

### Your Hardware

Disk I/O is critical for P9K, so do you use a spinning disk, or a SSD?

### Virtualization

Do you use P9K in some sort of virtualization? This is also the case, if you use WSL on Windows..

### How Fast is Fast

Could you quantify how fast the specific segment is, that you think is slow?
For example, if you think the `vcs` segment is slow, could you execute this command in the directory, where the segment is slow:

```zsh
time (repeat 10; do; prompt_vcs left 1 false >/dev/null; done;)
```

Also, please provide us with some context around the segment. In the `vcs` example:

- How big is the repo?
- Does it contain a lot of untracked files?
- Does it contain a lot of git submodules?
- Does it contain a lot of files in general?

Additionally, you could install [zsh-prompt-benchmark](https://github.com/romkatv/zsh-prompt-benchmark), to benchmark the general performance of ZSH and P9K.

If you don't know which segment is slow, could you remove one by one, and spot the one that made the greatest impact?

================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Thank you so much for opening a PR for P9k! Many of our best features and segments have come from the community, and we are excited to see your contribution.

To help you make the best PR, here are some guidelines:

  - The `master` branch is our *stable* branch, and the `next` branch is our development branch. If you are submitting a bug fix, please file your PR against `master`. If it is a new feature, enhancement, segment, or something similar, please submit it against `next`. For more information, please see our [Developer's Guide](https://github.com/bhilburn/powerlevel9k/wiki/Developer's-Guide).
  - We maintain unit tests for segments and features in the `test` directory. Please add unit tests for anything new you have developed! If you aren't sure how to do this, go ahead and file your PR and ask for help!
  - For running manual tests in different environments, we have Vagrant and Docker configurations. Please see the [Test README](https://github.com/bhilburn/powerlevel9k/blob/next/TESTS.md) and make sure your new feature is working as expected!
  - If your PR requires user configuration, please make sure that it includes an update to the README describing this.
  - P9k maintains a lot of useful information in our [Wiki](https://github.com/bhilburn/powerlevel9k/wiki). Depending on the content of your PR, we might ask you to update the Wiki (or provide text for us to use) to document your work. Most PRs don't require this.
  - Please make your commit messages useful! Here is a [great short guide on useful commit messages](https://code.likeagirl.io/useful-tips-for-writing-better-git-commit-messages-808770609503).

Once you have submitted your PR, P9k core contributors will review the code and work with you to get it merged. During this process, we might request changes to your code and discuss different ways of doing things. This is all part of the open source process, and our goal is to help you create the best contribution possible for P9k `=)`.

Please follow this template for creating your PR:

#### Title

Please make the title of your PR descriptive! If appropriate, please prefix the title with one of these tags:

- [Bugfix]
- [New Segment]
- [Docs]
- [Enhancement]

#### Description

Please describe the contribution your PR makes! Screenshots are especially helpful, here, if it's a new segment.

If your PR is addressing an issue, please reference the Issue number here.

#### Questions

Is there something in your PR you're not sure about or need help with? Is there a particular piece of code you would like feedback on? Let us know here!


================================================
FILE: .gitignore
================================================
test-vm/.vagrant
*.swp
.idea

================================================
FILE: .gitmodules
================================================
[submodule "shunit2"]
	path = shunit2
	url = https://github.com/kward/shunit2.git


================================================
FILE: .travis.yml
================================================
language: sh

os:
  - linux
  - osx

osx_image: xcode9.4

addons:
  apt:
    packages:
      - build-essential
      - git
      - mercurial
      - subversion
      - jq
      - node
      - golang
      - ruby
      - python
      - python-virtualenv

before_install:
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update            ; fi

env:
  global:
    - ZSH_DIST=$HOME/.zshdist
  matrix:
    # Use _ZSH_VERSION since if ZSH_VERSION is present, travis cacher thinks it
    # is running in zsh and tries to use zsh specific functions.
    - _ZSH_VERSION=5.5.1
    - _ZSH_VERSION=5.5
    - _ZSH_VERSION=5.4.2
    - _ZSH_VERSION=5.4.1
    - _ZSH_VERSION=5.3.1
    - _ZSH_VERSION=5.3
    - _ZSH_VERSION=5.2
    - _ZSH_VERSION=5.1.1

cache:
  directories:
    - $ZSH_DIST

before_script:
  - >
    setup_zsh() {
      dest="$ZSH_DIST/$1"
      if [[ ! -d $dest/bin ]]; then
        coreutils_mktemp="mktemp"
        if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
          coreutils_mktemp="gmktemp"
        fi
        tmp="$(${coreutils_mktemp} --directory --tmpdir="${TMPDIR:/tmp}" zshbuild.XXXXXX)"
        (
          cd "$tmp" &&
          curl -L http://downloads.sourceforge.net/zsh/zsh-${1}.tar.gz | tar zx &&
          cd zsh-$1 &&
          ./configure --prefix="$dest" &&
          make &&
          mkdir -p "$dest" &&
          make install ||
          echo "Failed to build zsh-${1}!"
        )
      fi
      export PATH="$dest/bin:$PATH"
    }
  - setup_zsh $_ZSH_VERSION
  # Show the git version being used to test.
  - "git --version"
  # Show the mercurial version being used to test.
  - "hg --version"
  # Show the zsh version being used to test.
  - "zsh --version"

script:
  - test/suite.spec


================================================
FILE: CHANGELOG.md
================================================
## v0.6.7

- PR #1175 - Fix home dir shortening when using package_name truncation strategy
- PR #1158 - [Bugfix] dir: Fix package name path truncation inside home dir
- PR #1157 - Hide stderr from git ls-files
- PR #1154 - Fix issues with debug/fonts script in Konsole
- PR #1151 - [Bugfix] Only abbreviate $HOME at the beginning of cwd
- PR #1148 - Remove checking for NODEENV_DISABLE_PROMPT
- PR #1147 - Fix newlines in ZSH 5.7
- PR #1149 - Fix RVM
- PR #1128 - [Bugfix] virtualenv prompt displaying
- PR #981 - [Bugfix] Fix for #974
- PR #1126 - Use ip command for VPN segment
- PR #1079 - [Bugfix] Update VIRTUAL_ENV_DISABLE_PROMPT value
- PR #1080 - [Bugfix] Port #1071 to `master` (Fix fatal errors emitted by untracked file check in vcs.zsh)
- PR #1074 - Add vcs vulnerability tests master
- PR #1070 - [Docs] Uniformly apply inline code formatting in README
- PR #1065 - Protect locale
- PR #1048 - Speedup Improvements in `vcs` segment
- PR #1037 - Fix vpn_ip segment
- PR #1036 - Make truncate with package name work without setting shorten length
- PR #1020 - Fix context spec
- PR #990 - [Docs] Add forgotten backtick
- PR #981 - Avoid error if `/etc/os-release` does not exist
- PR #966 - [Bugfix] Fix icons cut off in RPROMPT segments

## v0.6.6

- The `rbenv` segment is no longer a default segment in the LPROMPT.
- PR #959 - Fixing issue in v0.6.5 where we changed some color codes.
- PR #934 - Add Tests
- PR #884 - test-in-docker: fix with newer ZSH versions
- PR #928 - [Docs] Add etc state description in dir docs
- PR #937 - Use SUDO_COMMAND to check for sudo
- PR #925 - [Bugfix] Resolve #918 Transparent background
- PR #923 - Fix font issue debugging script
- PR #921 - Add missing colors to fix color comparison
- PR #951 - Add fallback icon for missing linux distro icons
- PR #956 - Fix broken link in readme
- Fixed #936 - fallback icons for Linux distros
- Fixed #926 - `etc` state for `dir` segment in docs
- Fixed #852 - `sudo` detection got crazy, there. sorry, everyone.
- Fixed #927 - more default color issues.

## v0.6.5

- Multiple PRs: General fixes to README, improved documentation.
- Multiple PRs: Improvements to icons / glyphs.
- PR #777: now possible to always show the Ruby env segment.
- PR #773: Fixed issue with home abbreviation in directory segment.
- PR #789: Now properly working around some odd ZSH status return codes.
- PR #716: Now possible to configure the colors of the VCS segment in rebase mode.
- PR #722: Removed dependency on `bc` for `load` segment.
- PR #686: Fixed issue where whitespaces in path occasionally broke `dir` segment.
- PR #685: No longer accidentally invoking user `grep` aliases.
- PR #680: Using env variable for `PYENV` properly, now.
- PR #676, #611: Fixes for Kubernetes segment.
- PR #667: Supporting multiple AWS profiles.
- PR #660: Fixing directory parsing issue with PYTHONPATH.
- PR #663: Fixed silly issues causing ZSH warnings.
- PR #647: Fixing `public_ip` segment for macOS.
- PR #643: Fixing `vpn_ip` segment naming.
- PR #636: `context` segment now grabs user with command rather than env.
- PR #618: Fix issue where `su -` didn't change context segment.
- PR #608: Load average selection in `load` segment.

### New Segment: `laravel_version`

Displays the current laravel version.

## v0.6.4

- `load` segment now has configurable averages.
- Update to `dir` segment to add `dir_writable` feature.
- `status` segment can now display POSIX signal name of exit code.
- Added `teardown` command to turn off P9k prompt.
- Fixes for P9k in Cygwin and 32-bit systems.
- Better colors in virtualization segments.
- Added 'Gopher' icon to the `go_version` segment.
- Improved detection in `nvm`
- Added option to support command status reading from piped command sequences.
- Fixed issue with visual artifacts with quick consecutive commands.
- Updated 'ananconda' segment for more uniform styling.
- `rvm` segment can now support usernames with dashes.
- Fixed Python icon reference in some font configurations.
- Vi mode indicator fixed.
- Fixes for Docker segment.
- Added new Docker-based testing system.
- Significant enhancements to the `battery` segment. Check out the README to
  read more!
- New truncation strategy that truncates until the path becomes unique.

### New Segments: `host` and `user`

Provides two separate segments for `host` and `user` in case you don't wont both
in one (per the `context` segment).

### New Segment: `newline`

Allows you to split segments across multiple lines.

### New Segment: `kubecontext`

Shows the current context of your `kubectl` configuration.

### New Segment: `vpn`

Shows current `vpn` interface.

## v0.6.3

- Fixed susceptibility to [pw3nage exploit](https://github.com/njhartwell/pw3nage).
- Added support for Android
- The abbreviation for $HOME is now configurable (doesn't have to be `~`).
- Fixed colorization of VCS segment in Subversion repos.
- Improved handling of symlinks in installation paths.

## v0.6.2

- Fixed some issues with the new `nerdfont-fontconfig` option.
- Fixed typo in README.
- The `get_icon_names` function can now print sorted output, and show which
  icons users have overridden.
- Added a FreeBSD VM for testing.

### Add debug script for iTerm2 issues

A new script `debug/iterm.zsh` was added for easier spotting problems with your iTerm2 configuration.

### Add debug script for font issues

A new script `debug/font-issues.zsh` was added, so that problems with your font could be spotted easier.

### `ram` changes

The `ram` segment now shows the available ram instead of free.

### Add new segments `host` and `user`

The user and host segments allow you to have different icons and colors for both the user and host segments
depending on their state.

## v0.6.0

- Fixed a bug where the tag display was broken on detached HEADs.
- Fixed a bug where SVN detection sometimes failed.
- Fixed the `load` and `ram` segments for BSD.
- Fixed code-points that changed in Awesome fonts.
- Fixed display of "OK_ICON" in `status` segment in non-verbose mode.
- Fixed an issue where dir name truncation that was very short sometimes failed.
- Speed & accuracy improvements to the battery segment.
- Added Github syntax highlighting to README.
- Various documentation cleanup.

### New Font Option: nerd-fonts

There is now an option to use [nerd-fonts](https://github.com/ryanoasis/nerd-fonts) with P9k. Simply configure the `nerdfont-fontconfig`, and you'll be set!

### `vcs` changes

The VCS segment can now display icons for remote repo hosting services, including Github, Gitlab, and 'other'.

### `dir` changes

Added an option to configure the path separator. If you want something
else than an ordinary slash, you could set
`POWERLEVEL9K_DIR_PATH_SEPARATOR` to whatever you want.

#### `truncate_with_package_name` now searches for `composer.json` as well

Now `composer.json` files are searched as well. By default `package.json` still takes
precedence. If you want to change that, set `POWERLEVEL9K_DIR_PACKAGE_FILES=(composer.json package.json)`.

### New segment `command_execution_time` added

Shows the duration a command needed to run. By default only durations over 3 seconds
are shown (can be adjusted by setting POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD).

### New segment `dir_writable` added

This segment displays a lock icon if your user has no write permissions in the current folder.

### New segment `disk_usage` added

This segment will show the usage level of your current partition.

### New segment `public_ip` added

Fetches your Public IP (using ident.me) and displays it in your prompt.

### New segment `swift_version` added

This segment displays the version of Swift that is installed / in your path.

### New segment `detect_virt` added

Detects and reports if you are in a virtualized session using `systemd`.

## v0.5.0

### `load` and `ram` changes

These two segments now support BSD.

### `vcs` changes

- We implemented a huge speed improvement for this segment.
- Now this segment supports Subversion repositories.
- Add ability to hide tags by setting `POWERLEVEL9K_VCS_HIDE_TAGS` to true.

## `anaconda` changes

Speed improvements for `anaconda` segment.

## v0.4.0

### Development changes

From now on, development makes use of a CI system "travis".

### `vcs` changes

The default state was renamed to `clean`. If you overrode foreground
or background color in the past, you need to rename your variables to:

```zsh
POWERLEVEL9K_VCS_CLEAN_FOREGROUND='cyan'
POWERLEVEL9K_VCS_CLEAN_BACKGROUND='white'
```

Additionaly the vcs segment now has an `untracked` state which
indicates that you have untracked files in your repository.

The foreground color of actionformat is now configurable via:
```zsh
POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND='green'
```

Also, the vcs segment uses the foreground color it was configured to.
That said, the variables `POWERLEVEL9K_VCS_FOREGROUND` and
`POWERLEVEL9K_VCS_DARK_FOREGROUND` are no longer used. Instead use
the proper variable `POWERLEVEL9K_VCS_<STATE>_FOREGROUND` to change
foreground color.

### `dir` Shortening Strategies

There is now a path shortening strategy that will use the `package.json` file to
shorten your directory path. See the documentation for the `dir` segment for more
details.

Also, the shorten delimiter was changed to an unicode ellipsis. It is configurable
via `POWERLEVEL9K_SHORTEN_DELIMITER`.

### `rbenv` changes

The `rbenv` segment now makes use of the full rbenv command, so the correct
ruby version is now shown if it differs from the globally one.

### `node`, `nvm` Segments

Improvements to speed / reliability.

### `ram` changes

The `ram` segment was split up into `ram` and `swap`. The
`POWERLEVEL9K_RAM_ELEMENTS` variable is obsolete.

### New segment `swap` added

Due to the split up of the ram segment, this one was created. It
shows the currently used swap size.

### New segment `nodeenv` added

Added new `nodeenv` segment that shows the currently used node environment.

### New segment `aws_eb_env` added

This segment displays the current Elastic Beanstalk environment.

### New segment `chruby` added

Added new `chruby` segment to support this version manager.

### New segment `docker_machine` added

Added new `docker_machine` segment that will show your Docker machine.

### New segment `anaconda` added

A new segment `anaconda` was added that shows the current used
anaconda environment.

## New segment `pyenv` added

This segment shows your active python version as reported by `pyenv`.


## v0.3.2

### `vcs` changes

A new state `UNTRACKED` was added to the `vcs` segment. So we now
have 3 states for repositories: `UNTRACKED`, `MODIFIED`, and the
default state. The `UNTRACKED` state is active when there are files
in the repository directory which have not been added to the repo
(the same as when the `+` icon appears). The default color for the
`UNTRACKED` state is now yellow, and the default color for the
`MODIFIED` state is now read, but those colors can be changed by
setting these variables, for example:

```zsh
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='black'
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='white'
POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND='green'
POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND='blue'
```

## v0.3.1

### `dir` changes

A new state `HOME_SUBFOLDER` was added. So if you want to overwrite
colors for this segment, also set this variables:
```zsh
POWERLEVEL9K_DIR_HOME_SUBFOLDER_BACKGROUND='black'
POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND='white'
```

### `background_jobs` changes
Now displays the number of background jobs if there's more than 1.
You can disable it by setting :
```zsh
POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false
```

## v0.3.0

### Introduced "visual identifiers" to the segments

Now almost every segment can have a visual identifier, which is an
icon whose color could be adjusted by users.

### Added ability for "joined" segments

You can now merge segments together by suffixing the segment name with "_joined".
For Developers: Be aware that the order of parameters in left/right_prompt_segment
has changed. Now a boolean parameter must be set as second parameter (true if joined).

### `dir` changes

This segment now has "state", which means you now can change the colors seperatly
depending if you are in your homefolder or not.
Your variables for that should now look like:
```zsh
POWERLEVEL9K_DIR_HOME_BACKGROUND='green'
POWERLEVEL9K_DIR_HOME_FOREGROUND='cyan'
POWERLEVEL9K_DIR_DEFAULT_BACKGROUND='red'
POWERLEVEL9K_DIR_DEFAULT_FOREGROUND='yellow'
```

### `status` changes

The `status` segment was split up into three segments. `background_jobs` prints
an icon if there are background jobs. `root_indicator` prints an icon if the user
is root. The `status` segment focuses now on the status only.
The `status` segment also now has "state". If you want to overwrite the colors,
you have to add the state to your variables:
```zsh
POWERLEVEL9K_STATUS_ERROR_BACKGROUND='green'
POWERLEVEL9K_STATUS_ERROR_FOREGROUND='cyan'
POWERLEVEL9K_STATUS_OK_BACKGROUND='red'
POWERLEVEL9K_STATUS_OK_FOREGROUND='yellow'
```

### New segment `custom_command` added

A new segment that allows users to define a custom command was added.

### `virtualenv` changes

This segment now respects `VIRTUAL_ENV_DISABLE_PROMPT`. If this variable is set
to `true`, the segments does not get rendered.

### `load` changes

The `load` segement was split and a new segment `ram` was extracted. This new
segment is able to show the free ram and used swap.

### `vcs` changes

This prompt uses the `VCS_INFO` subsystem by ZSH. From now on this subsystem
is only invoked if a `vcs` segment was configured.

### `rvm` changes

This segment now does not invoke RVM directly anymore. Instead, is relys on the
circumstance that RVM was invoked beforehand and just reads the environment
variables '$GEM_HOME' and '$MY_RUBY_HOME'. It also now displays the used gemset.

### New segment `battery` added

A new segment that shows the battery status of your laptop was added.

### New segment `go_version` added

This segment shows the GO version.

### New segment `nvm` added

This segment shows your NodeJS version by using NVM (and if it is not 'default').

### New segment `todo` added

This segment shows your ToDos from [todo.sh](http://todotxt.com/).

### New segment `rust_version` added

This segment shows your local rust version.

## v0.2.0

### `longstatus` is now `status`

The segments got merged together. To show the segment only if an error occurred,
set `POWERLEVEL9K_STATUS_VERBOSE=false` (this is the same behavior as the old
`status` segment.

### Icon overriding mechanism added

All icons can now be overridden by setting a variable named by the internal icon
name. You can get a full list of icon name by calling `get_icon_names`.

### Same color segements get visual separator

This separator can be controlled by setting `POWERLEVEL9K_LEFT_SUBSEGMENT_SEPARATOR`
or `POWERLEVEL9K_RIGHT_SUBSEGMENT_SEPARATOR`. By default this separator is
printed in the foreground color.

### `dir` segment has different strategies for truncation

Now you can choose between `truncate_middle` or `truncate_from_right` by setting
`POWERLEVEL9K_SHORTEN_STRATEGY`. Default behavior is unchanged (truncate whole
directories). `POWERLEVEL9K_SHORTEN_DIR_LENGTH` can be used to influence how
much will be truncated (either direcories or chars).

### New segment `ip` added

This segment shows your internal IP address. You can define which interfaces IP
will be shown by specifying it via `POWERLEVEL9K_IP_INTERFACE`.

### New segment `load` added

This segment shows your computers 5min load average.

### New segment `os_icon` added

This segment shows a little indicator which OS you are running.

### New segment `php_version` added

This segment shows your PHP version.

### New segment `vi_mode` added

This segment gives you a hint in which VI-mode you currently are. This
segment requires a proper configured VI-mode.

### Added the ability to have empty left or right prompts

By setting the according variable to an empty array, the left or right
prompt will be empty.

## v0.1.0

This is the first release


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at bhilburn@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: LICENSE
================================================
Copyright (c) 2014-2017 Ben Hilburn <bhilburn@gmail.com>

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.


================================================
FILE: README.md
================================================
## Powerlevel9k is deprecated and now unmaintained. Please use [Powerlevel10k](https://github.com/romkatv/powerlevel10k)!
---
![](https://raw.githubusercontent.com/bhilburn/powerlevel9k-logo/master/logo-banner.png)
---
[![Build Status](https://travis-ci.org/bhilburn/powerlevel9k.svg?branch=master)](https://travis-ci.org/bhilburn/powerlevel9k)
[![Join the chat at https://gitter.im/bhilburn/powerlevel9k](https://badges.gitter.im/bhilburn/powerlevel9k.svg)](https://gitter.im/bhilburn/powerlevel9k?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)

Powerlevel9k is a theme for ZSH which uses [Powerline
Fonts](https://github.com/powerline/fonts). It can be used with vanilla ZSH or
ZSH frameworks such as [Oh-My-Zsh](https://github.com/robbyrussell/oh-my-zsh),
[Prezto](https://github.com/sorin-ionescu/prezto),
[Antigen](https://github.com/zsh-users/antigen), and [many
others](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions).

Get more out of your terminal. Be a badass. Impress everyone in 'Screenshot Your
Desktop' threads. Use powerlevel9k.

![](http://bhilburn.org/content/images/2015/01/pl9k-improved.png)

You can check out some other users' configurations in our wiki: [Show Off Your
Config](https://github.com/bhilburn/powerlevel9k/wiki/Show-Off-Your-Config).

There are a number of Powerline ZSH themes available, now. The developers of
this theme focus on four primary goals:

1. Give users a great out-of-the-box configuration with no additional
   configuration required.
2. Make customization easy for users who do want to tweak their prompt.
3. Provide useful segments that you can enable to make your prompt even more
   effective and helpful. We have prompt segments for everything from unit test
   coverage to your AWS instance.
4. Optimize the code for execution speed as much as possible. A snappy terminal
   is a happy terminal.

Powerlevel9k can be used to create both very useful and beautiful terminal environments:

![](https://camo.githubusercontent.com/b5d7eb49a30bfe6bdb5706fa3c9be95fe8e5956e/687474703a2f2f67696679752e636f6d2f696d616765732f70396b6e65772e676966)

### Table of Contents

1. [Installation](#installation)
2. [Customization](#prompt-customization)
    1. [Stylizing Your Prompt](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt)
    2. [Customizing Prompt Segments](#customizing-prompt-segments)
    3. [Available Prompt Segments](#available-prompt-segments)
3. [Troubleshooting](https://github.com/bhilburn/powerlevel9k/wiki/Troubleshooting)

Be sure to also [check out the Wiki](https://github.com/bhilburn/powerlevel9k/wiki)!

### Installation
There are two installation steps to go from a vanilla terminal to a PL9k
terminal. Once you are done, you can optionally customize your prompt.

[Installation Instructions](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions)

1. [Install the Powerlevel9k Theme](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-1-install-powerlevel9k)
2. [Install Powerline Fonts](https://github.com/bhilburn/powerlevel9k/wiki/Install-Instructions#step-2-install-a-powerline-font)

No configuration is necessary post-installation if you like the default
settings, but there are plenty of segment customization options available if you
are interested.

### Prompt Customization

Be sure to check out the wiki page on the additional prompt customization
options, including color and icon settings: [Stylizing Your Prompt](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt)

#### Customizing Prompt Segments
Customizing your prompt is easy! Select the segments you want to have displayed,
and then assign them to either the left or right prompt by adding the following
variables to your `~/.zshrc`.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_LEFT_PROMPT_ELEMENTS`|`(context dir vcs)`|Segment list for left prompt|
|`POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS`|`(status root_indicator background_jobs history time)`|Segment list for right prompt|


The table above shows the default values, so if you wanted to set these
variables manually, you would put the following in
your `~/.zshrc`:
```zsh
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir vcs)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status root_indicator background_jobs history time)
```
#### Available Prompt Segments
The segments that are currently available are:

**System Status Segments:**
* [`background_jobs`](#background_jobs) - Indicator for background jobs.
* [`battery`](#battery) - Current battery status.
* [`context`](#context) - Your username and host, conditionalized based on $USER and SSH status.
* [`date`](#date) - System date.
* [`dir`](#dir) - Your current working directory.
* `dir_writable` - Displays a lock icon, if you do not have write permissions on the current folder.
* [`disk_usage`](#disk_usage) - Disk usage of your current partition.
* `history` - The command number for the current line.
* [`host`](#host) - Your current host name
* [`ip`](#ip) - Shows the current IP address.
* [`vpn_ip`](#vpn_ip) - Shows the current VPN IP address.
* [`public_ip`](#public_ip) - Shows your public IP address.
* [`load`](#load) - Your machine's load averages.
* `os_icon` - Display a nice little icon, depending on your operating system.
* `ram` - Show free RAM.
* `root_indicator` - An indicator if the user has superuser status.
* [`status`](#status) - The return code of the previous command.
* `swap` - Prints the current swap size.
* [`time`](#time) - System time.
* [`user`](#user) - Your current username
* [`vi_mode`](#vi_mode)- Your prompt's Vi editing mode (NORMAL|INSERT).
* `ssh` - Indicates whether or not you are in an SSH session.

**Development Environment Segments:**
* [`vcs`](#vcs) - Information about this `git` or `hg` repository (if you are in one).

**Language Segments:**
* **GoLang Segments:**
    * `go_version` - Show the current GO version.
* **Javascript / Node.js Segments:**
    * `node_version` - Show the version number of the installed Node.js.
    * [`nodeenv`](#nodeenv) - [nodeenv](https://github.com/ekalinin/nodeenv) prompt for displaying node version and environment name.
    * `nvm` - Show the version of Node that is currently active, if it differs from the version used by NVM
* **PHP Segments:**
    * `php_version` - Show the current PHP version.
    * `laravel_version` - Show the current Laravel version.
    * [`symfony2_tests`](#symfony2_tests) - Show a ratio of test classes vs code classes for Symfony2.
    * `symfony2_version` - Show the current Symfony2 version, if you are in a Symfony2-Project dir.
* **Python Segments:**
    * [`virtualenv`](#virtualenv) - Your Python [VirtualEnv](https://virtualenv.pypa.io/en/latest/).
    * [`anaconda`](#anaconda) - Your active [Anaconda](https://www.continuum.io/why-anaconda) environment.
    * `pyenv` - Your active python version as reported by the first word of [`pyenv version`](https://github.com/yyuu/pyenv). Note that the segment is not displayed if that word is _system_ i.e. the segment is inactive if you are using system python.
* **Ruby Segments:**
    * [`chruby`](#chruby) - Ruby environment information using `chruby` (if one is active).
    * [`rbenv`](#rbenv) - Ruby environment information using `rbenv` (if one is active).
    * [`rspec_stats`](#rspec_stats) - Show a ratio of test classes vs code classes for RSpec.
    * `rvm` - Ruby environment information using `$GEM_HOME` and `$MY_RUBY_HOME` (if one is active).
* **Rust Segments:**
    * `rust_version` - Display the current rust version and [logo](https://www.rust-lang.org/logos/rust-logo-blk.svg).
* **Swift Segments:**
    * `swift_version` - Show the version number of the installed Swift.
* **Java Segments:**
    * `java_version` - Show the current Java version.

**Cloud Segments:**
* **AWS Segments:**
    * [`aws`](#aws) - The current AWS profile, if active.
    * `aws_eb_env` - The current Elastic Beanstalk Environment.
* `docker_machine` - The current Docker Machine.
* `kubecontext` - The current context of your `kubectl` configuration.
* `dropbox` - Indicates Dropbox directory and syncing status using `dropbox-cli`

**Other:**
* [`custom_command`](#custom_command) - Create a custom segment to display the
  output of an arbitrary command.
* [`command_execution_time`](#command_execution_time) - Display the time the current command took to execute.
* [`todo`](http://todotxt.com/) - Shows the number of tasks in your todo.txt tasks file.
* `detect_virt` - Virtualization detection with systemd
* `newline` - Continues the prompt on a new line.
* `openfoam` - Shows the currently sourced [OpenFOAM](https://openfoam.org/) environment.

---------------------------------------------------------------------------------


##### anaconda

This segment shows your active anaconda environment. It relies on either the
`CONDA_ENV_PATH` or the `CONDA_PREFIX` (depending on the `conda` version)
environment variable to be set which happens when you properly `source
activate` an environment.

Special configuration variables:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_ANACONDA_LEFT_DELIMITER`|"("|The left delimiter just before the environment name.|
|`POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER`|")"|The right delimiter just after the environment name.|

Additionally the following segment specific parameters can be used to customize
it: `POWERLEVEL9K_PYTHON_ICON`, `POWERLEVEL9K_ANACONDA_BACKGROUND`, and
`POWERLEVEL9K_ANACONDA_FOREGROUND`.

##### aws

If you would like to display the [current AWS
profile](http://docs.aws.amazon.com/cli/latest/userguide/installing.html), add
the `aws` segment to one of the prompts, and define `AWS_DEFAULT_PROFILE` in
your `~/.zshrc`:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`AWS_DEFAULT_PROFILE`|None|Your AWS profile name|

##### background_jobs

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE`|`true`|If there is more than one background job, this segment will show the number of jobs. Set this to `false` to turn this feature off.|
`POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS`|`false`|Always show the jobs count (even if it's zero).|

##### battery

The default settings for this segment will display your current battery status (fails gracefully on
systems without a battery). It is supported on both OSX and Linux (note that it requires `acpi` on Linux).

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_BATTERY_CHARGING`|`"yellow"`|Color to indicate a charging battery.|
|`POWERLEVEL9K_BATTERY_CHARGED`|`"green"`|Color to indicate a charged battery.|
|`POWERLEVEL9K_BATTERY_DISCONNECTED`|`$DEFAULT_COLOR`|Color to indicate absence of battery.|
|`POWERLEVEL9K_BATTERY_LOW_THRESHOLD`|`10`|Threshold to consider battery level critical.|
|`POWERLEVEL9K_BATTERY_LOW_COLOR`|`"red"`|Color to indicate critically low charge level.|
|`POWERLEVEL9K_BATTERY_VERBOSE`|`true`|Display time remaining next to battery level.|
|`POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD`|`unset`|Threshold from which the battery segment should not be displayed.|

Note that you can [modify the `_FOREGROUND`
color](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#segment-color-customization)
without affecting the icon color.

You can also change the battery icon automatically depending on the battery
level. This will override the default battery icon. In order to do this, you
need to define the `POWERLEVEL9k_BATTERY_STAGES` variable.


| Variable                      | Default Value | Description                                                   |
|-------------------------------|---------------|---------------------------------------------------------------|
| `POWERLEVEL9K_BATTERY_STAGES` | Unset         | A string or array, which each index indicates a charge level. |

Powerlevel9k will use each index of the string or array as a stage to indicate battery
charge level, progressing from left to right. You can provide any number of
stages. The setting below, for example, provides 8 stages for Powerlevel9k to use.
```zsh
POWERLEVEL9K_BATTERY_STAGES="▁▂▃▄▅▆▇█"
```

If you require extra spacing after the icon, you will have to set it as an array,
since spaces in the string will be used as one of the stages and you will get a
missing icon. To do this, declare the variable as follows:
```zsh
POWERLEVEL9K_BATTERY_STAGES=($'\u2581 ' $'\u2582 ' $'\u2583 ' $'\u2584 ' $'\u2585 ' $'\u2586 ' $'\u2587 ' $'\u2588 ')
```

Using the array syntax, you can create stages comprised of multiple characters.
The below setting provides 40 battery stages.
```zsh
POWERLEVEL9K_BATTERY_STAGES=(
   $'▏    ▏' $'▎    ▏' $'▍    ▏' $'▌    ▏' $'▋    ▏' $'▊    ▏' $'▉    ▏' $'█    ▏'
   $'█▏   ▏' $'█▎   ▏' $'█▍   ▏' $'█▌   ▏' $'█▋   ▏' $'█▊   ▏' $'█▉   ▏' $'██   ▏'
   $'██   ▏' $'██▎  ▏' $'██▍  ▏' $'██▌  ▏' $'██▋  ▏' $'██▊  ▏' $'██▉  ▏' $'███  ▏'
   $'███  ▏' $'███▎ ▏' $'███▍ ▏' $'███▌ ▏' $'███▋ ▏' $'███▊ ▏' $'███▉ ▏' $'████ ▏'
   $'████ ▏' $'████▎▏' $'████▍▏' $'████▌▏' $'████▋▏' $'████▊▏' $'████▉▏' $'█████▏' )
```

You can also change the background of the segment automatically depending on the
battery level. This will override the following variables:
`POWERLEVEL9K_BATTERY_CHARGING`, `POWERLEVEL9K_BATTERY_CHARGED`,
`POWERLEVEL9K_BATTERY_DISCONNECTED`, and `POWERLEVEL9K_BATTERY_LOW_COLOR`. In
order to do this, define a color array, from low to high, as shown below:
```zsh
POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND=(red1 orangered1 darkorange orange1 gold1 yellow1 yellow2 greenyellow chartreuse1 chartreuse2 green1)
```

As with the battery stages, you can use any number of colors and Powerlevel9k
will automatically use all of them appropriately.

Some example settings:

| Brightness     | Possible Array                                                                                                |
|----------------|---------------------------------------------------------------------------------------------------------------|
| Bright Colors  | `(red1 orangered1 darkorange orange1 gold1 yellow1 yellow2 greenyellow chartreuse1 chartreuse2 green1)`       |
| Normal Colors  | `(red3 darkorange3 darkgoldenrod gold3 yellow3 chartreuse2 mediumspringgreen green3 green3 green4 darkgreen)` |
| Subdued Colors | `(darkred orange4 yellow4 yellow4 chartreuse3 green3 green4 darkgreen)`                                       |

##### chruby

This segment shows the version of Ruby being used when using `chruby` to change your current Ruby stack.

It uses `$RUBY_ENGINE` and `$RUBY_VERSION` as set by `chruby`.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_CHRUBY_SHOW_ENGINE`|true|Show the currently selected Ruby engine (e.g. `ruby`, `jruby`, `rbx`, etc)
|`POWERLEVEL9K_CHRUBY_SHOW_VERSION`|true|Shows the currently selected engine's version (e.g. `2.5.1`)

##### command_execution_time

Display the time the previous command took to execute if the time is above
`POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD`. The time is formatted to be
"human readable", and so scales the units based on the length of execution time.
If you want more precision, just set the
`POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION` field.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD`|3|Threshold above which to print this segment. Can be set to `0` to always print.|
|`POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION`|2|Number of digits to use in the fractional part of the time value.|

##### custom_command

The `custom_...` segment allows you to turn the output of a custom command into
a prompt segment. As an example, if you wanted to create a custom segment to
display your WiFi signal strength, you might define a custom segment called
`custom_wifi_signal` like this:
```zsh
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context time battery dir vcs virtualenv custom_wifi_signal)
POWERLEVEL9K_CUSTOM_WIFI_SIGNAL="echo signal: \$(nmcli device wifi | grep yes | awk '{print \$8}')"
POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_BACKGROUND="blue"
POWERLEVEL9K_CUSTOM_WIFI_SIGNAL_FOREGROUND="yellow"
```
If you prefer, you can also define the function in your `.zshrc` rather than
putting it in-line with the variable export, as shown above. Just don't forget
to invoke your function from your segment! Example code that achieves the same
result as the above:
```zsh
zsh_wifi_signal(){
    local signal=$(nmcli device wifi | grep yes | awk '{print $8}')
    local color='%F{yellow}'
    [[ $signal -gt 75 ]] && color='%F{green}'
    [[ $signal -lt 50 ]] && color='%F{red}'
    echo -n "%{$color%}\uf230  $signal%{%f%}" # \uf230 is 
}

POWERLEVEL9K_CUSTOM_WIFI_SIGNAL="zsh_wifi_signal"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context time battery dir vcs virtualenv custom_wifi_signal)
```
The command, above, gives you the wireless signal segment shown below:

![signal](http://i.imgur.com/hviMATC.png)

You can define as many custom segments as you wish. If you think you have
a segment that others would find useful, please consider upstreaming it to the
main theme distribution so that everyone can use it!

##### context

The `context` segment (user@host string) is conditional. By default, it will
only print if you are not your 'normal' user (including if you are root), or if
you are SSH'd to a remote host. `SUDO` and `REMOTE_SUDO` states are also available to show whether the current user or remote user has superuser privileges.

To use this feature, make sure the `context` segment is enabled in your prompt
elements (it is by default), and define a `DEFAULT_USER` in your `~/.zshrc`.

You can customize the `context` segment. For example, you can make it to print the
full hostname by setting

```
POWERLEVEL9K_CONTEXT_TEMPLATE="%n@`hostname -f`"
```

You can set the `POWERLEVEL9K_CONTEXT_HOST_DEPTH` variable to change how the
hostname is displayed. See [ZSH Manual](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Login-information)
for details. The default is set to %m which will show the hostname up to the first ‘.’
You can set it to %{N}m where N is an integer to show that many segments of system
hostname. Setting N to a negative integer will show that many segments from the
end of the hostname.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`DEFAULT_USER`|None|Username to consider a "default context" (you can also set `$USER`).|
|`POWERLEVEL9K_ALWAYS_SHOW_CONTEXT`|false|Always show this segment, including $USER and hostname.|
|`POWERLEVEL9K_ALWAYS_SHOW_USER`|false|Always show the username, but conditionalize the hostname.|
|`POWERLEVEL9K_CONTEXT_TEMPLATE`|%n@%m|Default context prompt (username@machine). Refer to the [ZSH Documentation](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) for all possible expansions, including deeper host depths.|

This segment can have different states. They might help you to visualize your
different privileges. Read more about styling with states [here](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#special-segment-colors).

| State         | Meaning                                                  |
|---------------|----------------------------------------------------------|
| `DEFAULT`     | You are a normal user                                    |
| `ROOT`        | You are the root user                                    |
| `SUDO`        | You are using elevated rights                            |
| `REMOTE_SUDO` | You are SSH'ed into the machine and have elevated rights |
| `REMOTE`      | You are SSH'ed into the machine                          |

##### date

The `date` segment shows the current system date.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_DATE_FORMAT`|`%D{%d.%m.%y}`|[ZSH time format](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Date-and-time) to use in this segment.|

##### dir

The `dir` segment shows the current working directory. When using the "Awesome
Powerline" fonts, there are additional glyphs, as well:

| `Compatible` | `Powerline` | `Awesome Powerline` | Situation
|------------|-----------|-------------------|----------------------------
| None       | None      | ![](https://cloud.githubusercontent.com/assets/1544760/12183451/40ec4016-b58f-11e5-9b9e-74e2b2f0b8b3.png) | At the root of your home folder |
| None       | None      | ![](https://cloud.githubusercontent.com/assets/1544760/12369315/8a5d762c-bbf5-11e5-8a20-ca1179f48d6c.png) | Within a subfolder of your home directory |
| None       | None      | ![](https://cloud.githubusercontent.com/assets/1544760/12183452/40f79286-b58f-11e5-9b8c-ed1343a07b08.png) | Outside of your home folder |
| None       | None      | ⚙ | Within the `/etc` directory |

To turn off these icons you could set these variables to an empty string.
```zsh
POWERLEVEL9K_HOME_ICON=''
POWERLEVEL9K_HOME_SUB_ICON=''
POWERLEVEL9K_FOLDER_ICON=''
POWERLEVEL9K_ETC_ICON=''
```
You can limit the output to a certain length by truncating long paths.
Customizations available are:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_DIR_PATH_ABSOLUTE`|None|If set to `true`, will use absolute paths instead of home folder abbreviation `~`|
|`POWERLEVEL9K_SHORTEN_DIR_LENGTH`|`2`|If your shorten strategy, below, is entire directories, this field determines how many directories to leave at the end. If your shorten strategy is by character count, this field determines how many characters to allow per directory string.|
|`POWERLEVEL9K_SHORTEN_STRATEGY`|None|How the directory strings should be truncated. See the table below for more informations.|
|`POWERLEVEL9K_SHORTEN_DELIMITER`|`..`|Delimiter to use in truncated strings. This can be any string you choose, including an empty string if you wish to have no delimiter.|

| Strategy Name | Description |
|---------------|-------------|
|Default|Truncate whole directories from left. How many is defined by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`|
|`truncate_absolute_chars`|Truncates an absolute number of characters from the left such that the number of characters that your path displays (with or without `POWERLEVEL9K_SHORTEN_DELIMITER`) is no more than `POWERLEVEL9K_SHORTEN_DIR_LENGTH` + the length of `POWERLEVEL9K_SHORTEN_DELIMITER` |
|`truncate_middle`|Truncates the middle part of a folder. E.g. you are in a folder named `~/MySuperProjects/AwesomeFiles/BoringOffice`, then it will truncated to `~/MyS..cts/Awe..les/BoringOffice`, if `POWERLEVEL9K_SHORTEN_DIR_LENGTH=3` is also set (controls the amount of characters to be left).|
|`truncate_from_right`|Just leaves the beginning of a folder name untouched. E.g. your folders will be truncated like so: `/ro../Pr../office`. How many characters will be untouched is controlled by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`.|
|`truncate_absolute`|Truncates everything exept the last few characters in the path. E.g. if you are in a folder named `~/Projects/powerlevel9k` and you have set `POWERLEVEL9K_SHORTEN_DIR_LENGTH=3`, you will get `..l9k`.|
|`truncate_to_last`|Truncates everything before the last folder in the path.|
|`truncate_to_first_and_last`|Truncate middle directories from the path. How many directories will be untouched is controlled by `POWERLEVEL9K_SHORTEN_DIR_LENGTH`. E.g. if you are in a folder named `~/Projects/powerlevel9k` and you have set `POWERLEVEL9K_SHORTEN_DIR_LENGTH=1`, you will get `~/../powerlevel9k`.||
|`truncate_to_unique`|Parse all parent path components and truncate them to the shortest unique length. If you copy & paste the result to a shell, after hitting `TAB` it should expand to the original path unambiguously.|
|`truncate_with_package_name`|Search for a `package.json` or `composer.json` and prints the `name` field to abbreviate the directory path. The precedence and/or files could be set by `POWERLEVEL9K_DIR_PACKAGE_FILES=(package.json composer.json)`. If you have [jq](https://stedolan.github.io/jq/) installed, it will dramatically improve the speed of this strategy.|
|`truncate_with_folder_marker`|Search for a file that is specified by `POWERLEVEL9K_SHORTEN_FOLDER_MARKER` and truncate everything before that (if found, otherwise stop on $HOME and ROOT).|

For example, if you wanted the truncation behavior of the `fish` shell, which
truncates `/usr/share/plasma` to `/u/s/plasma`, you would use the following:
```zsh
POWERLEVEL9K_SHORTEN_DIR_LENGTH=1
POWERLEVEL9K_SHORTEN_DELIMITER=""
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_from_right"
```
In each case you have to specify the length you want to shorten the directory
to. So in some cases `POWERLEVEL9K_SHORTEN_DIR_LENGTH` means characters, in
others whole directories.

The `truncate_with_package_name` strategy gives your directory path relative to the root of your project.  For example, if you have a project inside `$HOME/projects/my-project` with a `package.json` that looks like:

```json
{
  "name": "my-cool-project"
}
```

The path shown would be `my-cool-project`.  If you navigate to `$HOME/projects/my-project/src`, then the path shown would be `my-cool-project/src`.  Please note that this currently looks for `.git` directory to determine the root of the project.

If you want to customize the directory separator, you could set:
```zsh
# Double quotes are important here!
POWERLEVEL9K_DIR_PATH_SEPARATOR="%F{red} $(print_icon 'LEFT_SUBSEGMENT_SEPARATOR') %F{black}"
```
To omit the first character (usually a slash that gets replaced if you set `POWERLEVEL9K_DIR_PATH_SEPARATOR`),
you could set `POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER=true`.

You can also customize the leading tilde character when you are in `$HOME` using:
```zsh
# Double quotes are important here!
POWERLEVEL9K_HOME_FOLDER_ABBREVIATION="%F{red} $(print_icon 'HOME_ICON') %F{black}"
```
You can also configure the `dir` segment to show when you are in a directory without write permissions, using the variable below.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_DIR_SHOW_WRITABLE`|`false`|If set to `true` and you are in a directory that you do not have write permissions for, this segment will display a lock icon and enter the `NOT_WRITABLE` state (which can be customized per [our usual process](https://github.com/bhilburn/powerlevel9k/wiki/Stylizing-Your-Prompt#segment-color-customization)). Note that this functionality is also available in a separate segment, `dir_writable`.|

If you want to customize the last directory of the path, you can now set `POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND` to a custom color and/or `POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD=true` to display that part in bold.

You can also color the separator separately by setting the color using `POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND`.

##### disk_usage

The `disk_usage` segment will show the usage level of the partition that your current working directory resides in. It can be configured with the following variables.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_DISK_USAGE_ONLY_WARNING`|false|Hide the segment except when usage levels have hit warning or critical levels.|
|`POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL`|90|The usage level that triggers a warning state.|
|`POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL`|95|The usage level that triggers a critical state.|

##### host

The `host` segment will print the hostname.

You can set the `POWERLEVEL9K_HOST_TEMPLATE` variable to change how the hostname
is displayed. See (ZSH Manual)[http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Login-information]
for details. The default is set to `%m` which will show the hostname up to the
first `.`. You can set it to `%{N}m` where N is an integer to show that many
segments of system hostname. Setting `N` to a negative integer will show that many
segments from the end of the hostname.

```
POWERLEVEL9K_HOST_TEMPLATE="%2m"
```

By default, LOCAL hosts will show the host icon and remote hosts will show the SSH icon. You can override them by setting
```
POWERLEVEL9K_HOST_ICON="\uF109 "
POWERLEVEL9K_SSH_ICON="\uF489 "
```


##### ip

This segment tries to examine all currently used network interfaces and prints
the first address it finds.  In the case that this is not the right NIC, you can
specify the correct network interface by setting:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_IP_INTERFACE`|None|The NIC for which you wish to display the IP address. Example: `eth0`.|

##### vpn_ip

This segment tries to extract the VPN related IP addresses from nmcli, based on the NIC type:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_VPN_IP_INTERFACE`|`tun`|The VPN interface.|

##### public_ip

This segment will display your public IP address. There are several methods of obtaining this
information and by default it will try all of them starting with the most efficient. You can
also specify which method you would like it to use. The methods available are dig using opendns,
curl, or wget. The host used for wget and curl is http://ident.me by default but can be set to
another host if you prefer.

If you activate a VPN, the icon for this segment will change to the defined VPN icon.

The public_ip segment will attempt to update your public IP address every 5 minutes by default(also
configurable by the user). If you lose connection your cached IP address will be displayed until
your timeout expires at which point every time your prompt is generated a new attempt will be made.
Until an IP is successfully pulled the value of $POWERLEVEL9K_PUBLIC_IP_NONE will be displayed for
this segment. If this value is empty(the default)and $POWERLEVEL9K_PUBLIC_IP_FILE is empty the
segment will not be displayed.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_PUBLIC_IP_FILE`|'/tmp/p9k_public_ip'|This is the file your public IP is cached in.|
|`POWERLEVEL9K_PUBLIC_IP_HOST`|'http://ident.me'|This is the default host to get your public IP.|
|`POWERLEVEL9K_PUBLIC_IP_TIMEOUT`|300|The amount of time in seconds between refreshing your cached IP.|
|`POWERLEVEL9K_PUBLIC_IP_METHODS`|(dig curl wget)| These methods in that order are used to refresh your IP.|
|`POWERLEVEL9K_PUBLIC_IP_NONE`|None|The string displayed when an IP was not obtained|

##### load

Displays one of your load averages with appropriate state coloring. The thresholds are:
- `0.7 * NUM_CORES <`: critical
- `0.5 * NUM_CORES <`: warning
- `less`: normal

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_LOAD_WHICH`|5|Which average to show. Possible values: 1, 5 or 15|

##### newline

Puts a newline in your prompt so you can continue using segments on the next
line. This allows you to use segments on both lines, unlike
`POWERLEVEL9K_PROMPT_ON_NEWLINE`, which simply separates segments from the
prompt itself.

This only works on the left side.  On the right side it does nothing.

##### nodeenv

Shows the currently used [nodeenv](https://github.com/ekalinin/nodeenv). To avoid
Nodeenvs activate command from interfering with Powerlevel9k, you should set
`NODE_VIRTUAL_ENV_DISABLE_PROMPT=1` in your `~/.zshrc`.

##### rbenv

This segment shows the version of Ruby being used when using `rbenv` to change your current Ruby stack.

It figures out the version being used by taking the output of the `rbenv version-name` command.

* If `rbenv` is not in $PATH, nothing will be shown.
* By default, if the current local Ruby version is the same as the global Ruby version, nothing will be shown. See the configuration variable, below, to modify this behavior.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW`|`false`|Set to true if you wish to show the rbenv segment even if the current Ruby version is the same as the global Ruby version|

##### pyenv

This segment shows the version of Python being used when using `pyenv` to change your current Python stack.

The `PYENV_VERSION` environment variable will be used if specified. Otherwise it figures out the version being used by taking the output of the `pyenv version-name` command.

* If `pyenv` is not in $PATH, nothing will be shown.
* If the current Python version is the same as the global Python version, nothing will be shown.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW`|`false`|Set to true if you wish to show the pyenv segment even if the current Python version is the same as the global Python version|

##### rspec_stats

See [Unit Test Ratios](#unit-test-ratios), below.

##### status

This segment shows the return code of the last command.

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_STATUS_CROSS`|`false`|Set to true if you wish not to show the error code when the last command returned an error and optionally hide this segment when the last command completed successfully by setting `POWERLEVEL9K_STATUS_OK` to false.|
|`POWERLEVEL9K_STATUS_OK`|`true`|Set to true if you wish to show this segment when the last command completed successfully, false to hide it.|
|`POWERLEVEL9K_STATUS_SHOW_PIPESTATUS`|`true`|Set to true if you wish to show the exit status for all piped commands.|
|`POWERLEVEL9K_STATUS_HIDE_SIGNAME`|`false`|Set to true return the raw exit code (`1-255`).  When set to false, values over 128 are shown as `SIGNAME(-n)` (e.g. `KILL(-9)`)|

##### ram

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_RAM_ELEMENTS`|Both|Specify `ram_free` or `swap_used` to only show one or the other rather than both.|

##### symfony2_tests

See [Unit Test Ratios](#unit-test-ratios), below.

##### time

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_TIME_FORMAT`|`'H:M:S'`|ZSH time format to use in this segment.|

As an example, if you wanted a reversed time format, you would use this:
```zsh
# Reversed time format
POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}'
```
If you are using an "Awesome Powerline Font", you can add a time symbol to this
segment, as well:
```zsh
# Output time, date, and a symbol from the "Awesome Powerline Font" set
POWERLEVEL9K_TIME_FORMAT="%D{%H:%M:%S \uE868  %d.%m.%y}"
```
##### user

The `user` segment will print the username.

You can also override the icons by setting:

```
POWERLEVEL9K_USER_ICON="\uF415" # 
POWERLEVEL9K_ROOT_ICON="#"
POWERLEVEL9K_SUDO_ICON=$'\uF09C' # 
```

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`DEFAULT_USER`|None|Username to consider a "default context".|
|`POWERLEVEL9K_ALWAYS_SHOW_USER`|`false`|Always print this segment.|
|`POWERLEVEL9K_USER_TEMPLATE`|`%n`|Default username prompt. Refer to the [ZSH Documentation](http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html) for all possible expansions|

##### vcs

By default, the `vcs` segment will provide quite a bit of information. Further
customization is provided via:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_HIDE_BRANCH_ICON`|`false`|Set to `true` to hide the branch icon from the segment.|
|`POWERLEVEL9K_SHOW_CHANGESET`|`false`|Set to `true` to display the hash / changeset in the segment.|
|`POWERLEVEL9K_CHANGESET_HASH_LENGTH`|`12`|How many characters of the hash / changeset to display in the segment.|
|`POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY`|`true`|Set to `false` to not reflect submodule status in the top-level repository prompt.|
|`POWERLEVEL9K_VCS_HIDE_TAGS`|`false`|Set to `true` to stop tags being displayed in the segment.|
|`POWERLEVEL9K_VCS_GIT_HOOKS`|`(vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname)`|Layout of the segment for git repositories.|
|`POWERLEVEL9K_VCS_HG_HOOKS`|`(vcs-detect-changes)`|Layout of the segment for Mercurial repositories.|
|`POWERLEVEL9K_VCS_SVN_HOOKS`|`(vcs-detect-changes svn-detect-changes)`|Layout of the segment for SVN repositories.|
|`POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND`|`red`|The color of the foreground font during actions (e.g., `REBASE`).|


##### vcs symbols

The `vcs` segment uses various symbols to tell you the state of your repository.
These symbols depend on your installed font and selected `POWERLEVEL9K_MODE`
from the [Installation](#Installation) section above.

| `Compatible` | `Powerline` | `Awesome Powerline` | Explanation
|--------------|---------------------|-------------------|--------------------------
| `↑4`         | `↑4`                | ![icon_outgoing](https://cloud.githubusercontent.com/assets/1544760/7976089/b5904d6e-0a76-11e5-8147-5e873ac52d79.gif)4  | Number of commits your repository is ahead of your remote branch
| `↓5`         | `↓5`                | ![icon_incoming](https://cloud.githubusercontent.com/assets/1544760/7976091/b5909c9c-0a76-11e5-9cad-9bf0a28a897c.gif)5  | Number of commits your repository is behind of your remote branch
| `⍟3`         | `⍟3`                | ![icon_stash](https://cloud.githubusercontent.com/assets/1544760/7976094/b5ae9346-0a76-11e5-8cc7-e98b81824118.gif)3 | Number of stashes, here 3.
| `●`          | `●`                 | ![icon_unstaged](https://cloud.githubusercontent.com/assets/1544760/7976096/b5aefa98-0a76-11e5-9408-985440471215.gif) | There are unstaged changes in your working copy
| `✚`          | `✚`                 | ![icon_staged](https://cloud.githubusercontent.com/assets/1544760/7976095/b5aecc8a-0a76-11e5-8988-221afc6e8982.gif) | There are staged changes in your working copy
| `?`          | `?`                 | ![icon_untracked](https://cloud.githubusercontent.com/assets/1544760/7976098/b5c7a2e6-0a76-11e5-8c5b-315b595b2bc4.gif)  | There are files in your working copy, that are unknown to your repository
| `→`          | `→`                 | ![icon_remote_tracking_branch](https://cloud.githubusercontent.com/assets/1544760/7976093/b5ad2c0e-0a76-11e5-9cd3-62a077b1b0c7.gif) | The name of your branch differs from its tracking branch.
| `☿`          | `☿`                 | ![icon_bookmark](https://cloud.githubusercontent.com/assets/1544760/7976197/546cfac6-0a78-11e5-88a6-ce3a1e0a174e.gif) | A mercurial bookmark is active.
| `@`         | ![icon_branch_powerline](https://cloud.githubusercontent.com/assets/1544760/8000852/e7e8d8a0-0b5f-11e5-9834-de9b25c92284.gif) | ![](https://cloud.githubusercontent.com/assets/1544760/7976087/b58bbe3e-0a76-11e5-8d0d-7a5c1bc7f730.gif) | Branch Icon
| None         |  None               | ![icon_commit](https://cloud.githubusercontent.com/assets/1544760/7976088/b58f4e50-0a76-11e5-9e70-86450d937030.gif)2c3705 | The current commit hash. Here "2c3705"
| None         |  None               | ![icon_git](https://cloud.githubusercontent.com/assets/1544760/7976092/b5909f80-0a76-11e5-9950-1438b9d72465.gif) | Repository is a git repository
| None         |  None               | ![icon_mercurial](https://cloud.githubusercontent.com/assets/1544760/7976090/b5908da6-0a76-11e5-8c91-452b6e73f631.gif) | Repository is a Mercurial repository

##### vcs truncation

You can limit the branch name to a certain length by truncating long names.
Customizations available are:

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_VCS_SHORTEN_LENGTH`|None|This field determines how many characters to show.|
|`POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH`|None|This field determines minimum branch length. Branch name will be truncated if its length greater than this field.|
|`POWERLEVEL9K_VCS_SHORTEN_STRATEGY`|None|This field determines how branch name should be truncated. See the table below for more information.|
|`POWERLEVEL9K_SHORTEN_DELIMITER`|`...`|Delimiter to use in truncated strings. This can be any string you choose, including an empty string if you wish to have no delimiter.|

| Strategy Name | Description |
|---------------|-------------|
|`truncate_middle`|Truncates the middle part of a branch. E.g. branch name is `1234-super_super_long_branch_name`, then it will truncated to `1234-..._name`, if `POWERLEVEL9K_VCS_SHORTEN_LENGTH=5` is also set (controls the amount of characters to be left).|
|`truncate_from_right`|Just leaves the beginning of a branch name untouched. E.g. branch name will be truncated like so: `1234-...`. How many characters will be untouched is controlled by `POWERLEVEL9K_VCS_SHORTEN_LENGTH`.|

For example, if you want to truncate `1234-super_super_long_branch_name` to `1234-..` and don't do it with `development`:
```zsh
POWERLEVEL9K_VCS_SHORTEN_LENGTH=4
POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH=11
POWERLEVEL9K_VCS_SHORTEN_STRATEGY="truncate_from_right"
POWERLEVEL9K_VCS_SHORTEN_DELIMITER=".."
```

##### vi_mode

This segment shows ZSH's current input mode. Note that this is only useful if
you are using the [ZSH Line Editor](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html)
(VI mode).  You can enable this either by `.zshrc` configuration or using a plugin, like
[Oh-My-Zsh's vi-mode plugin](https://github.com/robbyrussell/oh-my-zsh/blob/master/plugins/vi-mode/vi-mode.plugin.zsh).

| Variable | Default Value | Description |
|----------|---------------|-------------|
|`POWERLEVEL9K_VI_INSERT_MODE_STRING`|`"INSERT"`|String to display while in 'Insert' mode.|
|`POWERLEVEL9K_VI_COMMAND_MODE_STRING`|`"NORMAL"`|String to display while in 'Command' mode.|

To hide the segment entirely when in `INSERT` mode, set `POWERLEVEL9K_VI_INSERT_MODE_STRING=''`

##### virtualenv

This segment shows your Python [VirtualEnv](https://virtualenv.pypa.io/en/latest/). To avoid
VirtualEnvs activate command from interfering with Powerlevel9k, you should set
`VIRTUAL_ENV_DISABLE_PROMPT=1` in your `~/.zshrc`.

#### Unit Test Ratios

The `symfony2_tests` and `rspec_stats` segments both show a ratio of "real"
classes vs test classes in your source code. This is just a very simple ratio,
and does not show your code coverage or any sophisticated stats. All this does
is count your source files and test files, and calculate the ratio between them.
Just enough to give you a quick overview about the test situation of the project
you are dealing with.

### Disabling / Enabling Powerlevel9k

You can disable P9k and return to a very basic prompt at any time simply by
calling:

```zsh
$ prompt_powerlevel9k_teardown
```

You can then re-enable it by calling:

```zsh
$ prompt_powerlevel9k_setup
```

### tl; dr

Want to just get a quick start? Check out the [Show Off Your
Config](https://github.com/bhilburn/powerlevel9k/wiki/Show-Off-Your-Config)
portion of the wiki to get going.

[The Wiki also has a ton of other useful
information!](https://github.com/bhilburn/powerlevel9k/wiki)

### License

Project: MIT

Logo: CC-BY-SA. Source repository: https://github.com/bhilburn/powerlevel9k-logo


================================================
FILE: TESTS.md
================================================
# Tests

## Automated Tests

The Unit-Tests do not follow exactly the file structure of Powerlevel9k itself,
but we try to reflect the structure as much as possible. All tests are located
under `test/`. Segment specific tests under `test/segments/` (one file per
segment).

### Installation

In order to execute the tests you need to install `shunit2`, which is a
submodule. To install the submodule, you can execute 
`git submodule init && git submodule update`.

### Executing tests

The tests are shell scripts on their own. So you can execute them right away.
To execute all tests you could just execute `./test/suite.spec`.

### General Test Structure

The tests usually have a `setUp()` function which is executed before every
test function. Speaking of, test functions must be prefixed with `test`. In
the tests, you can do [different Assertions](https://github.com/kward/shunit2#-asserts).
It is always a good idea to mock the program you want to test (just have a
look at other tests), so that the testrunner does not have to have all
programs installed.

### Travis

We use [Travis](https://travis-ci.org/) for Continuous Integration. This
service executes our tests after every push. For now, we need to tell travis
where to find the tests, which is what happens in the `.travis.yml` file.

## Manual Testing

If unit tests are not sufficient (e.g. you have an issue with your prompt that
occurs only in a specific ZSH framework) then you can use either Docker or
or our Vagrant.

### Docker

This is the easiest to use _if_ you have Docker already installed and running.

The command `./test-in-docker` should make it fairly easy to get into a running
container with the framework of your choice.

Examples:

``` zsh
# Test Antigen with the oldest version of ZSH
$ ./test-in-docker antigen
```

``` zsh
# Test Prezto with ZSH version 5.2
$ ./test-in-docker --zsh 5.2 prezto
```

You can get Docker at <https://www.docker.com/community-edition>.

**Note:** Not all frameworks work with all versions of ZSH (or the underlying OS).

### Vagrant

Currently there are two test VMs. `test-vm` is an Ubuntu machine with several
pre-installed ZSH frameworks. And there is `test-bsd-vm` which is a FreeBSD!
For how to run the machines see [here](test-vm/README.md).


================================================
FILE: debug/font-issues.zsh
================================================
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8

source functions/colors.zsh
source functions/icons.zsh
source functions/utilities.zsh
# Map our $OS to neofetch $os
os="$OS"


trim() {
    set -f
    # shellcheck disable=2048,2086
    set -- $*
    printf '%s\n' "${*//[[:space:]]/}"
    set +f
}

trim_quotes() {
    trim_output="${1//\'}"
    trim_output="${trim_output//\"}"
    printf "%s" "$trim_output"
}

get_ppid() {
    # Get parent process ID of PID.
    case "$os" in
        "Windows")
            ppid="$(ps -p "${1:-$PPID}" | awk '{printf $2}')"
            ppid="${ppid/PPID}"
        ;;

        "Linux")
            ppid="$(grep -i -F "PPid:" "/proc/${1:-$PPID}/status")"
            ppid="$(trim "${ppid/PPid:}")"
        ;;

        *)
            ppid="$(ps -p "${1:-$PPID}" -o ppid=)"
        ;;
    esac

    printf "%s" "$ppid"
}

get_process_name() {
    # Get PID name.
    case "$os" in
        "Windows")
            name="$(ps -p "${1:-$PPID}" | awk '{printf $8}')"
            name="${name/COMMAND}"
            name="${name/*\/}"
        ;;

        "Linux")
            name="$(< "/proc/${1:-$PPID}/comm")"
        ;;

        *)
            name="$(ps -p "${1:-$PPID}" -o comm=)"
        ;;
    esac

    printf "%s" "$name"
}

# Taken from NeoFetch (slightly modified)
get_term() {
    local term

    # If function was run, stop here.
    # ((term_run == 1)) && return

    # Workaround for macOS systems that
    # don't support the block below.
    case "$TERM_PROGRAM" in
        "iTerm.app")    term="iTerm2" ;;
        "Terminal.app") term="Apple Terminal" ;;
        "Hyper")        term="HyperTerm" ;;
        *)              term="${TERM_PROGRAM/\.app}" ;;
    esac

    # Most likely TosWin2 on FreeMiNT - quick check
    [[ "$TERM" == "tw52" || "$TERM" == "tw100" ]] && \
        term="TosWin2"

    [[ "$SSH_CONNECTION" ]] && \
        term="$SSH_TTY"

    # Check $PPID for terminal emulator.
    while [[ -z "$term" ]]; do
        parent="$(get_ppid "$parent")"
        [[ -z "$parent" ]] && break
        name="$(get_process_name "$parent")"

        case "${name// }" in
            "${SHELL/*\/}"|*"sh"|"screen"|"su"*) ;;

            "login"*|*"Login"*|"init"|"(init)")
                term="$(tty)"
            ;;

            "ruby"|"1"|"tmux"*|"systemd"|"sshd"*|"python"*|"USER"*"PID"*|"kdeinit"*|"launchd"*)
                break
            ;;

            "gnome-terminal-") term="gnome-terminal" ;;
            "urxvtd")          term="urxvt" ;;
            *"nvim")           term="Neovim Terminal" ;;
            *"NeoVimServer"*)  term="VimR Terminal" ;;
            *)                 term="${name##*/}" ;;
        esac
    done

    # Log that the function was run.
    # term_run=1

    echo "${term}"
}

get_term_font() {
    local confs term_font mateterm_config role profile xrdb child profile_filename
    local term="${1}"
    # ((term_run != 1)) && get_term

    case "$term" in
        "alacritty"*)
            setopt nullglob
            confs=({$XDG_CONFIG_HOME,$HOME}/{alacritty,}/{.,}alacritty.ym?)
            unsetopt nullglob

            [[ -f "${confs[1]}" ]] || return

            term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${confs[1]}")"
            term_font="${term_font/*family:}"
            term_font="${term_font/$'\n'*}"
            term_font="${term_font/\#*}"
        ;;

        "Apple_Terminal")
            term_font="$(osascript <<END
                         tell application "Terminal" to font name of window frontmost
END
)"
        ;;

        "iTerm2")
            # Unfortunately the profile name is not unique, but it seems to be the only thing
            # that identifies an active profile. There is the "id of current session of current win-
            # dow" though, but that does not match to a guid in the plist.
            # So, be warned, collisions may occur!
            # See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg
            local current_profile_name profiles_count profile_name diff_font

            current_profile_name="$(osascript <<END
                                    tell application "iTerm2" to profile name \
                                    of current session of current window
END
)"

            # Warning: Dynamic profiles are not taken into account here!
            # https://www.iterm2.com/documentation-dynamic-profiles.html
            font_file="${HOME}/Library/Preferences/com.googlecode.iterm2.plist"

            # Count Guids in "New Bookmarks"; they should be unique
            profiles_count="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:'" "$font_file" 2>/dev/null | \
                              grep -w -c "Guid")"

            for ((i=0; i<profiles_count; i++)); do
                profile_name="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Name:'" "$font_file" 2>/dev/null)"

                if [[ "$profile_name" == "$current_profile_name" ]]; then
                    # "Normal Font"
                    term_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Normal Font:'" \
                                 "$font_file" 2>/dev/null)"

                    # Font for non-ascii characters
                    # Only check for a different non-ascii font, if the user checked
                    # the "use a different font for non-ascii text" switch.
                    diff_font="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Use Non-ASCII Font:'" \
                                 "$font_file" 2>/dev/null)"

                    if [[ "$diff_font" == "true" ]]; then
                        non_ascii="$(/usr/libexec/PlistBuddy -c "Print ':New Bookmarks:${i}:Non Ascii Font:'" \
                                     "$font_file" 2>/dev/null)"

                        [[ "$term_font" != "$non_ascii" ]] && \
                            term_font="$term_font (normal) / $non_ascii (non-ascii)"
                    fi
                fi
            done
        ;;

        "deepin-terminal"*)
            term_font="$(awk -F '=' '/font=/ {a=$2} /font_size/ {b=$2} END {print a,b}' \
                         "${XDG_CONFIG_HOME}/deepin/deepin-terminal/config.conf")"
        ;;

        "GNUstep_Terminal")
             term_font="$(awk -F '>|<' '/>TerminalFont</ {getline; f=$3}
                          />TerminalFontSize</ {getline; s=$3} END {print f,s}' \
                          "${HOME}/GNUstep/Defaults/Terminal.plist")"
        ;;

        "Hyper"*)
            term_font="$(awk -F':|,' '/fontFamily/ {print $2; exit}' "${HOME}/.hyper.js")"
            term_font="$(trim_quotes "$term_font")"
        ;;

        "kitty"*)
            kitty_config="$(kitty --debug-config)"
            [[ "$kitty_config" != *font_family* ]] && return

            term_font_size="${kitty_config/*font_size}"
            term_font_size="${term_font_size/$'\n'*}"
            term_font="${kitty_config/*font_family}"
            term_font="${term_font/$'\n'*} $term_font_size"
        ;;

        "konsole" | "yakuake")
            # Get Process ID of current konsole window / tab
            child="$(get_ppid "$$")"

            declare -a konsole_instances; konsole_instances=( "${(@f)"$(qdbus | grep -F 'org.kde.konsole')"/ /}" )

            for i in "${konsole_instances[@]}"; do
                declare -a konsole_sessions; konsole_sessions=( "${(@f)"$(qdbus "$i" | grep -F '/Sessions/')"}" )

                for session in "${konsole_sessions[@]}"; do
                    if ((child == $(qdbus "$i" "$session" processId))); then
                        profile="$(qdbus "$i" "$session" environment |\
                                   awk -F '=' '/KONSOLE_PROFILE_NAME/ {print $2}')"
                        break
                    fi
                done
                [[ "$profile" ]] && break
            done

            # We could have two profile files for the same profile name, take first match
            profile_filename="$(grep -l "Name=${profile}" "$HOME"/.local/share/konsole/*.profile)"
            profile_filename="${profile_filename/$'\n'*}"

            [[ "$profile_filename" ]] && \
                term_font="$(awk -F '=|,' '/Font=/ {print $2,$3}' "$profile_filename")"
        ;;

        "lxterminal"*)
            term_font="$(awk -F '=' '/fontname=/ {print $2; exit}' \
                         "${XDG_CONFIG_HOME}/lxterminal/lxterminal.conf")"
        ;;

        "mate-terminal")
            # To get the actual config we have to create a temporarily file with the
            # --save-config option.
            mateterm_config="/tmp/mateterm.cfg"

            # Ensure /tmp exists and we do not overwrite anything.
            if [[ -d "/tmp" && ! -f "$mateterm_config" ]]; then
                mate-terminal --save-config="$mateterm_config"

                role="$(xprop -id "${WINDOWID}" WM_WINDOW_ROLE)"
                role="${role##* }"
                role="${role//\"}"

                profile="$(awk -F '=' -v r="$role" \
                                  '$0~r {
                                            getline;
                                            if(/Maximized/) getline;
                                            if(/Fullscreen/) getline;
                                            id=$2"]"
                                         } $0~id {if(id) {getline; print $2; exit}}' \
                           "$mateterm_config")"

                rm -f "$mateterm_config"

                mate_get() {
                   gsettings get org.mate.terminal.profile:/org/mate/terminal/profiles/"$1"/ "$2"
                }

                if [[ "$(mate_get "$profile" "use-system-font")" == "true" ]]; then
                    term_font="$(gsettings get org.mate.interface monospace-font-name)"
                else
                    term_font="$(mate_get "$profile" "font")"
                fi
                term_font="$(trim_quotes "$term_font")"
            fi
        ;;

        "mintty")
            term_font="$(awk -F '=' '!/^($|#)/ && /Font/ {printf $2; exit}' "${HOME}/.minttyrc")"
        ;;

        "pantheon"*)
            term_font="$(gsettings get org.pantheon.terminal.settings font)"

            [[ -z "${term_font//\'}" ]] && \
                term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)"

            term_font="$(trim_quotes "$term_font")"
        ;;

        "qterminal")
            term_font="$(awk -F '=' '/fontFamily=/ {a=$2} /fontSize=/ {b=$2} END {print a,b}' \
                         "${XDG_CONFIG_HOME}/qterminal.org/qterminal.ini")"
        ;;

        "sakura"*)
            term_font="$(awk -F '=' '/^font=/ {print $2; exit}' \
                         "${XDG_CONFIG_HOME}/sakura/sakura.conf")"
        ;;

        "st")
            term_font="$(ps -o command= -p "$parent" | grep -F -- "-f")"

            if [[ "$term_font" ]]; then
                term_font="${term_font/*-f/}"
                term_font="${term_font/ -*/}"

            else
                # On Linux we can get the exact path to the running binary through the procfs
                # (in case `st` is launched from outside of $PATH) on other systems we just
                # have to guess and assume `st` is invoked from somewhere in the users $PATH
                [[ -L "/proc/$parent/exe" ]] && binary="/proc/$parent/exe" || binary="$(type -p st)"

                # Grep the output of strings on the `st` binary for anything that looks vaguely
                # like a font definition. NOTE: There is a slight limitation in this approach.
                # Technically "Font Name" is a valid font. As it doesn't specify any font options
                # though it is hard to match it correctly amongst the rest of the noise.
                [[ -n "$binary" ]] && \
                    term_font="$(strings "$binary" | grep -F -m 1 \
                                                          -e "pixelsize=" \
                                                          -e "size=" \
                                                          -e "antialias=" \
                                                          -e "autohint=")"
            fi

            term_font="${term_font/xft:}"
            term_font="${term_font/:*}"
        ;;

        "terminology")
            term_font="$(strings "${XDG_CONFIG_HOME}/terminology/config/standard/base.cfg" |\
                         awk '/^font\.name$/{print a}{a=$0}')"
            term_font="${term_font/.pcf}"
            term_font="${term_font/:*}"
        ;;

        "termite")
            [[ -f "${XDG_CONFIG_HOME}/termite/config" ]] && \
                termite_config="${XDG_CONFIG_HOME}/termite/config"

            term_font="$(awk -F '= ' '/\[options\]/ {
                                          opt=1
                                      }
                                      /^\s*font/ {
                                          if(opt==1) a=$2;
                                          opt=0
                                      } END {print a}' "/etc/xdg/termite/config" \
                         "$termite_config")"
        ;;

        "urxvt" | "urxvtd" | "rxvt-unicode" | "xterm")
            xrdb="$(xrdb -query)"
            term_font="$(grep -im 1 -e "^${term/d}"'\**\.*font' -e '^\*font' <<< "$xrdb")"
            term_font="${term_font/*"*font:"}"
            term_font="${term_font/*".font:"}"
            term_font="${term_font/*"*.font:"}"
            term_font="$(trim "$term_font")"

            [[ -z "$term_font" && "$term" == "xterm" ]] && \
                term_font="$(grep '^XTerm.vt100.faceName' <<< "$xrdb")"

            term_font="$(trim "${term_font/*"faceName:"}")"

            # xft: isn't required at the beginning so we prepend it if it's missing
            [[ "${term_font:0:1}" != "-" && "${term_font:0:4}" != "xft:" ]] && \
                term_font="xft:$term_font"

            # Xresources has two different font formats, this checks which
            # one is in use and formats it accordingly.
            case "$term_font" in
                *"xft:"*)
                    term_font="${term_font/xft:}"
                    term_font="${term_font/:*}"
                ;;

                "-"*)
                    IFS=- read -r _ _ term_font _ <<< "$term_font"
                ;;
            esac
        ;;

        "xfce4-terminal")
            term_font="$(awk -F '=' '/^FontName/{a=$2}/^FontUseSystem=TRUE/{a=$0} END {print a}' \
                         "${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")"

            [[ "$term_font" == "FontUseSystem=TRUE" ]] && \
                term_font="$(gsettings get org.gnome.desktop.interface monospace-font-name)"

            term_font="$(trim_quotes "$term_font")"

            # Default fallback font hardcoded in terminal-preferences.c
            [[ -z "$term_font" ]] && term_font="Monospace 12"
        ;;
    esac

    echo "${term_font}"
}

local currentTerminal=$(get_term)
local currentFont=$(get_term_font "${currentTerminal}")
print -P "===== Font debugging ====="
print -P "You are using %F{blue}${currentTerminal}%f with Font %F{blue}${currentFont}%f\n"

if [[ $(echo "${currentFont}" | grep -c -E "Powerline|Awesome|Nerd") -eq 0 ]]; then
    print -P "%F{yellow}WARNING%f It does not seem like you use an Powerline-enabled or Awesome Terminal Font!"
    print -P "Please make sure that your font settings are correct!"
else
    print -P "Your font settings seem to be all right. If you still have issues,"
    print -P "it is more likely to be a font issue than a Powerlevel9k related one."
fi


================================================
FILE: debug/iterm.zsh
================================================
#!/usr/bin/env zsh
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8

if [[ "$TERM_PROGRAM" != "iTerm.app" ]]; then
    print "Your Terminal Emulator does not appear to be iTerm2!"
    print "This debug script is intended only for iTerm2 terminals."
    exit 1
fi

if [[ ! -x "/usr/libexec/PlistBuddy" ]]; then
    print "To use this debug script, you need to install XCode!"
    exit 2
fi

local normalFont
local type
local command
local ambiguousDoubleWidth
local minimumContrast
local useDifferentFont

# Unfortunately the profile name is not unique, but it seems to be the only
# thing that identifies an active profile. There is the "ID of current session
# of current window" though, but that does not match to a `guid` in the plist.
# So, be warned - collisions may occur!
# See: https://groups.google.com/forum/#!topic/iterm2-discuss/0tO3xZ4Zlwg
local currentProfileName=$(osascript -e 'tell application "iTerm2" to profile name of current session of current window')

# Warning: Dynamic profiles are not taken into account here!
# https://www.iterm2.com/documentation-dynamic-profiles.html

# Count `guids` in "New Bookmarks"; they should be unique
local profilesCount=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null | grep -c "Guid")
for idx in $(seq 0 "${profilesCount}"); do
    local profileName=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Name:" ~/Library/Preferences/com.googlecode.iterm2.plist 2>/dev/null)
    if [[ "${profileName}" == "${currentProfileName}" ]]; then
        # "Normal Font"
        normalFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Normal\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
        type=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Terminal\ Type:" ~/Library/Preferences/com.googlecode.iterm2.plist)
        command=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Command:" ~/Library/Preferences/com.googlecode.iterm2.plist)
        ambiguousDoubleWidth=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Ambiguous\ Double\ Width:" ~/Library/Preferences/com.googlecode.iterm2.plist)
        minimumContrast=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Minimum\ Contrast:" ~/Library/Preferences/com.googlecode.iterm2.plist)

        # Font for non-ascii characters
        # Only check for a different non-ASCII font, if the user checked
        # the "use a different font for non-ascii text" switch.
        useDifferentFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Use\ Non-ASCII\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
        if [[ "$useDifferentFont" == "true" ]]; then
            nonAsciiFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Non\ Ascii\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist)
            if [[ "$normalFont" != "$nonAsciiFont" ]]; then
                normalFont="$normalFont (normal) / $nonAsciiFont (non-ascii)"
            fi
        fi
        break
    fi
done

print -P "You use %F{blue}iTerm2%f with the following settings:"
print -P "  Font: ${normalFont}"
print -P "  Terminal-Type: ${type}"
print -P "  Command: ${command}"

#############################
# Analyse possible problems #
#############################
local problemsFound
if [[ "${ambiguousDoubleWidth}" == "true" ]]; then
    problemsFound="${problemsFound}\n  * Please uncheck 'Treat ambiguous characters as double-width'."
fi
if (( minimumContrast > 0 )); then
    problemsFound="${problemsFound}\n  * Please set minimum contrast to zero."
fi
if [[ $(echo "${normalFont}" | grep -c -E "Powerline|Awesome|Nerd|Source Code Pro") -eq 0 ]]; then
    problemsFound="${problemsFound}\n  * It does not seem like you use an Powerline-enabled or Awesome Terminal Font!"
fi

#############################
# Output problems           #
#############################
if [[ -n "${problemsFound}" ]]; then
    print -P "\n"
    print -P "%F{yellow}Possible Problems found:%f"
    print -P "${problemsFound}"
else
    print -P "%F{green}No Problems found%f. Yay!"
fi


================================================
FILE: docker/antibody/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/antibody/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/antibody/zshrc .zshrc


================================================
FILE: docker/antibody/install.zsh
================================================
curl -sL https://git.io/antibody | bash -s


================================================
FILE: docker/antibody/zshrc
================================================
source <(antibody init)
antibody bundle ~/p9k/


================================================
FILE: docker/antigen/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/antigen/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/antigen/zshrc .zshrc


================================================
FILE: docker/antigen/install.zsh
================================================
#!/bin/zsh

mkdir ~/antigen

curl \
  -qLsSf \
  -o ~/antigen/antigen.zsh \
  https://git.io/antigen

source ~/antigen/antigen.zsh

# EOF


================================================
FILE: docker/antigen/zshrc
================================================
source ~/antigen/antigen.zsh

antigen theme "${HOME}/p9k" powerlevel9k --no-local-clone
antigen apply


================================================
FILE: docker/base-4.3.11/Dockerfile
================================================
FROM centos:6

RUN \
  yum install -y \
  curl \
  git \
  zsh \
  mercurial \
  subversion \
  golang \
  jq \
  node \
  ruby \
  python \
  python-virtualenv \
  sudo

RUN adduser --shell /bin/zsh --comment 'fred' --user-group fred

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.0.3/Dockerfile
================================================
FROM ubuntu:14.04

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.0.2-3ubuntu6.2 \
  mercurial \
  subversion \
  golang \
  jq \
  node \
  ruby \
  python \
  python-virtualenv

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.1.1/Dockerfile
================================================
FROM ubuntu:16.04

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.1.1-1ubuntu2.2 \
  mercurial \
  subversion \
  golang \
  jq \
  nodejs \
  ruby \
  python \
  python-virtualenv \
  sudo \
  locales

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.2/Dockerfile
================================================
FROM ubuntu:17.10

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.2-5ubuntu1.2 \
  mercurial \
  subversion \
  golang \
  jq \
  nodejs \
  ruby \
  python \
  python-virtualenv \
  sudo \
  locales

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.3.1/Dockerfile
================================================
FROM debian:stretch

# We switched here to debian, as there seems no ZSH 5.3 in ubuntu.

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.3.1-4+b2 \
  mercurial \
  subversion \
  golang \
  jq \
  nodejs \
  ruby \
  python \
  python-virtualenv \
  sudo \
  locales

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
# Locale generation is different in debian. We need to enable en_US
# locale and then regenerate locales.
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.4.2/Dockerfile
================================================
FROM ubuntu:18.04

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.4.2-3ubuntu3 \
  mercurial \
  subversion \
  golang \
  jq \
  nodejs \
  ruby \
  python \
  python-virtualenv \
  sudo \
  locales

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/base-5.5.1/Dockerfile
================================================
FROM ubuntu:18.10

RUN \
  apt-get update && \
  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-selections && \
  DEBIAN_FRONTEND=noninteractive apt-get install -y \
  curl \
  git \
  zsh=5.5.1-1ubuntu1 \
  mercurial \
  subversion \
  golang \
  jq \
  nodejs \
  ruby \
  python \
  python-virtualenv \
  sudo \
  locales

RUN adduser --shell /bin/zsh --gecos 'fred' --disabled-password fred
RUN locale-gen "en_US.UTF-8"

COPY docker/fred-sudoers /etc/sudoers.d/fred

USER fred
WORKDIR /home/fred
ENV LANG=en_US.UTF-8
ENV TERM=xterm-256color
ENV DEFAULT_USER=fred
ENV POWERLEVEL9K_ALWAYS_SHOW_CONTEXT=true

RUN touch .zshrc

CMD ["/bin/zsh", "-l"]


================================================
FILE: docker/dotfile/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY ./ p9k/
COPY docker/dotfile/zshrc .zshrc


================================================
FILE: docker/dotfile/zshrc
================================================
source "${HOME}/p9k/prompt_powerlevel9k_setup"


================================================
FILE: docker/fred-sudoers
================================================
Defaults:fred !requiretty
fred ALL=(ALL) NOPASSWD: ALL


================================================
FILE: docker/omz/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/omz/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY docker/omz/zshrc .zshrc
COPY ./ p9k/


================================================
FILE: docker/omz/install.zsh
================================================
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

mkdir -p ~/.oh-my-zsh/custom/themes
ln -nsf ~/p9k/ ~/.oh-my-zsh/custom/themes/powerlevel9k


================================================
FILE: docker/omz/zshrc
================================================
export ZSH=$HOME/.oh-my-zsh
ZSH_THEME="powerlevel9k/powerlevel9k"
plugins=(git rake ruby)

source $ZSH/oh-my-zsh.sh


================================================
FILE: docker/prezto/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/prezto/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/


================================================
FILE: docker/prezto/install.zsh
================================================
#!/bin/zsh

set -eu

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -nsf "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

ln -snf "${HOME}/p9k/powerlevel9k.zsh-theme" \
  "${HOME}/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup"

echo "zstyle ':prezto:module:prompt' theme 'powerlevel9k'" \
  >> "${HOME}/.zpreztorc"

# EOF


================================================
FILE: docker/zgen/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zgen/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/zgen/zshrc .zshrc


================================================
FILE: docker/zgen/install.zsh
================================================
#!/bin/zsh

git clone https://github.com/tarjoilija/zgen.git "${HOME}/.zgen"

# EOF


================================================
FILE: docker/zgen/zshrc
================================================
# load zgen
source ~/.zgen/zgen.zsh

# if the init scipt doesn't exist
if ! zgen saved; then
  zgen load ~/p9k/powerlevel9k.zsh-theme

  # generate the init script from plugins above
  zgen save
fi


================================================
FILE: docker/zim/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zim/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/


================================================
FILE: docker/zim/install.zsh
================================================
#!zsh

git clone --recursive https://github.com/Eriner/zim.git "${ZDOTDIR:-${HOME}}/.zim"

setopt EXTENDED_GLOB
for template_file ( ${ZDOTDIR:-${HOME}}/.zim/templates/* ); do
  user_file="${ZDOTDIR:-${HOME}}/.${template_file:t}"
  touch ${user_file}
  ( print -rn "$(<${template_file})$(<${user_file})" >! ${user_file} ) 2>/dev/null
done

source "${ZDOTDIR:-${HOME}}/.zlogin"

ln -nsf \
  ~/p9k/ \
  ~/.zim/modules/prompt/external-themes/powerlevel9k
ln -nsf \
  ~/.zim/modules/prompt/external-themes/powerlevel9k/powerlevel9k.zsh-theme \
  ~/.zim/modules/prompt/functions/prompt_powerlevel9k_setup

sed -i "s/zprompt_theme='steeef'/zprompt_theme='powerlevel9k'/g" ~/.zimrc


================================================
FILE: docker/zplug/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zplug/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/zplug/zshrc .zshrc


================================================
FILE: docker/zplug/install.zsh
================================================
#!zsh

curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh

# git clone https://github.com/zplug/zplug "${HOME}/.zplug"


================================================
FILE: docker/zplug/zshrc
================================================
#!zsh

source ~/.zplug/init.zsh
zplug "${HOME}/p9k", use:"powerlevel9k.zsh-theme", from:local, as:theme
zplug load --verbose


================================================
FILE: docker/zplugin/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zplugin/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/zplugin/zshrc.plugins .zshrc.plugins


================================================
FILE: docker/zplugin/install.zsh
================================================
sh -c "$(curl -fsSL https://raw.githubusercontent.com/psprint/zplugin/master/doc/install.sh)"

# The 'zplugin snippet' only copies the .zsh-theme file, not everything else.
mkdir -p ~/.zplugin/snippets
ln -nsf \
  ~/p9k/ \
~/.zplugin/snippets/--SLASH--home--SLASH--fred--SLASH--p9k--SLASH--powerlevel9k--DOT--zsh-theme

{
  echo
  echo "source ~/.zshrc.plugins"
} >> ~/.zshrc


================================================
FILE: docker/zplugin/zshrc.plugins
================================================
#!zsh

zplugin load psprint zsh-navigation-tools
zplugin load psprint---zprompts
zplugin snippet ~/p9k/powerlevel9k.zsh-theme


================================================
FILE: docker/zpm/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zpm/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/
COPY docker/zpm/zshrc .zshrc


================================================
FILE: docker/zpm/install.zsh
================================================
# install zpm
git clone --recursive https://github.com/zpm-zsh/zpm.git ~/.zpm

# Install powerlevel9k
mkdir ~/.zpm/plugins/powerlevel9k
ln -s ~/p9k/powerlevel9k.zsh-theme ~/.zpm/plugins/powerlevel9k/powerlevel9k.plugin.zsh


================================================
FILE: docker/zpm/zshrc
================================================
source ~/.zpm/zpm.zsh

zpm load powerlevel9k


================================================
FILE: docker/zshing/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zshing/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/


================================================
FILE: docker/zshing/install.zsh
================================================
#!zsh

# install zshing https://github.com/zakariaGatter/zshing
git clone https://github.com/zakariaGatter/zshing.git ~/.zshing/zshing

# Link P9K in zshing directory
ln -nsf ~/p9k ~/.zshing/powerlevel9k

{
  echo
  echo 'ZSHING_PLUGINS=(
     "bhilburn/powerlevel9k"
 )'
  echo
  echo "source ~/.zshing/zshing/zshing.zsh"
} >> ~/.zshrc


================================================
FILE: docker/zulu/Dockerfile
================================================
ARG base
FROM p9k:${base}

COPY docker/zulu/install.zsh /tmp/
RUN zsh /tmp/install.zsh

COPY ./ p9k/


================================================
FILE: docker/zulu/install.zsh
================================================
#!zsh

# install zulu https://github.com/zulu-zsh/zulu
curl -L https://git.io/zulu-install | zsh && zsh

{
echo 'zulu fpath add ~/p9k'
echo 'zulu fpath add ~/p9k/functions'
echo 'zulu theme powerlevel9k'
} >> ~/.zshrc


================================================
FILE: functions/colors.zsh
================================================
# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# Color functions
# This file holds some color-functions for
# the powerlevel9k-ZSH-theme
# https://github.com/bhilburn/powerlevel9k
################################################################

typeset -gAh __P9K_COLORS
# https://jonasjacek.github.io/colors/
# use color names by default to allow dark/light themes to adjust colors based on names
__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
  purple 013
  aqua 014
  teal 014
  silver 015
  grey0 016
  navyblue 017
  darkblue 018
  blue3 019
  blue3 020
  blue1 021
  darkgreen 022
  deepskyblue4 023
  deepskyblue4 024
  deepskyblue4 025
  dodgerblue3 026
  dodgerblue2 027
  green4 028
  springgreen4 029
  turquoise4 030
  deepskyblue3 031
  deepskyblue3 032
  dodgerblue1 033
  green3 034
  springgreen3 035
  darkcyan 036
  lightseagreen 037
  deepskyblue2 038
  deepskyblue1 039
  green3 040
  springgreen3 041
  springgreen2 042
  cyan3 043
  darkturquoise 044
  turquoise2 045
  green1 046
  springgreen2 047
  springgreen1 048
  mediumspringgreen 049
  cyan2 050
  cyan1 051
  darkred 052
  deeppink4 053
  purple4 054
  purple4 055
  purple3 056
  blueviolet 057
  orange4 058
  grey37 059
  mediumpurple4 060
  slateblue3 061
  slateblue3 062
  royalblue1 063
  chartreuse4 064
  darkseagreen4 065
  paleturquoise4 066
  steelblue 067
  steelblue3 068
  cornflowerblue 069
  chartreuse3 070
  darkseagreen4 071
  cadetblue 072
  cadetblue 073
  skyblue3 074
  steelblue1 075
  chartreuse3 076
  palegreen3 077
  seagreen3 078
  aquamarine3 079
  mediumturquoise 080
  steelblue1 081
  chartreuse2 082
  seagreen2 083
  seagreen1 084
  seagreen1 085
  aquamarine1 086
  darkslategray2 087
  darkred 088
  deeppink4 089
  darkmagenta 090
  darkmagenta 091
  darkviolet 092
  purple 093
  orange4 094
  lightpink4 095
  plum4 096
  mediumpurple3 097
  mediumpurple3 098
  slateblue1 099
  yellow4 100
  wheat4 101
  grey53 102
  lightslategrey 103
  mediumpurple 104
  lightslateblue 105
  yellow4 106
  darkolivegreen3 107
  darkseagreen 108
  lightskyblue3 109
  lightskyblue3 110
  skyblue2 111
  chartreuse2 112
  darkolivegreen3 113
  palegreen3 114
  darkseagreen3 115
  darkslategray3 116
  skyblue1 117
  chartreuse1 118
  lightgreen 119
  lightgreen 120
  palegreen1 121
  aquamarine1 122
  darkslategray1 123
  red3 124
  deeppink4 125
  mediumvioletred 126
  magenta3 127
  darkviolet 128
  purple 129
  darkorange3 130
  indianred 131
  hotpink3 132
  mediumorchid3 133
  mediumorchid 134
  mediumpurple2 135
  darkgoldenrod 136
  lightsalmon3 137
  rosybrown 138
  grey63 139
  mediumpurple2 140
  mediumpurple1 141
  gold3 142
  darkkhaki 143
  navajowhite3 144
  grey69 145
  lightsteelblue3 146
  lightsteelblue 147
  yellow3 148
  darkolivegreen3 149
  darkseagreen3 150
  darkseagreen2 151
  lightcyan3 152
  lightskyblue1 153
  greenyellow 154
  darkolivegreen2 155
  palegreen1 156
  darkseagreen2 157
  darkseagreen1 158
  paleturquoise1 159
  red3 160
  deeppink3 161
  deeppink3 162
  magenta3 163
  magenta3 164
  magenta2 165
  darkorange3 166
  indianred 167
  hotpink3 168
  hotpink2 169
  orchid 170
  mediumorchid1 171
  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
  lightgoldenrod2 186
  lightyellow3 187
  grey84 188
  lightsteelblue1 189
  yellow2 190
  darkolivegreen1 191
  darkolivegreen1 192
  darkseagreen1 193
  honeydew2 194
  lightcyan1 195
  red1 196
  deeppink2 197
  deeppink1 198
  deeppink1 199
  magenta2 200
  magenta1 201
  orangered1 202
  indianred1 203
  indianred1 204
  hotpink 205
  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 221
  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
)

function termColors() {
  if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == true ]]; then
    return
  fi

  local term_colors

  if which tput &>/dev/null; then
	term_colors=$(tput colors)
  else
	term_colors=$(echotc Co)
  fi
  if (( ! $? && ${term_colors:-0} < 256 )); then
    print -P "%F{red}WARNING!%f Your terminal appears to support fewer than 256 colors!"
    print -P "If your terminal supports 256 colors, please export the appropriate environment variable"
    print -P "_before_ loading this theme in your \~\/.zshrc. In most terminal emulators, putting"
    print -P "%F{blue}export TERM=\"xterm-256color\"%f at the top of your \~\/.zshrc is sufficient."
  fi
}

# get the proper color code if it does not exist as a name.
function getColor() {
  # If Color is not numerical, try to get the color code.
  if [[ "$1" != <-> ]]; then
    1=$(getColorCode $1)
  fi
  echo -n "$1"
}

# empty paramenter resets (stops) background color
function backgroundColor() {
  echo -n "%K{$(getColor $1)}"
}

# empty paramenter resets (stops) foreground color
function foregroundColor() {
  echo -n "%F{$(getColor $1)}"
}

# Get numerical color codes. That way we translate ANSI codes
# into ZSH-Style color codes.
function getColorCode() {
  # Early exit: Check if given value is already numerical
  if [[ "$1" == <-> ]]; then
    # Pad color with zeroes
    echo -n "${(l:3::0:)1}"
    return
  fi

  local colorName="${1}"
  # Check if value is none with any case.
  if [[ "${(L)colorName}" == "none" ]]; then
      echo -n 'none'
  elif [[ "${colorName}" == "foreground"  ]]; then
      # for testing purposes in terminal
      # call via `getColorCode foreground`
      for i in "${(k@)__P9K_COLORS}"; do
          print -P "$(foregroundColor $i)$(getColor $i) - $i%f"
      done
  elif [[ "${colorName}" == "background"  ]]; then
      # call via `getColorCode background`
      for i in "${(k@)__P9K_COLORS}"; do
          print -P "$(backgroundColor $i)$(getColor $i) - $i%k"
      done
  else
      # Strip eventual "bg-" prefixes
      colorName=${colorName#bg-}
      # Strip eventual "fg-" prefixes
      colorName=${colorName#fg-}
      # Strip eventual "br" prefixes ("bright" colors)
      colorName=${colorName#br}
      echo -n $__P9K_COLORS[$colorName]
  fi
}

# Check if two colors are equal, even if one is specified as ANSI code.
function isSameColor() {
  if [[ "$1" == "NONE" || "$2" == "NONE" ]]; then
    return 1
  fi

  local color1=$(getColorCode "$1")
  local color2=$(getColorCode "$2")

  return $(( color1 != color2 ))
}


================================================
FILE: functions/icons.zsh
================================================
# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# icons
# This file holds the icon definitions and
# icon-functions for the powerlevel9k-ZSH-theme
# https://github.com/bhilburn/powerlevel9k
################################################################

# These characters require the Powerline fonts to work properly. If you see
# boxes or bizarre characters below, your fonts are not correctly installed. If
# you do not want to install a special font, you can set `POWERLEVEL9K_MODE` to
# `compatible`. This shows all icons in regular symbols.

# Initialize the icon list according to the user's `POWERLEVEL9K_MODE`.
typeset -gAH icons
() { # add scope to protect the users locale and not overwrite LC_CTYPE!
case $POWERLEVEL9K_MODE in
  'flat'|'awesome-patched')
    # Awesome-Patched Font required! See:
    # https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons=(
      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                      $'\uE801'              # 
      SUDO_ICON                      $'\uF09C'              # 
      RUBY_ICON                      $'\uE847 '             # 
      AWS_ICON                       $'\uE895'              # 
      AWS_EB_ICON                    $'\U1F331 '            # 🌱
      BACKGROUND_JOBS_ICON           $'\uE82F '             # 
      TEST_ICON                      $'\uE891'              # 
      TODO_ICON                      $'\u2611'              # ☑
      BATTERY_ICON                   $'\uE894'              # 
      DISK_ICON                      $'\uE1AE '             # 
      OK_ICON                        $'\u2714'              # ✔
      FAIL_ICON                      $'\u2718'              # ✘
      SYMFONY_ICON                   'SF'
      NODE_ICON                      $'\u2B22'              # ⬢
      MULTILINE_FIRST_PROMPT_PREFIX  $'\u256D'$'\U2500'     # ╭─
      MULTILINE_NEWLINE_PROMPT_PREFIX  $'\u251C'$'\U2500'   # ├─
      MULTILINE_LAST_PROMPT_PREFIX   $'\u2570'$'\U2500 '    # ╰─
      APPLE_ICON                     $'\uE26E'              # 
      WINDOWS_ICON                   $'\uE26F'              # 
      FREEBSD_ICON                   $'\U1F608 '            # 😈
      ANDROID_ICON                   $'\uE270'              # 
      LINUX_ICON                     $'\uE271'              # 
      LINUX_ARCH_ICON                $'\uE271'              # 
      LINUX_DEBIAN_ICON              $'\uE271'              # 
      LINUX_UBUNTU_ICON              $'\uE271'              # 
      LINUX_CENTOS_ICON              $'\uE271'              # 
      LINUX_COREOS_ICON              $'\uE271'              # 
      LINUX_ELEMENTARY_ICON          $'\uE271'              # 
      LINUX_MINT_ICON                $'\uE271'              # 
      LINUX_FEDORA_ICON              $'\uE271'              # 
      LINUX_GENTOO_ICON              $'\uE271'              # 
      LINUX_MAGEIA_ICON              $'\uE271'              # 
      LINUX_NIXOS_ICON               $'\uE271'              # 
      LINUX_MANJARO_ICON             $'\uE271'              # 
      LINUX_DEVUAN_ICON              $'\uE271'              # 
      LINUX_ALPINE_ICON              $'\uE271'              # 
      LINUX_AOSC_ICON                $'\uE271'              # 
      LINUX_OPENSUSE_ICON            $'\uE271'              # 
      LINUX_SABAYON_ICON             $'\uE271'              # 
      LINUX_SLACKWARE_ICON           $'\uE271'              # 
      SUNOS_ICON                     $'\U1F31E '            # 🌞
      HOME_ICON                      $'\uE12C'              # 
      HOME_SUB_ICON                  $'\uE18D'              # 
      FOLDER_ICON                    $'\uE818'              # 
      NETWORK_ICON                   $'\uE1AD'              # 
      ETC_ICON                       $'\uE82F'              # 
      LOAD_ICON                      $'\uE190 '             # 
      SWAP_ICON                      $'\uE87D'              # 
      RAM_ICON                       $'\uE1E2 '             # 
      SERVER_ICON                    $'\uE895'              # 
      VCS_UNTRACKED_ICON             $'\uE16C'              # 
      VCS_UNSTAGED_ICON              $'\uE17C'              # 
      VCS_STAGED_ICON                $'\uE168'              # 
      VCS_STASH_ICON                 $'\uE133 '             # 
      #VCS_INCOMING_CHANGES_ICON     $'\uE1EB '             # 
      #VCS_INCOMING_CHANGES_ICON     $'\uE80D '             # 
      VCS_INCOMING_CHANGES_ICON      $'\uE131 '             # 
      #VCS_OUTGOING_CHANGES_ICON     $'\uE1EC '             # 
      #VCS_OUTGOING_CHANGES_ICON     $'\uE80E '             # 
      VCS_OUTGOING_CHANGES_ICON      $'\uE132 '             # 
      VCS_TAG_ICON                   $'\uE817 '             # 
      VCS_BOOKMARK_ICON              $'\uE87B'              # 
      VCS_COMMIT_ICON                $'\uE821 '             # 
      VCS_BRANCH_ICON                $'\uE220 '             # 
      VCS_REMOTE_BRANCH_ICON         $'\u2192'              # →
      VCS_GIT_ICON                   $'\uE20E '             # 
      VCS_GIT_GITHUB_ICON            $'\uE20E '             #
      VCS_GIT_BITBUCKET_ICON         $'\uE20E '             #
      VCS_GIT_GITLAB_ICON            $'\uE20E '             #
      VCS_HG_ICON                    $'\uE1C3 '             # 
      VCS_SVN_ICON                   '(svn) '
      RUST_ICON                      '(rust)'
      PYTHON_ICON                    $'\ue63c'             # 
      SWIFT_ICON                     ''
      GO_ICON                        ''
      PUBLIC_IP_ICON                 ''
      LOCK_ICON                      $'\UE138'              # 
      EXECUTION_TIME_ICON            $'\UE89C'              # 
      SSH_ICON                       '(ssh)'
      VPN_ICON                       '(vpn)'
      KUBERNETES_ICON                $'\U2388'              # ⎈
      DROPBOX_ICON                   $'\UF16B'              # 
      DATE_ICON                      $'\uE184'              # 
      TIME_ICON                      $'\uE12E'              # 
      JAVA_ICON                      $'\U2615'              # ☕︎
      LARAVEL_ICON                   ''
    )
  ;;
  'awesome-fontconfig')
    # fontconfig with awesome-font required! See
    # https://github.com/gabrielelana/awesome-terminal-fonts
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons=(
      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                      $'\uF201'              # 
      SUDO_ICON                      $'\uF09C'              # 
      RUBY_ICON                      $'\uF219 '             # 
      AWS_ICON                       $'\uF270'              # 
      AWS_EB_ICON                    $'\U1F331 '            # 🌱
      BACKGROUND_JOBS_ICON           $'\uF013 '             # 
      TEST_ICON                      $'\uF291'              # 
      TODO_ICON                      $'\u2611'              # ☑
      BATTERY_ICON                   $'\U1F50B'             # 🔋
      DISK_ICON                      $'\uF0A0 '             # 
      OK_ICON                        $'\u2714'              # ✔
      FAIL_ICON                      $'\u2718'              # ✘
      SYMFONY_ICON                   'SF'
      NODE_ICON                      $'\u2B22'              # ⬢
      MULTILINE_FIRST_PROMPT_PREFIX  $'\u256D'$'\U2500'     # ╭─
      MULTILINE_NEWLINE_PROMPT_PREFIX  $'\u251C'$'\U2500'   # ├─
      MULTILINE_LAST_PROMPT_PREFIX   $'\u2570'$'\U2500 '    # ╰─
      APPLE_ICON                     $'\uF179'              # 
      WINDOWS_ICON                   $'\uF17A'              # 
      FREEBSD_ICON                   $'\U1F608 '            # 😈
      ANDROID_ICON                   $'\uE17B'              # 
      LINUX_ICON                     $'\uF17C'              # 
      LINUX_ARCH_ICON                $'\uF17C'              # 
      LINUX_DEBIAN_ICON              $'\uF17C'              # 
      LINUX_UBUNTU_ICON              $'\uF17C'              # 
      LINUX_CENTOS_ICON              $'\uF17C'              # 
      LINUX_COREOS_ICON              $'\uF17C'              # 
      LINUX_ELEMENTARY_ICON          $'\uF17C'              # 
      LINUX_MINT_ICON                $'\uF17C'              # 
      LINUX_FEDORA_ICON              $'\uF17C'              # 
      LINUX_GENTOO_ICON              $'\uF17C'              # 
      LINUX_MAGEIA_ICON              $'\uF17C'              # 
      LINUX_NIXOS_ICON               $'\uF17C'              # 
      LINUX_MANJARO_ICON             $'\uF17C'              # 
      LINUX_DEVUAN_ICON              $'\uF17C'              # 
      LINUX_ALPINE_ICON              $'\uF17C'              # 
      LINUX_AOSC_ICON                $'\uF17C'              # 
      LINUX_OPENSUSE_ICON            $'\uF17C'              # 
      LINUX_SABAYON_ICON             $'\uF17C'              # 
      LINUX_SLACKWARE_ICON           $'\uF17C'              # 
      SUNOS_ICON                     $'\uF185 '             # 
      HOME_ICON                      $'\uF015'              # 
      HOME_SUB_ICON                  $'\uF07C'              # 
      FOLDER_ICON                    $'\uF115'              # 
      ETC_ICON                       $'\uF013 '             # 
      NETWORK_ICON                   $'\uF09E'              # 
      LOAD_ICON                      $'\uF080 '             # 
      SWAP_ICON                      $'\uF0E4'              # 
      RAM_ICON                       $'\uF0E4'              # 
      SERVER_ICON                    $'\uF233'              # 
      VCS_UNTRACKED_ICON             $'\uF059'              # 
      VCS_UNSTAGED_ICON              $'\uF06A'              # 
      VCS_STAGED_ICON                $'\uF055'              # 
      VCS_STASH_ICON                 $'\uF01C '             # 
      VCS_INCOMING_CHANGES_ICON      $'\uF01A '             # 
      VCS_OUTGOING_CHANGES_ICON      $'\uF01B '             # 
      VCS_TAG_ICON                   $'\uF217 '             # 
      VCS_BOOKMARK_ICON              $'\uF27B'              # 
      VCS_COMMIT_ICON                $'\uF221 '             # 
      VCS_BRANCH_ICON                $'\uF126 '             # 
      VCS_REMOTE_BRANCH_ICON         $'\u2192'              # →
      VCS_GIT_ICON                   $'\uF1D3 '             # 
      VCS_GIT_GITHUB_ICON            $'\uF113 '             # 
      VCS_GIT_BITBUCKET_ICON         $'\uF171 '             # 
      VCS_GIT_GITLAB_ICON            $'\uF296 '             # 
      VCS_HG_ICON                    $'\uF0C3 '             # 
      VCS_SVN_ICON                   '(svn) '
      RUST_ICON                      $'\uE6A8'              # 
      PYTHON_ICON                    $'\ue63c'             # 
      SWIFT_ICON                     ''
      GO_ICON                        ''
      PUBLIC_IP_ICON                 ''
      LOCK_ICON                      $'\UF023'              # 
      EXECUTION_TIME_ICON            $'\uF253'
      SSH_ICON                       '(ssh)'
      VPN_ICON                       $'\uF023'
      KUBERNETES_ICON                $'\U2388'              # ⎈
      DROPBOX_ICON                   $'\UF16B'              # 
      DATE_ICON                      $'\uF073 '             # 
      TIME_ICON                      $'\uF017 '             # 
      JAVA_ICON                      $'\U2615'              # ☕︎
      LARAVEL_ICON                   ''
    )
  ;;
  'awesome-mapped-fontconfig')
    # mapped fontconfig with awesome-font required! See
    # https://github.com/gabrielelana/awesome-terminal-fonts
    # don't forget to source the font maps in your startup script
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"

    if [ -z "$AWESOME_GLYPHS_LOADED" ]; then
        echo "Powerlevel9k warning: Awesome-Font mappings have not been loaded.
        Source a font mapping in your shell config, per the Awesome-Font docs
        (https://github.com/gabrielelana/awesome-terminal-fonts),
        Or use a different Powerlevel9k font configuration.";
    fi

    icons=(
      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                      '\u'$CODEPOINT_OF_OCTICONS_ZAP                 # 
      SUDO_ICON                      '\u'$CODEPOINT_OF_AWESOME_UNLOCK               # 
      RUBY_ICON                      '\u'$CODEPOINT_OF_OCTICONS_RUBY' '             # 
      AWS_ICON                       '\u'$CODEPOINT_OF_AWESOME_SERVER               # 
      AWS_EB_ICON                    $'\U1F331 '                                    # 🌱
      BACKGROUND_JOBS_ICON           '\u'$CODEPOINT_OF_AWESOME_COG' '               # 
      TEST_ICON                      '\u'$CODEPOINT_OF_AWESOME_BUG                  # 
      TODO_ICON                      '\u'$CODEPOINT_OF_AWESOME_CHECK_SQUARE_O       # 
      BATTERY_ICON                   '\U'$CODEPOINT_OF_AWESOME_BATTERY_FULL         # 
      DISK_ICON                      '\u'$CODEPOINT_OF_AWESOME_HDD_O' '             # 
      OK_ICON                        '\u'$CODEPOINT_OF_AWESOME_CHECK                # 
      FAIL_ICON                      '\u'$CODEPOINT_OF_AWESOME_TIMES                # 
      SYMFONY_ICON                   'SF'
      NODE_ICON                      $'\u2B22'                                      # ⬢
      MULTILINE_FIRST_PROMPT_PREFIX  $'\u256D'$'\U2500'                             # ╭─
      MULTILINE_SECOND_PROMPT_PREFIX $'\u2570'$'\U2500 '                            # ╰─
      APPLE_ICON                     '\u'$CODEPOINT_OF_AWESOME_APPLE                # 
      FREEBSD_ICON                   $'\U1F608 '                                    # 😈
      LINUX_ICON                     '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_ARCH_ICON                '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_DEBIAN_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_UBUNTU_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_CENTOS_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_COREOS_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_ELEMENTARY_ICON          '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_MINT_ICON                '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_FEDORA_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_GENTOO_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_MAGEIA_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_NIXOS_ICON               '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_MANJARO_ICON             '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_DEVUAN_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_ALPINE_ICON              '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_AOSC_ICON                '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_OPENSUSE_ICON            '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_SABAYON_ICON             '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      LINUX_SLACKWARE_ICON           '\u'$CODEPOINT_OF_AWESOME_LINUX                # 
      SUNOS_ICON                     '\u'$CODEPOINT_OF_AWESOME_SUN_O' '             # 
      HOME_ICON                      '\u'$CODEPOINT_OF_AWESOME_HOME                 # 
      HOME_SUB_ICON                  '\u'$CODEPOINT_OF_AWESOME_FOLDER_OPEN          # 
      FOLDER_ICON                    '\u'$CODEPOINT_OF_AWESOME_FOLDER_O             # 
      ETC_ICON                       '\u'$CODEPOINT_OF_AWESOME_COG' '               # 
      NETWORK_ICON                   '\u'$CODEPOINT_OF_AWESOME_RSS                  # 
      LOAD_ICON                      '\u'$CODEPOINT_OF_AWESOME_BAR_CHART' '         # 
      SWAP_ICON                      '\u'$CODEPOINT_OF_AWESOME_DASHBOARD            # 
      RAM_ICON                       '\u'$CODEPOINT_OF_AWESOME_DASHBOARD            # 
      SERVER_ICON                    '\u'$CODEPOINT_OF_AWESOME_SERVER               # 
      VCS_UNTRACKED_ICON             '\u'$CODEPOINT_OF_AWESOME_QUESTION_CIRCLE      # 
      VCS_UNSTAGED_ICON              '\u'$CODEPOINT_OF_AWESOME_EXCLAMATION_CIRCLE   # 
      VCS_STAGED_ICON                '\u'$CODEPOINT_OF_AWESOME_PLUS_CIRCLE          # 
      VCS_STASH_ICON                 '\u'$CODEPOINT_OF_AWESOME_INBOX' '             # 
      VCS_INCOMING_CHANGES_ICON      '\u'$CODEPOINT_OF_AWESOME_ARROW_CIRCLE_DOWN' ' # 
      VCS_OUTGOING_CHANGES_ICON      '\u'$CODEPOINT_OF_AWESOME_ARROW_CIRCLE_UP' '   # 
      VCS_TAG_ICON                   '\u'$CODEPOINT_OF_AWESOME_TAG' '               # 
      VCS_BOOKMARK_ICON              '\u'$CODEPOINT_OF_OCTICONS_BOOKMARK            # 
      VCS_COMMIT_ICON                '\u'$CODEPOINT_OF_OCTICONS_GIT_COMMIT' '       # 
      VCS_BRANCH_ICON                '\u'$CODEPOINT_OF_OCTICONS_GIT_BRANCH' '       # 
      VCS_REMOTE_BRANCH_ICON         '\u'$CODEPOINT_OF_OCTICONS_REPO_PUSH           # 
      VCS_GIT_ICON                   '\u'$CODEPOINT_OF_AWESOME_GIT' '               # 
      VCS_GIT_GITHUB_ICON            '\u'$CODEPOINT_OF_AWESOME_GITHUB_ALT' '        # 
      VCS_GIT_BITBUCKET_ICON         '\u'$CODEPOINT_OF_AWESOME_BITBUCKET' '         # 
      VCS_GIT_GITLAB_ICON            '\u'$CODEPOINT_OF_AWESOME_GITLAB' '            # 
      VCS_HG_ICON                    '\u'$CODEPOINT_OF_AWESOME_FLASK' '             # 
      VCS_SVN_ICON                   '(svn) '
      RUST_ICON                      $'\uE6A8'                                      # 
      PYTHON_ICON                    $'\U1F40D'                                     # 🐍
      SWIFT_ICON                     $'\uE655'                                      # 
      PUBLIC_IP_ICON                 '\u'$CODEPOINT_OF_AWESOME_GLOBE                # 
      LOCK_ICON                      '\u'$CODEPOINT_OF_AWESOME_LOCK                 # 
      EXECUTION_TIME_ICON            '\u'$CODEPOINT_OF_AWESOME_HOURGLASS_END        # 
      SSH_ICON                       '(ssh)'
      VPN_ICON                       '\u'$CODEPOINT_OF_AWESOME_LOCK
      KUBERNETES_ICON                $'\U2388'                                      # ⎈
      DROPBOX_ICON                   '\u'$CODEPOINT_OF_AWESOME_DROPBOX              # 
      DATE_ICON                      $'\uF073 '                                     # 
      TIME_ICON                      $'\uF017 '                                     # 
      JAVA_ICON                      $'\U2615'              # ☕︎
      LARAVEL_ICON                   ''
    )
  ;;
  'nerdfont-complete'|'nerdfont-fontconfig')
    # nerd-font patched (complete) font required! See
    # https://github.com/ryanoasis/nerd-fonts
    # http://nerdfonts.com/#cheat-sheet
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons=(
      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                      $'\uE614 '             # 
      SUDO_ICON                      $'\uF09C'              # 
      RUBY_ICON                      $'\uF219 '             # 
      AWS_ICON                       $'\uF270'              # 
      AWS_EB_ICON                    $'\UF1BD  '            # 
      BACKGROUND_JOBS_ICON           $'\uF013 '             # 
      TEST_ICON                      $'\uF188'              # 
      TODO_ICON                      $'\uF133'              # 
      BATTERY_ICON                   $'\UF240 '             # 
      DISK_ICON                      $'\uF0A0'              # 
      OK_ICON                        $'\uF00C'              # 
      FAIL_ICON                      $'\uF00D'              # 
      SYMFONY_ICON                   $'\uE757'              # 
      NODE_ICON                      $'\uE617 '             # 
      MULTILINE_FIRST_PROMPT_PREFIX  $'\u256D'$'\U2500'     # ╭─
      MULTILINE_NEWLINE_PROMPT_PREFIX  $'\u251C'$'\U2500'   # ├─
      MULTILINE_LAST_PROMPT_PREFIX   $'\u2570'$'\U2500 '    # ╰─
      APPLE_ICON                     $'\uF179'              # 
      WINDOWS_ICON                   $'\uF17A'              # 
      FREEBSD_ICON                   $'\UF30C '             # 
      ANDROID_ICON                   $'\uF17B'              # 
      LINUX_ARCH_ICON                $'\uF303'              # 
      LINUX_CENTOS_ICON              $'\uF304'              # 
      LINUX_COREOS_ICON              $'\uF305'              # 
      LINUX_DEBIAN_ICON              $'\uF306'              # 
      LINUX_ELEMENTARY_ICON          $'\uF309'              # 
      LINUX_FEDORA_ICON              $'\uF30a'              # 
      LINUX_GENTOO_ICON              $'\uF30d'              # 
      LINUX_MAGEIA_ICON              $'\uF310'              # 
      LINUX_MINT_ICON                $'\uF30e'              # 
      LINUX_NIXOS_ICON               $'\uF313'              # 
      LINUX_MANJARO_ICON             $'\uF312'              # 
      LINUX_DEVUAN_ICON              $'\uF307'              # 
      LINUX_ALPINE_ICON              $'\uF300'              # 
      LINUX_AOSC_ICON                $'\uF301'              # 
      LINUX_OPENSUSE_ICON            $'\uF314'              # 
      LINUX_SABAYON_ICON             $'\uF317'              # 
      LINUX_SLACKWARE_ICON           $'\uF319'              # 
      LINUX_UBUNTU_ICON              $'\uF31b'              # 
      LINUX_ICON                     $'\uF17C'              # 
      SUNOS_ICON                     $'\uF185 '             # 
      HOME_ICON                      $'\uF015'              # 
      HOME_SUB_ICON                  $'\uF07C'              # 
      FOLDER_ICON                    $'\uF115'              # 
      ETC_ICON                       $'\uF013'              # 
      NETWORK_ICON                   $'\uF1EB'              # 
      LOAD_ICON                      $'\uF080 '             # 
      SWAP_ICON                      $'\uF464'              # 
      RAM_ICON                       $'\uF0E4'              # 
      SERVER_ICON                    $'\uF0AE'              # 
      VCS_UNTRACKED_ICON             $'\uF059'              # 
      VCS_UNSTAGED_ICON              $'\uF06A'              # 
      VCS_STAGED_ICON                $'\uF055'              # 
      VCS_STASH_ICON                 $'\uF01C '             # 
      VCS_INCOMING_CHANGES_ICON      $'\uF01A '             # 
      VCS_OUTGOING_CHANGES_ICON      $'\uF01B '             # 
      VCS_TAG_ICON                   $'\uF02B '             # 
      VCS_BOOKMARK_ICON              $'\uF461 '             # 
      VCS_COMMIT_ICON                $'\uE729 '             # 
      VCS_BRANCH_ICON                $'\uF126 '             # 
      VCS_REMOTE_BRANCH_ICON         $'\uE728 '             # 
      VCS_GIT_ICON                   $'\uF1D3 '             # 
      VCS_GIT_GITHUB_ICON            $'\uF113 '             # 
      VCS_GIT_BITBUCKET_ICON         $'\uE703 '             # 
      VCS_GIT_GITLAB_ICON            $'\uF296 '             # 
      VCS_HG_ICON                    $'\uF0C3 '             # 
      VCS_SVN_ICON                   $'\uE72D '             # 
      RUST_ICON                      $'\uE7A8 '             # 
      PYTHON_ICON                    $'\UE73C '             # 
      SWIFT_ICON                     $'\uE755'              # 
      GO_ICON                        $'\uE626'              # 
      PUBLIC_IP_ICON                 $'\UF0AC'              # 
      LOCK_ICON                      $'\UF023'              # 
      EXECUTION_TIME_ICON            $'\uF252'              # 
      SSH_ICON                       $'\uF489'              # 
      VPN_ICON                       '(vpn)'
      KUBERNETES_ICON                $'\U2388'              # ⎈
      DROPBOX_ICON                   $'\UF16B'              # 
      DATE_ICON                      $'\uF073 '             # 
      TIME_ICON                      $'\uF017 '             # 
      JAVA_ICON                      $'\U2615'              # ☕︎
      LARAVEL_ICON                   $'\ue73f '             # 
    )
  ;;
  *)
    # Powerline-Patched Font required!
    # See https://github.com/Lokaltog/powerline-fonts
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons=(
      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                      $'\uE0A2'              # 
      RUBY_ICON                      ''
      AWS_ICON                       'AWS:'
      AWS_EB_ICON                    $'\U1F331 '            # 🌱
      BACKGROUND_JOBS_ICON           $'\u2699'              # ⚙
      TEST_ICON                      ''
      TODO_ICON                      $'\u2611'              # ☑
      BATTERY_ICON                   $'\U1F50B'             # 🔋
      DISK_ICON                      $'hdd '
      OK_ICON                        $'\u2714'              # ✔
      FAIL_ICON                      $'\u2718'              # ✘
      SYMFONY_ICON                   'SF'
      NODE_ICON                      $'\u2B22'              # ⬢
      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_UBUNTU_ICON              'Ubu'
      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'
      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_GIT_ICON                   ''
      VCS_GIT_GITHUB_ICON            ''
      VCS_GIT_BITBUCKET_ICON         ''
      VCS_GIT_GITLAB_ICON            ''
      VCS_HG_ICON                    ''
      VCS_SVN_ICON                   ''
      RUST_ICON                      'Rust'
      PYTHON_ICON                    ''
      SWIFT_ICON                     'Swift'
      GO_ICON                        'Go'
      PUBLIC_IP_ICON                 ''
      LOCK_ICON                      $'\UE0A2'
      EXECUTION_TIME_ICON            'Dur'
      SSH_ICON                       '(ssh)'
      VPN_ICON                       '(vpn)'
      KUBERNETES_ICON                $'\U2388'              # ⎈
      DROPBOX_ICON                   'Dropbox'
      DATE_ICON                      ''
      TIME_ICON                      ''
      JAVA_ICON                      $'\U2615'              # ☕︎
      LARAVEL_ICON                   ''
    )
  ;;
esac

# Override the above icon settings with any user-defined variables.
case $POWERLEVEL9K_MODE in
  'flat')
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons[LEFT_SEGMENT_SEPARATOR]=''
    icons[RIGHT_SEGMENT_SEPARATOR]=''
    icons[LEFT_SUBSEGMENT_SEPARATOR]='|'
    icons[RIGHT_SUBSEGMENT_SEPARATOR]='|'
  ;;
  'compatible')
    # Set the right locale to protect special characters
    local LC_ALL="" LC_CTYPE="en_US.UTF-8"
    icons[LEFT_SEGMENT_SEPARATOR]=$'\u2B80'                 # ⮀
    icons[RIGHT_SEGMENT_SEPARATOR]=$'\u2B82'                # ⮂
    icons[VCS_BRANCH_ICON]='@'
  ;;
esac

if [[ "$POWERLEVEL9K_HIDE_BRANCH_ICON" == true ]]; then
    icons[VCS_BRANCH_ICON]=''
fi
}

# Safety function for printing icons
# Prints the named icon, or if that icon is undefined, the string name.
function print_icon() {
  local icon_name=$1
  local ICON_USER_VARIABLE=POWERLEVEL9K_${icon_name}
  if defined "$ICON_USER_VARIABLE"; then
    echo -n "${(P)ICON_USER_VARIABLE}"
  else
    echo -n "${icons[$icon_name]}"
  fi
}

# Get 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.
get_icon_names() {
  # Iterate over a ordered list of keys of the icons array
  for key in ${(@kon)icons}; do
    echo -n "POWERLEVEL9K_$key: "
    if [[ "${1}" == "original" ]]; then
      # print the original icons as they are defined in the array above
      echo "${icons[$key]}"
    else
      # print the icons as they are configured by the user
      echo "$(print_icon "$key")"
    fi
  done
}


================================================
FILE: functions/utilities.zsh
================================================
# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# Utility functions
# This file holds some utility-functions for
# the powerlevel9k-ZSH-theme
# https://github.com/bhilburn/powerlevel9k
################################################################

# Exits with 0 if a variable has been previously defined (even if empty)
# Takes the name of a variable that should be checked.
function defined() {
  [[ ! -z "${(tP)1}" ]]
}

# Given the name of a variable and a default value, sets the variable
# value to the default only if it has not been defined.
#
# Typeset cannot set the value for an array, so this will only work
# for scalar values.
function set_default() {
  local varname="$1"
  local default_value="$2"

  defined "$varname" || typeset -g "$varname"="$default_value"
}

# Converts large memory values into a human-readable unit (e.g., bytes --> GB)
# Takes two arguments:
#   * $size - The number which should be prettified
#   * $base - The base of the number (default Bytes)
printSizeHumanReadable() {
  typeset -F 2 size
  size="$1"+0.00001
  local extension
  extension=('B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y')
  local index=1

  # if the base is not Bytes
  if [[ -n $2 ]]; then
    local idx
    for idx in "${extension[@]}"; do
      if [[ "$2" == "$idx" ]]; then
        break
      fi
      index=$(( index + 1 ))
    done
  fi

  while (( (size / 1024) > 0.1 )); do
    size=$(( size / 1024 ))
    index=$(( index + 1 ))
  done

  echo "$size${extension[$index]}"
}

# Gets the first value out of a list of items that is not empty.
# The items are examined by a callback-function.
# Takes two arguments:
#   * $list - A list of items
#   * $callback - A callback function to examine if the item is
#                 worthy. The callback function has access to
#                 the inner variable $item.
function getRelevantItem() {
  local -a list
  local callback
  # Explicitly split the elements by whitespace.
  list=(${=1})
  callback=$2

  for item in $list; do
    # The first non-empty item wins
    try=$(eval "$callback")
    if [[ -n "$try" ]]; then
      echo "$try"
      break;
    fi
  done
}

# OS detection
case $(uname) in
    Darwin)
      OS='OSX'
      OS_ICON=$(print_icon 'APPLE_ICON')
      ;;
    CYGWIN_NT-* | MSYS_NT-*)
      OS='Windows'
      OS_ICON=$(print_icon 'WINDOWS_ICON')
      ;;
    FreeBSD)
      OS='BSD'
      OS_ICON=$(print_icon 'FREEBSD_ICON')
      ;;
    OpenBSD)
      OS='BSD'
      OS_ICON=$(print_icon 'FREEBSD_ICON')
      ;;
    DragonFly)
      OS='BSD'
      OS_ICON=$(print_icon 'FREEBSD_ICON')
      ;;
    Linux)
      OS='Linux'
      if [ -f /etc/os-release ]; then
        [[ ${(f)"$((</etc/os-release) 2>/dev/null)"} =~ "ID=([A-Za-z]+)" ]] && os_release_id="${match[1]}"
      fi
      case "$os_release_id" in
        *arch*)
        OS_ICON=$(print_icon 'LINUX_ARCH_ICON')
        ;;
        *debian*)
        OS_ICON=$(print_icon 'LINUX_DEBIAN_ICON')
        ;;
       *ubuntu*)
        OS_ICON=$(print_icon 'LINUX_UBUNTU_ICON')
        ;;
       *elementary*)
        OS_ICON=$(print_icon 'LINUX_ELEMENTARY_ICON')
        ;;
       *fedora*)
        OS_ICON=$(print_icon 'LINUX_FEDORA_ICON')
        ;;
       *coreos*)
        OS_ICON=$(print_icon 'LINUX_COREOS_ICON')
        ;;
       *gentoo*)
        OS_ICON=$(print_icon 'LINUX_GENTOO_ICON')
        ;;
       *mageia*)
        OS_ICON=$(print_icon 'LINUX_MAGEIA_ICON')
        ;;
       *centos*)
        OS_ICON=$(print_icon 'LINUX_CENTOS_ICON')
        ;;
       *opensuse*|*tumbleweed*)
        OS_ICON=$(print_icon 'LINUX_OPENSUSE_ICON')
        ;;
       *sabayon*)
        OS_ICON=$(print_icon 'LINUX_SABAYON_ICON')
        ;;
       *slackware*)
        OS_ICON=$(print_icon 'LINUX_SLACKWARE_ICON')
        ;;
       *linuxmint*)
        OS_ICON=$(print_icon 'LINUX_MINT_ICON')
        ;;
       *alpine*)
        OS_ICON=$(print_icon 'LINUX_ALPINE_ICON')
        ;;
       *aosc*)
        OS_ICON=$(print_icon 'LINUX_AOSC_ICON')
        ;;
       *nixos*)
        OS_ICON=$(print_icon 'LINUX_NIXOS_ICON')
        ;;
       *devuan*)
        OS_ICON=$(print_icon 'LINUX_DEVUAN_ICON')
        ;;
       *manjaro*)
        OS_ICON=$(print_icon 'LINUX_MANJARO_ICON')
        ;;
        *)
        OS='Linux'
        OS_ICON=$(print_icon 'LINUX_ICON')
        ;;
      esac

      # Check if we're running on Android
      case $(uname -o 2>/dev/null) in
        Android)
          OS='Android'
          OS_ICON=$(print_icon 'ANDROID_ICON')
          ;;
      esac
      ;;
    SunOS)
      OS='Solaris'
      OS_ICON=$(print_icon 'SUNOS_ICON')
      ;;
    *)
      OS=''
      OS_ICON=''
      ;;
esac

# Determine the correct sed parameter.
#
# `sed` is unfortunately not consistent across OSes when it comes to flags.
SED_EXTENDED_REGEX_PARAMETER="-r"
if [[ "$OS" == 'OSX' ]]; then
  local IS_BSD_SED="$(sed --version &>> /dev/null || echo "BSD sed")"
  if [[ -n "$IS_BSD_SED" ]]; then
    SED_EXTENDED_REGEX_PARAMETER="-E"
  fi
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.
segment_in_use() {
    local key=$1
    [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)${key}]}" ||
     -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)${key}_joined]}" ||
     -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)${key}]}" ||
     -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)${key}_joined]}" ]]
}

# Print a deprecation warning if an old segment is in use.
# Takes the name of an associative array that contains the
# deprecated segments as keys, the values contain the new
# segment names.
print_deprecation_warning() {
  typeset -AH raw_deprecated_segments
  raw_deprecated_segments=(${(kvP@)1})

  for key in ${(@k)raw_deprecated_segments}; do
    if segment_in_use $key; then
      # segment is deprecated
      print -P "%F{yellow}Warning!%f The '$key' segment is deprecated. Use '%F{blue}${raw_deprecated_segments[$key]}%f' instead. For more informations, have a look at the CHANGELOG.md."
    fi
  done
}

# A helper function to determine if a segment should be
# joined or promoted to a full one.
# Takes three arguments:
#   * $1: The array index of the current segment
#   * $2: The array index of the last printed segment
#   * $3: The array of segments of the left or right prompt
function segmentShouldBeJoined() {
  local current_index=$1
  local last_segment_index=$2
  # Explicitly split the elements by whitespace.
  local -a elements
  elements=(${=3})

  local current_segment=${elements[$current_index]}
  local joined=false
  if [[ ${current_segment[-7,-1]} == '_joined' ]]; then
    joined=true
    # promote segment to a full one, if the predecessing full segment
    # was conditional. So this can only be the case for segments that
    # are not our direct predecessor.
    if (( $(($current_index - $last_segment_index)) > 1)); then
      # Now we have to examine every previous segment, until we reach
      # the last printed one (found by its index). This is relevant if
      # all previous segments are joined. Then we want to join our
      # segment as well.
      local examined_index=$((current_index - 1))
      while (( $examined_index > $last_segment_index )); do
        local previous_segment=${elements[$examined_index]}
        # If one of the examined segments is not joined, then we know
        # that the current segment should not be joined, as the target
        # segment is the wrong one.
        if [[ ${previous_segment[-7,-1]} != '_joined' ]]; then
          joined=false
          break
        fi
        examined_index=$((examined_index - 1))
      done
    fi
  fi

  # Return 1 means error; return 0 means no error. So we have
  # to invert $joined
  if [[ "$joined" == "true" ]]; then
    return 0
  else
    return 1
  fi
}

################################################################
# Given a directory path, truncate it according to the settings.
# Parameters:
#   * $1 Path: string - the directory path to be truncated
#   * $2 Length: integer - length to truncate to
#   * $3 Delimiter: string - the delimiter to use
#   * $4 From: string - "right" | "middle". If omited, assumes right.
function truncatePath() {
  # if the current path is not 1 character long (e.g. "/" or "~")
  if (( ${#1} > 1 )); then
    # convert $2 from string to integer
    2=$(( $2 ))
    # set $3 to "" if not defined
    [[ -z $3 ]] && 3="" || 3=$(echo -n $3)
    # set $4 to "right" if not defined
    [[ -z $4 ]] && 4="right"
    # create a variable for the truncated path.
    local trunc_path
    # if the path is in the home folder, add "~/" to the start otherwise "/"
    [[ $1 == "~"* ]] && trunc_path='~/' || trunc_path='/'
    # split the path into an array using "/" as the delimiter
    local paths=$1
    paths=(${(s:/:)${paths//"~\/"/}})
    # declare locals for the directory being tested and its length
    local test_dir test_dir_length
    # do the needed truncation
    case $4 in
      right)
        # include the delimiter length in the threshhold
        local threshhold=$(( $2 + ${#3} ))
        # loop through the paths
        for (( i=1; i<${#paths}; i++ )); do
          # get the current directory value
          test_dir=$paths[$i]
          test_dir_length=${#test_dir}
          # only truncate if the resulting truncation will be shorter than
          # the truncation + delimiter length and at least 3 characters
          if (( $test_dir_length > $threshhold )) && (( $test_dir_length > 3 )); then
            # use the first $2 characters and the delimiter
            trunc_path+="${test_dir:0:$2}$3/"
          else
            # use the full path
            trunc_path+="${test_dir}/"
          fi
        done
      ;;
      middle)
        # we need double the length for start and end truncation + delimiter length
        local threshhold=$(( $2 * 2 ))
        # create a variable for the start of the end truncation
        local last_pos
        # loop through the paths
        for (( i=1; i<${#paths}; i++ )); do
          # get the current directory value
          test_dir=$paths[$i]
          test_dir_length=${#test_dir}
          # only truncate if the resulting truncation will be shorter than
          # the truncation + delimiter length
          if (( $test_dir_length > $threshhold )); then
            # use the first $2 characters, the delimiter and the last $2 characters
            last_pos=$(( $test_dir_length - $2 ))
            trunc_path+="${test_dir:0:$2}$3${test_dir:$last_pos:$test_dir_length}/"
          else
            # use the full path
            trunc_path+="${test_dir}/"
          fi
        done
      ;;
    esac
    # return the truncated path + the current directory
    echo $trunc_path${1:t}
  else # current path is 1 character long (e.g. "/" or "~")
    echo $1
  fi
}

# Given a directory path, truncate it according to the settings for
# `truncate_from_right`
function truncatePathFromRight() {
  local delim_len=${#POWERLEVEL9K_SHORTEN_DELIMITER:-1}
  echo $1 | sed $SED_EXTENDED_REGEX_PARAMETER \
 "s@(([^/]{$((POWERLEVEL9K_SHORTEN_DIR_LENGTH))})([^/]{$delim_len}))[^/]+/@\2$POWERLEVEL9K_SHORTEN_DELIMITER/@g"
}

# Search recursively in parent folders for given file.
function upsearch () {
  if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then
    echo "$PWD"
  elif test -e "$1"; then
    pushd .. > /dev/null
    upsearch "$1"
    popd > /dev/null
    echo "$PWD"
  else
    pushd .. > /dev/null
    upsearch "$1"
    popd > /dev/null
  fi
}

# Parse IP address from ifconfig on OSX and from IP on Linux
# Parameters:
#  $1 - string The desired Interface
#  $2 - string A root prefix for testing purposes
function p9k::parseIp() {
  local desiredInterface="${1}"

  if [[ -z "${desiredInterface}" ]]; then
    desiredInterface="^[^ ]+"
  fi

  local ROOT_PREFIX="${2}"
  if [[ "$OS" == "OSX" ]]; then
    # Get a plain list of all interfaces
    local rawInterfaces="$(${ROOT_PREFIX}/sbin/ifconfig -l 2>/dev/null)"
    # Parse into array (split by whitespace)
    local -a interfaces
    interfaces=(${=rawInterfaces})
    # Parse only relevant interface names
    local pattern="${desiredInterface}[^ ]?"
    local -a relevantInterfaces
    for rawInterface in $interfaces; do
      [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=( $MATCH )
    done
    local newline=$'\n'
    for interfaceName in $relevantInterfaces; do
      local interface="$(${ROOT_PREFIX}/sbin/ifconfig $interfaceName 2>/dev/null)"
      if [[ "${interface}" =~ "lo[0-9]*" ]]; then
        continue
      fi
      # Check if interface is UP.
      if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then
        local ipFound="${match[3]}"
        local -a interfaceStates=(${(s:,:)match[1]})
        if [[ "${interfaceStates[(r)UP]}" == "UP" ]]; then
          echo "${ipFound}"
          return 0
        fi
      fi
    done
  else
    local -a interfaces
    interfaces=( "${(f)$(${ROOT_PREFIX}/sbin/ip -brief -4 a show 2>/dev/null)}" )
    local pattern="^${desiredInterface}[ ]+UP[ ]+([^/ ]+)"
    for interface in "${(@)interfaces}"; do
      if [[ "$interface" =~ $pattern ]]; then
        echo "${match[1]}"
        return 0
      fi
    done
  fi

  return 1
}


================================================
FILE: functions/vcs.zsh
================================================
# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# vcs
# This file holds supplemental VCS functions
# for the powerlevel9k-ZSH-theme
# https://github.com/bhilburn/powerlevel9k
################################################################

set_default POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY false
function +vi-git-untracked() {
  [[ -z "${vcs_comm[gitdir]}" || "${vcs_comm[gitdir]}" == "." ]] && return

  # get the root for the current repo or submodule
  local repoTopLevel="$(command 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=$(command git ls-files --others --exclude-standard "${repoTopLevel}" 2> /dev/null)

  if [[ -z $untrackedFiles && "$POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY" == "true" ]]; then
    untrackedFiles+=$(command git submodule foreach --quiet --recursive 'command 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=$(command git rev-list origin/${hook_com[branch]}..HEAD | wc -l)
    ahead=$(command 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=$(command git rev-list HEAD..origin/${hook_com[branch]} | wc -l)
    behind=$(command 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=${$(command git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/}

    if [[ -n "$POWERLEVEL9K_VCS_SHORTEN_LENGTH" ]] && [[ -n "$POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH" ]]; then
     set_default POWERLEVEL9K_VCS_SHORTEN_DELIMITER $'\U2026'

     if [ ${#hook_com[branch]} -gt ${POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH} ] && [ ${#hook_com[branch]} -gt ${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

    hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${hook_com[branch]}"
    # 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
}

set_default POWERLEVEL9K_VCS_HIDE_TAGS false
function +vi-git-tagname() {
    if [[ "$POWERLEVEL9K_VCS_HIDE_TAGS" == "false" ]]; then
        # If we are on a tag, append the tagname to the current branch string.
        local tag
        tag=$(command 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 $(command 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=$(command git rev-list -n 1 --abbrev-commit --abbrev=${POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH} HEAD)
                hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${revision} $(print_icon 'VCS_TAG_ICON')${tag}"
            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 sting 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=$(command git ls-remote --get-url 2> /dev/null)
    if [[ "$remote" =~ "github" ]] then
      vcs_visual_identifier='VCS_GIT_GITHUB_ICON'
    elif [[ "$remote" =~ "bitbucket" ]] then
      vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON'
    elif [[ "$remote" =~ "stash" ]] then
      vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON'
    elif [[ "$remote" =~ "gitlab" ]] then
      vcs_visual_identifier='VCS_GIT_GITLAB_ICON'
    else
      vcs_visual_identifier='VCS_GIT_ICON'
    fi

  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
}


================================================
FILE: powerlevel9k.zsh-theme
================================================
# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# powerlevel9k Theme
# https://github.com/bhilburn/powerlevel9k
#
# This theme was inspired by agnoster's Theme:
# https://gist.github.com/3712874
################################################################

################################################################
# For basic documentation, please refer to the README.md in the top-level
# directory. For more detailed documentation, refer to the project wiki, hosted
# on Github: https://github.com/bhilburn/powerlevel9k/wiki
#
# There are a lot of easy ways you can customize your prompt segments and
# theming with simple variables defined in your `~/.zshrc`.
################################################################

## Turn on for Debugging
#PS4='%s%f%b%k%F{blue}%{λ%}%L %F{240}%N:%i%(?.. %F{red}%?) %1(_.%F{yellow}%-1_ .)%s%f%b%k '
#zstyle ':vcs_info:*+*:*' debug true
#set -o xtrace

# Try to set the installation path
if [[ -n "$POWERLEVEL9K_INSTALLATION_DIR" ]]; then
  p9k_directory=${POWERLEVEL9K_INSTALLATION_DIR:A}
else
  if [[ "${(%):-%N}" == '(eval)' ]]; then
    if [[ "$0" == '-antigen-load' ]] && [[ -r "${PWD}/powerlevel9k.zsh-theme" ]]; then
      # Antigen uses eval to load things so it can change the plugin (!!)
      # https://github.com/zsh-users/antigen/issues/581
      p9k_directory=$PWD
    else
      print -P "%F{red}You must set POWERLEVEL9K_INSTALLATION_DIR work from within an (eval).%f"
      return 1
    fi
  else
    # Get the path to file this code is executing in; then
    # get the absolute path and strip the filename.
    # See https://stackoverflow.com/a/28336473/108857
    p9k_directory=${${(%):-%x}:A:h}
  fi
fi

################################################################
# Source icon functions
################################################################

source "${p9k_directory}/functions/icons.zsh"

################################################################
# Source utility functions
################################################################

source "${p9k_directory}/functions/utilities.zsh"

################################################################
# Source color functions
################################################################

source "${p9k_directory}/functions/colors.zsh"

################################################################
# Source VCS_INFO hooks / helper functions
################################################################

source "${p9k_directory}/functions/vcs.zsh"

# cleanup temporary variables.
unset p9k_directory

################################################################
# Color Scheme
################################################################

if [[ "$POWERLEVEL9K_COLOR_SCHEME" == "light" ]]; then
  DEFAULT_COLOR=white
  DEFAULT_COLOR_INVERTED=black
else
  DEFAULT_COLOR=black
  DEFAULT_COLOR_INVERTED=white
fi

################################################################
# Prompt Segment Constructors
#
# Methodology behind user-defined variables overwriting colors:
#     The first parameter to the segment constructors is the calling function's
#     name. From this function name, we strip the "prompt_"-prefix and
#     uppercase it. This is then prefixed with "POWERLEVEL9K_" and suffixed
#     with either "_BACKGROUND" or "_FOREGROUND", thus giving us the variable
#     name. So each new segment is user-overwritten by a variable following
#     this naming convention.
################################################################

# The `CURRENT_BG` variable is used to remember what the last BG color used was
# when building the left-hand prompt. Because the RPROMPT is created from
# right-left but reads the opposite, this isn't necessary for the other side.
CURRENT_BG='NONE'

# Begin a left prompt segment
# Takes four arguments:
#   * $1: Name of the function that was originally invoked (mandatory).
#         Necessary, to make the dynamic color-overwrite mechanism work.
#   * $2: The array index of the current segment
#   * $3: Background color
#   * $4: Foreground color
#   * $5: The segment content
#   * $6: An identifying icon (must be a key of the icons array)
# The latter three can be omitted,
set_default last_left_element_index 1
set_default POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS " "
left_prompt_segment() {
  local segment_name="${1}"
  local current_index=$2
  # Check if the segment should be joined with the previous one
  local joined
  segmentShouldBeJoined $current_index $last_left_element_index "$POWERLEVEL9K_LEFT_PROMPT_ELEMENTS" && joined=true || joined=false

  # Colors
  local backgroundColor="${3}"
  local foregroundColor="${4}"

  # Overwrite given background-color by user defined variable for this segment.
  local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND
  local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE}
  [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER"

  # Overwrite given foreground-color by user defined variable for this segment.
  local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND
  local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
  [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER"

  # Get color codes here to save some calls later on
  backgroundColor="$(getColorCode ${backgroundColor})"
  foregroundColor="$(getColorCode ${foregroundColor})"

  local background foreground
  [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k"
  [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f"

  if [[ $CURRENT_BG != 'NONE' ]] && ! isSameColor "${backgroundColor}" "$CURRENT_BG"; then
    echo -n "${background}%F{$CURRENT_BG}"
    if [[ $joined == false ]]; then
      # Middle segment
      echo -n "$(print_icon 'LEFT_SEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
    fi
  elif isSameColor "$CURRENT_BG" "${backgroundColor}"; then
    # Middle segment with same color as previous segment
    # We take the current foreground color as color for our
    # subsegment (or the default color). This should have
    # enough contrast.
    local complement
    [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)"
    echo -n "${background}${complement}"
    if [[ $joined == false ]]; then
      echo -n "$(print_icon 'LEFT_SUBSEGMENT_SEPARATOR')$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
    fi
  else
    # First segment
    echo -n "${background}$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS"
  fi

  local visual_identifier
  if [[ -n $6 ]]; then
    visual_identifier="$(print_icon $6)"
    if [[ -n "$visual_identifier" ]]; then
      # Add an whitespace if we print more than just the visual identifier.
      # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st),
      # we need to color both the visual identifier and the whitespace.
      [[ -n "$5" ]] && visual_identifier="$visual_identifier "
      # Allow users to overwrite the color for the visual identifier only.
      local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR
      set_default $visual_identifier_color_variable "${foregroundColor}"
      visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}"
    fi
  fi

  # Print the visual identifier
  echo -n "${visual_identifier}"
  # Print the content of the segment, if there is any
  [[ -n "$5" ]] && echo -n "${foreground}${5}"
  echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS}"

  CURRENT_BG="${backgroundColor}"
  last_left_element_index=$current_index
}

# End the left prompt, closes the final segment.
left_prompt_end() {
  if [[ -n $CURRENT_BG ]]; then
    echo -n "%k$(foregroundColor ${CURRENT_BG})$(print_icon 'LEFT_SEGMENT_SEPARATOR')"
  else
    echo -n "%k"
  fi
  echo -n "%f$(print_icon 'LEFT_SEGMENT_END_SEPARATOR')"
  CURRENT_BG=''
}

CURRENT_RIGHT_BG='NONE'

# Begin a right prompt segment
# Takes four arguments:
#   * $1: Name of the function that was originally invoked (mandatory).
#         Necessary, to make the dynamic color-overwrite mechanism work.
#   * $2: The array index of the current segment
#   * $3: Background color
#   * $4: Foreground color
#   * $5: The segment content
#   * $6: An identifying icon (must be a key of the icons array)
# No ending for the right prompt segment is needed (unlike the left prompt, above).
set_default last_right_element_index 1
set_default POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS " "
right_prompt_segment() {
  local segment_name="${1}"
  local current_index=$2

  # Check if the segment should be joined with the previous one
  local joined
  segmentShouldBeJoined $current_index $last_right_element_index "$POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS" && joined=true || joined=false

  # Colors
  local backgroundColor="${3}"
  local foregroundColor="${4}"

  # Overwrite given background-color by user defined variable for this segment.
  local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_BACKGROUND
  local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE}
  [[ -n $BG_COLOR_MODIFIER ]] && backgroundColor="$BG_COLOR_MODIFIER"

  # Overwrite given foreground-color by user defined variable for this segment.
  local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)${segment_name}#prompt_}_FOREGROUND
  local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
  [[ -n $FG_COLOR_MODIFIER ]] && foregroundColor="$FG_COLOR_MODIFIER"

  # Get color codes here to save some calls later on
  backgroundColor="$(getColorCode ${backgroundColor})"
  foregroundColor="$(getColorCode ${foregroundColor})"

  local background foreground
  [[ -n "${backgroundColor}" ]] && background="$(backgroundColor ${backgroundColor})" || background="%k"
  [[ -n "${foregroundColor}" ]] && foreground="$(foregroundColor ${foregroundColor})" || foreground="%f"

  # If CURRENT_RIGHT_BG is "NONE", we are the first right segment.

  if [[ "$CURRENT_RIGHT_BG" != "NONE" ]]; then
    # This is the closing whitespace for the previous segment
    echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}%f"
  fi

  if [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]]; then
    if isSameColor "$CURRENT_RIGHT_BG" "${backgroundColor}"; then
      # Middle segment with same color as previous segment
      # We take the current foreground color as color for our
      # subsegment (or the default color). This should have
      # enough contrast.
      local complement
      [[ -n "${foregroundColor}" ]] && complement="${foreground}" || complement="$(foregroundColor $DEFAULT_COLOR)"
      echo -n "$complement$(print_icon 'RIGHT_SUBSEGMENT_SEPARATOR')%f"
    else
      # Use the new Background Color as the foreground of the segment separator
      echo -n "$(foregroundColor ${backgroundColor})$(print_icon 'RIGHT_SEGMENT_SEPARATOR')%f"
    fi
  fi

  local visual_identifier
  if [[ -n "$6" ]]; then
    visual_identifier="$(print_icon $6)"
    if [[ -n "$visual_identifier" ]]; then
      # Add an whitespace if we print more than just the visual identifier.
      # To avoid cutting off the visual identifier in some terminal emulators (e.g., Konsole, st),
      # we need to color both the visual identifier and the whitespace.
      [[ -n "$5" ]] && visual_identifier=" $visual_identifier"
      # Allow users to overwrite the color for the visual identifier only.
      local visual_identifier_color_variable=POWERLEVEL9K_${(U)${segment_name}#prompt_}_VISUAL_IDENTIFIER_COLOR
      set_default $visual_identifier_color_variable "${foregroundColor}"
      visual_identifier="$(foregroundColor ${(P)visual_identifier_color_variable})${visual_identifier}"
    fi
  fi

  echo -n "${background}${foreground}"

  # Print whitespace only if segment is not joined or first right segment
  [[ $joined == false ]] || [[ "$CURRENT_RIGHT_BG" == "NONE" ]] && echo -n "${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS}"

  # Print segment content if there is any
  [[ -n "$5" ]] && echo -n "${5}"
  # Print the visual identifier
  echo -n "${visual_identifier}"

  CURRENT_RIGHT_BG="${backgroundColor}"
  last_right_element_index=$current_index
}

################################################################
# Prompt Segment Definitions
################################################################

################################################################
# Anaconda Environment
prompt_anaconda() {
  # Depending on the conda version, either might be set. This
  # variant works even if both are set.
  local _path=$CONDA_ENV_PATH$CONDA_PREFIX
  if ! [ -z "$_path" ]; then
    # config - can be overwritten in users' zshrc file.
    set_default POWERLEVEL9K_ANACONDA_LEFT_DELIMITER "("
    set_default POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER ")"
    "$1_prompt_segment" "$0" "$2" "blue" "$DEFAULT_COLOR" "$POWERLEVEL9K_ANACONDA_LEFT_DELIMITER$(basename $_path)$POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" 'PYTHON_ICON'
  fi
}

################################################################
# AWS Profile
prompt_aws() {
  local aws_profile="${AWS_PROFILE:-$AWS_DEFAULT_PROFILE}"

  if [[ -n "$aws_profile" ]]; then
    "$1_prompt_segment" "$0" "$2" red white "$aws_profile" 'AWS_ICON'
  fi
}

################################################################
# Current Elastic Beanstalk environment
prompt_aws_eb_env() {
  local eb_env=$(grep environment .elasticbeanstalk/config.yml 2> /dev/null | awk '{print $2}')

  if [[ -n "$eb_env" ]]; then
    "$1_prompt_segment" "$0" "$2" black green "$eb_env" 'AWS_EB_ICON'
  fi
}

################################################################
# Segment to indicate background jobs with an icon.
set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE true
set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS false
prompt_background_jobs() {
  local background_jobs_number=${$(jobs -l | wc -l)// /}
  local wrong_lines=`jobs -l | awk '/pwd now/{ count++ } END {print count}'`
  if [[ wrong_lines -gt 0 ]]; then
     background_jobs_number=$(( $background_jobs_number - $wrong_lines ))
  fi
  if [[ background_jobs_number -gt 0 ]]; then
    local background_jobs_number_print=""
    if [[ "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE" == "true" ]] && ([[ "$background_jobs_number" -gt 1 ]] || [[ "$POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS" == "true" ]]); then
      background_jobs_number_print="$background_jobs_number"
    fi
    "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "cyan" "$background_jobs_number_print" 'BACKGROUND_JOBS_ICON'
  fi
}

################################################################
# A newline in your prompt, so you can segments on multiple lines.
prompt_newline() {
  local lws newline
  [[ "$1" == "right" ]] && return
  newline=$'\n'
  lws=$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS
  if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
    newline="${newline}$(print_icon 'MULTILINE_NEWLINE_PROMPT_PREFIX')"
  fi
  POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=
  "$1_prompt_segment" \
    "$0" \
    "$2" \
    "" "" "${newline}"
  CURRENT_BG='NONE'
  POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=$lws
}

################################################################
# Segment that indicates usage level of current partition.
set_default POWERLEVEL9K_DISK_USAGE_ONLY_WARNING false
set_default POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL 90
set_default POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL 95
prompt_disk_usage() {
  local current_state="unknown"
  typeset -AH hdd_usage_forecolors
  hdd_usage_forecolors=(
    'normal'        'yellow'
    'warning'       "$DEFAULT_COLOR"
    'critical'      'white'
  )
  typeset -AH hdd_usage_backcolors
  hdd_usage_backcolors=(
    'normal'        $DEFAULT_COLOR
    'warning'       'yellow'
    'critical'      'red'
  )

  local disk_usage="${$(\df -P . | sed -n '2p' | awk '{ print $5 }')%%\%}"

  if [ "$disk_usage" -ge "$POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL" ]; then
    current_state='warning'
    if [ "$disk_usage" -ge "$POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL" ]; then
        current_state='critical'
    fi
  else
    if [[ "$POWERLEVEL9K_DISK_USAGE_ONLY_WARNING" == true ]]; then
        current_state=''
        return
    fi
    current_state='normal'
  fi

  local message="${disk_usage}%%"

  # Draw the prompt_segment
  if [[ -n $disk_usage ]]; then
    "$1_prompt_segment" "${0}_${current_state}" "$2" "${hdd_usage_backcolors[$current_state]}" "${hdd_usage_forecolors[$current_state]}" "$message" 'DISK_ICON'
  fi
}

################################################################
# Segment that displays the battery status in levels and colors
prompt_battery() {
  # The battery can have four different states - default to 'unknown'.
  local current_state='unknown'
  typeset -AH battery_states
  battery_states=(
    'low'           'red'
    'charging'      'yellow'
    'charged'       'green'
    'disconnected'  "$DEFAULT_COLOR_INVERTED"
  )
  local ROOT_PREFIX="${4}"
  # Set default values if the user did not configure them
  set_default POWERLEVEL9K_BATTERY_LOW_THRESHOLD  10

  if [[ $OS =~ OSX && -f "${ROOT_PREFIX}"/usr/bin/pmset && -x "${ROOT_PREFIX}"/usr/bin/pmset ]]; then
    # obtain battery information from system
    local raw_data="$(${ROOT_PREFIX}/usr/bin/pmset -g batt | awk 'FNR==2{print}')"
    # return if there is no battery on system
    [[ -z $(echo $raw_data | grep "InternalBattery") ]] && return

    # Time remaining on battery operation (charging/discharging)
    local tstring=$(echo $raw_data | awk -F ';' '{print $3}' | awk '{print $1}')
    # If time has not been calculated by system yet
    [[ $tstring =~ '(\(no|not)' ]] && tstring="..."

    # percent of battery charged
    typeset -i 10 bat_percent
    bat_percent=$(echo $raw_data | grep -o '[0-9]*%' | sed 's/%//')

    local remain=""
    # Logic for string output
    case $(echo $raw_data | awk -F ';' '{print $2}' | awk '{$1=$1};1') in
      # for a short time after attaching power, status will be 'AC attached;'
      'charging'|'finishing charge'|'AC attached')
        current_state="charging"
        remain=" ($tstring)"
        ;;
      'discharging')
        [[ $bat_percent -lt $POWERLEVEL9K_BATTERY_LOW_THRESHOLD ]] && current_state="low" || current_state="disconnected"
        remain=" ($tstring)"
        ;;
      *)
        current_state="charged"
        ;;
    esac
  fi

  if [[ "$OS" == 'Linux' ]] || [[ "$OS" == 'Android' ]]; then
    local sysp="${ROOT_PREFIX}/sys/class/power_supply"

    # Reported BAT0 or BAT1 depending on kernel version
    [[ -a $sysp/BAT0 ]] && local bat=$sysp/BAT0
    [[ -a $sysp/BAT1 ]] && local bat=$sysp/BAT1

    # Android-related
    # Tested on: Moto G falcon (CM 13.0)
    [[ -a $sysp/battery ]] && local bat=$sysp/battery

    # Return if no battery found
    [[ -z $bat ]] && return
    local capacity=$(cat $bat/capacity)
    local battery_status=$(cat $bat/status)
    [[ $capacity -gt 100 ]] && local bat_percent=100 || local bat_percent=$capacity
    [[ $battery_status =~ Charging || $battery_status =~ Full ]] && local connected=true
    if [[ -z  $connected ]]; then
      [[ $bat_percent -lt $POWERLEVEL9K_BATTERY_LOW_THRESHOLD ]] && current_state="low" || current_state="disconnected"
    else
      [[ $bat_percent =~ 100 ]] && current_state="charged"
      [[ $bat_percent -lt 100 ]] && current_state="charging"
    fi
    if [[ -f ${ROOT_PREFIX}/usr/bin/acpi ]]; then
      local time_remaining=$(${ROOT_PREFIX}/usr/bin/acpi | awk '{ print $5 }')
      if [[ $time_remaining =~ rate ]]; then
        local tstring="..."
      elif [[ $time_remaining =~ "[[:digit:]]+" ]]; then
        local tstring=${(f)$(date -u -d "$(echo $time_remaining)" +%k:%M 2> /dev/null)}
      fi
    fi
    [[ -n $tstring ]] && local remain=" ($tstring)"
  fi

  local message
  # Default behavior: Be verbose!
  set_default POWERLEVEL9K_BATTERY_VERBOSE true
  if [[ "$POWERLEVEL9K_BATTERY_VERBOSE" == true ]]; then
    message="$bat_percent%%$remain"
  else
    message="$bat_percent%%"
  fi

  # override default icon if we are using battery stages
  if [[ -n "$POWERLEVEL9K_BATTERY_STAGES" ]]; then
    local segment=$(( 100.0 / (${#POWERLEVEL9K_BATTERY_STAGES} - 1 ) ))
    if [[ $segment > 1 ]]; then
      local offset=$(( ($bat_percent / $segment) + 1 ))
      # check if the stages are in an array or a string
      [[ "${(t)POWERLEVEL9K_BATTERY_STAGES}" =~ "array" ]] && POWERLEVEL9K_BATTERY_ICON="$POWERLEVEL9K_BATTERY_STAGES[$offset]" || POWERLEVEL9K_BATTERY_ICON=${POWERLEVEL9K_BATTERY_STAGES:$offset:1}
    fi
  fi
  # return if POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD is set and the battery percentage is greater or equal
  if defined POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD && [[ "${bat_percent}" -ge $POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD ]]; then
    return
  fi

    # override the default color if we are using a color level array
    if [[ -n "$POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND" ]] && [[ "${(t)POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND}" =~ "array" ]]; then
      local segment=$(( 100.0 / (${#POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND} - 1 ) ))
      local offset=$(( ($bat_percent / $segment) + 1 ))
      "$1_prompt_segment" "$0_${current_state}" "$2" "${POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND[$offset]}" "${battery_states[$current_state]}" "${message}" "BATTERY_ICON"
    else
      # Draw the prompt_segment
      "$1_prompt_segment" "$0_${current_state}" "$2" "${DEFAULT_COLOR}" "${battery_states[$current_state]}" "${message}" "BATTERY_ICON"
    fi
}

################################################################
# Public IP segment
# Parameters:
#   * $1 Alignment: string - left|right
#   * $2 Index: integer
#   * $3 Joined: bool - If the segment should be joined
#   * $4 Root Prefix: string - Root prefix for testing purposes
prompt_public_ip() {
  local ROOT_PREFIX="${4}"
  # set default values for segment
  set_default POWERLEVEL9K_PUBLIC_IP_TIMEOUT "300"
  set_default POWERLEVEL9K_PUBLIC_IP_NONE ""
  set_default POWERLEVEL9K_PUBLIC_IP_FILE "/tmp/p9k_public_ip"
  set_default POWERLEVEL9K_PUBLIC_IP_HOST "http://ident.me"
  defined POWERLEVEL9K_PUBLIC_IP_METHODS || POWERLEVEL9K_PUBLIC_IP_METHODS=(dig curl wget)

  # Do we need a fresh IP?
  local refresh_ip=false
  if [[ -f $POWERLEVEL9K_PUBLIC_IP_FILE ]]; then
    typeset -i timediff
    # if saved IP is more than
    if [[ "$OS" == "OSX" ]]; then
      timediff=$(($(date +%s) - $(stat -f "%m" $POWERLEVEL9K_PUBLIC_IP_FILE)))
    else
      timediff=$(($(date +%s) - $(date -r $POWERLEVEL9K_PUBLIC_IP_FILE +%s)))
    fi
    [[ $timediff -gt $POWERLEVEL9K_PUBLIC_IP_TIMEOUT ]] && refresh_ip=true
    # If tmp file is empty get a fresh IP
    [[ -z $(cat $POWERLEVEL9K_PUBLIC_IP_FILE) ]] && refresh_ip=true
    [[ -n $POWERLEVEL9K_PUBLIC_IP_NONE ]] && [[ $(cat $POWERLEVEL9K_PUBLIC_IP_FILE) =~ "$POWERLEVEL9K_PUBLIC_IP_NONE" ]] && refresh_ip=true
  else
    touch $POWERLEVEL9K_PUBLIC_IP_FILE && refresh_ip=true
  fi

  # grab a fresh IP if needed
  local fresh_ip
  if [[ $refresh_ip == true && -w $POWERLEVEL9K_PUBLIC_IP_FILE ]]; then
    for method in "${POWERLEVEL9K_PUBLIC_IP_METHODS[@]}"; do
      case $method in
        'dig')
            fresh_ip="$(dig +time=1 +tries=1 +short myip.opendns.com @resolver1.opendns.com 2> /dev/null)"
            [[ "$fresh_ip" =~ ^\; ]] && unset fresh_ip
          ;;
        'curl')
            fresh_ip="$(curl --max-time 10 -w '\n' "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
          ;;
        'wget')
            fresh_ip="$(wget -T 10 -qO- "$POWERLEVEL9K_PUBLIC_IP_HOST" 2> /dev/null)"
          ;;
      esac
      # If we found a fresh IP, break loop.
      if [[ -n "${fresh_ip}" ]]; then
        break;
      fi
    done

    # write IP to tmp file or clear tmp file if an IP was not retrieved
    # Redirection with `>!`. From the manpage: Same as >, except that the file
    #   is truncated to zero length if it exists, even if CLOBBER is unset.
    # If the file already exists, and a simple `>` redirection and CLOBBER
    # unset, ZSH will produce an error.
    [[ -n "${fresh_ip}" ]] && echo $fresh_ip >! $POWERLEVEL9K_PUBLIC_IP_FILE || echo $POWERLEVEL9K_PUBLIC_IP_NONE >! $POWERLEVEL9K_PUBLIC_IP_FILE
  fi

  # read public IP saved to tmp file
  local public_ip="$(cat $POWERLEVEL9K_PUBLIC_IP_FILE)"

  # Draw the prompt segment
  if [[ -n $public_ip ]]; then
    icon='PUBLIC_IP_ICON'
    # Check VPN is on if VPN interface is set
    if [[ -n $POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]]; then
      local vpnIp="$(p9k::parseIp "${POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE}" "${ROOT_PREFIX}")"
      if [[ -n "$vpnIp" ]]; then
        icon='VPN_ICON'
      fi
    fi
    $1_prompt_segment "$0" "$2" "$DEFAULT_COLOR" "$DEFAULT_COLOR_INVERTED" "${public_ip}" "$icon"
  fi
}

################################################################
# Context: user@hostname (who am I and where am I)
# Note that if $DEFAULT_USER is not set, this prompt segment will always print
set_default POWERLEVEL9K_ALWAYS_SHOW_CONTEXT false
set_default POWERLEVEL9K_ALWAYS_SHOW_USER false
set_default POWERLEVEL9K_CONTEXT_TEMPLATE "%n@%m"
prompt_context() {
  local current_state="DEFAULT"
  typeset -AH context_states
  context_states=(
    "ROOT"        "yellow"
    "SUDO"        "yellow"
    "DEFAULT"     "yellow"
    "REMOTE"      "yellow"
    "REMOTE_SUDO" "yellow"
  )

  local content=""

  if [[ "$POWERLEVEL9K_ALWAYS_SHOW_CONTEXT" == true ]] || [[ "$(whoami)" != "$DEFAULT_USER" ]] || [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
      content="${POWERLEVEL9K_CONTEXT_TEMPLATE}"
  elif [[ "$POWERLEVEL9K_ALWAYS_SHOW_USER" == true ]]; then
      content="$(whoami)"
  else
      return
  fi

  if [[ $(print -P "%#") == '#' ]]; then
    current_state="ROOT"
  elif [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
    if [[ -n "$SUDO_COMMAND" ]]; then
      current_state="REMOTE_SUDO"
    else
      current_state="REMOTE"
    fi
  elif [[ -n "$SUDO_COMMAND" ]]; then
    current_state="SUDO"
  fi

  "$1_prompt_segment" "${0}_${current_state}" "$2" "$DEFAULT_COLOR" "${context_states[$current_state]}" "${content}"
}

################################################################
# User: user (who am I)
# Note that if $DEFAULT_USER is not set, this prompt segment will always print
set_default POWERLEVEL9K_USER_TEMPLATE "%n"
prompt_user() {
  local current_state="DEFAULT"
  typeset -AH user_state
  if [[ "$POWERLEVEL9K_ALWAYS_SHOW_USER" == true ]] || [[ "$(whoami)" != "$DEFAULT_USER" ]]; then
    if [[ $(print -P "%#") == '#' ]]; then
      user_state=(
        "STATE"               "ROOT"
        "CONTENT"             "${POWERLEVEL9K_USER_TEMPLATE}"
        "BACKGROUND_COLOR"    "${DEFAULT_COLOR}"
        "FOREGROUND_COLOR"    "yellow"
        "VISUAL_IDENTIFIER"   "ROOT_ICON"
      )
    elif [[ -n "$SUDO_COMMAND" ]]; then
      user_state=(
        "STATE"               "SUDO"
        "CONTENT"             "${POWERLEVEL9K_USER_TEMPLATE}"
        "BACKGROUND_COLOR"    "${DEFAULT_COLOR}"
        "FOREGROUND_COLOR"    "yellow"
        "VISUAL_IDENTIFIER"   "SUDO_ICON"
      )
    else
      user_state=(
        "STATE"               "DEFAULT"
        "CONTENT"             "$(whoami)"
        "BACKGROUND_COLOR"    "${DEFAULT_COLOR}"
        "FOREGROUND_COLOR"    "yellow"
        "VISUAL_IDENTIFIER"   "USER_ICON"
      )
    fi
    "$1_prompt_segment" "${0}_${user_state[STATE]}" "$2" "${user_state[BACKGROUND_COLOR]}" "${user_state[FOREGROUND_COLOR]}" "${user_state[CONTENT]}" "${user_state[VISUAL_IDENTIFIER]}"
  fi
}

################################################################
# Host: machine (where am I)
set_default POWERLEVEL9K_HOST_TEMPLATE "%m"
prompt_host() {
  local current_state="LOCAL"
  typeset -AH host_state
  if [[ -n "$SSH_CLIENT" ]] || [[ -n "$SSH_TTY" ]]; then
    host_state=(
      "STATE"               "REMOTE"
      "CONTENT"             "${POWERLEVEL9K_HOST_TEMPLATE}"
      "BACKGROUND_COLOR"    "${DEFAULT_COLOR}"
      "FOREGROUND_COLOR"    "yellow"
      "VISUAL_IDENTIFIER"   "SSH_ICON"
    )
  else
    host_state=(
      "STATE"               "LOCAL"
      "CONTENT"             "${POWERLEVEL9K_HOST_TEMPLATE}"
      "BACKGROUND_COLOR"    "${DEFAULT_COLOR}"
      "FOREGROUND_COLOR"    "yellow"
      "VISUAL_IDENTIFIER"   "HOST_ICON"
    )
  fi
  "$1_prompt_segment" "$0_${host_state[STATE]}" "$2" "${host_state[BACKGROUND_COLOR]}" "${host_state[FOREGROUND_COLOR]}" "${host_state[CONTENT]}" "${host_state[VISUAL_IDENTIFIER]}"
}

################################################################
# The 'custom` prompt provides a way for users to invoke commands and display
# the output in a segment.
prompt_custom() {
  local segment_name="${3:u}"
  # Get content of custom segment
  local command="POWERLEVEL9K_CUSTOM_${segment_name}"
  local segment_content="$(eval ${(P)command})"

  if [[ -n $segment_content ]]; then
    "$1_prompt_segment" "${0}_${3:u}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$segment_content" "CUSTOM_${segment_name}_ICON"
  fi
}

################################################################
# Display the durat
Download .txt
gitextract_7q9jqrz3/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── ISSUE_TEMPLATE.md
│   │   └── PERFORMANCE_ISSUE_TEMPLATE.md
│   └── PULL_REQUEST_TEMPLATE.md
├── .gitignore
├── .gitmodules
├── .travis.yml
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── TESTS.md
├── debug/
│   ├── font-issues.zsh
│   └── iterm.zsh
├── docker/
│   ├── antibody/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── antigen/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── base-4.3.11/
│   │   └── Dockerfile
│   ├── base-5.0.3/
│   │   └── Dockerfile
│   ├── base-5.1.1/
│   │   └── Dockerfile
│   ├── base-5.2/
│   │   └── Dockerfile
│   ├── base-5.3.1/
│   │   └── Dockerfile
│   ├── base-5.4.2/
│   │   └── Dockerfile
│   ├── base-5.5.1/
│   │   └── Dockerfile
│   ├── dotfile/
│   │   ├── Dockerfile
│   │   └── zshrc
│   ├── fred-sudoers
│   ├── omz/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── prezto/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   ├── zgen/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zim/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   ├── zplug/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zplugin/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc.plugins
│   ├── zpm/
│   │   ├── Dockerfile
│   │   ├── install.zsh
│   │   └── zshrc
│   ├── zshing/
│   │   ├── Dockerfile
│   │   └── install.zsh
│   └── zulu/
│       ├── Dockerfile
│       └── install.zsh
├── functions/
│   ├── colors.zsh
│   ├── icons.zsh
│   ├── utilities.zsh
│   └── vcs.zsh
├── powerlevel9k.zsh-theme
├── test/
│   ├── core/
│   │   ├── color_overriding.spec
│   │   ├── joining_segments.spec
│   │   ├── prompt.spec
│   │   └── visual_identifier.spec
│   ├── functions/
│   │   ├── colors.spec
│   │   ├── icons.spec
│   │   └── utilities.spec
│   ├── powerlevel9k.spec
│   ├── segments/
│   │   ├── anaconda.spec
│   │   ├── aws_eb_env.spec
│   │   ├── background_jobs.spec
│   │   ├── battery.spec
│   │   ├── command_execution_time.spec
│   │   ├── context.spec
│   │   ├── custom.spec
│   │   ├── detect_virt.spec
│   │   ├── dir.spec
│   │   ├── disk_usage.spec
│   │   ├── go_version.spec
│   │   ├── ip.spec
│   │   ├── kubecontext.spec
│   │   ├── laravel_version.spec
│   │   ├── load.spec
│   │   ├── newline.spec
│   │   ├── node_version.spec
│   │   ├── nodeenv.spec
│   │   ├── nvm.spec
│   │   ├── php_version.spec
│   │   ├── public_ip.spec
│   │   ├── ram.spec
│   │   ├── rust_version.spec
│   │   ├── ssh.spec
│   │   ├── status.spec
│   │   ├── swap.spec
│   │   ├── swift_version.spec
│   │   ├── symfony_version.spec
│   │   ├── todo.spec
│   │   ├── vcs-git.spec
│   │   ├── vcs-hg.spec
│   │   ├── vi_mode.spec
│   │   └── vpn_ip.spec
│   └── suite.spec
├── test-bsd-vm/
│   ├── Vagrantfile
│   ├── bootstrap-zero.sh
│   └── bootstrap.sh
├── test-in-docker
├── test-vm/
│   ├── README.md
│   ├── Vagrantfile
│   ├── antigen.sh
│   ├── bootstrap.sh
│   ├── omz.sh
│   └── prezto.sh
└── test-vm-providers/
    ├── plain.sh
    └── setup-environment.sh
Condensed preview — 111 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (452K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/ISSUE_TEMPLATE.md",
    "chars": 2149,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\nThanks for openi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/PERFORMANCE_ISSUE_TEMPLATE.md",
    "chars": 1261,
    "preview": "---\nname: Performance Issue\nabout: For performance Issues\ntitle: \"[Performance]\"\nlabels: performance\nassignees: ''\n\n---\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 2591,
    "preview": "Thank you so much for opening a PR for P9k! Many of our best features and segments have come from the community, and we "
  },
  {
    "path": ".gitignore",
    "chars": 28,
    "preview": "test-vm/.vagrant\n*.swp\n.idea"
  },
  {
    "path": ".gitmodules",
    "chars": 82,
    "preview": "[submodule \"shunit2\"]\n\tpath = shunit2\n\turl = https://github.com/kward/shunit2.git\n"
  },
  {
    "path": ".travis.yml",
    "chars": 1719,
    "preview": "language: sh\n\nos:\n  - linux\n  - osx\n\nosx_image: xcode9.4\n\naddons:\n  apt:\n    packages:\n      - build-essential\n      - g"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 16159,
    "preview": "## v0.6.7\n\n- PR #1175 - Fix home dir shortening when using package_name truncation strategy\n- PR #1158 - [Bugfix] dir: F"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3023,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "LICENSE",
    "chars": 1094,
    "preview": "Copyright (c) 2014-2017 Ben Hilburn <bhilburn@gmail.com>\n\nMIT LICENSE\n\nPermission is hereby granted, free of charge, to "
  },
  {
    "path": "README.md",
    "chars": 43364,
    "preview": "## Powerlevel9k is deprecated and now unmaintained. Please use [Powerlevel10k](https://github.com/romkatv/powerlevel10k)"
  },
  {
    "path": "TESTS.md",
    "chars": 2269,
    "preview": "# Tests\n\n## Automated Tests\n\nThe Unit-Tests do not follow exactly the file structure of Powerlevel9k itself,\nbut we try "
  },
  {
    "path": "debug/font-issues.zsh",
    "chars": 15642,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\nsource functions/colors.zsh\nsource functions/icons.zsh\nsou"
  },
  {
    "path": "debug/iterm.zsh",
    "chars": 4120,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\nif [[ \"$TERM_PROGRAM\" != \"iTerm.app\" ]]; then\n    print \"Y"
  },
  {
    "path": "docker/antibody/Dockerfile",
    "chars": 139,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/antibody/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/ant"
  },
  {
    "path": "docker/antibody/install.zsh",
    "chars": 43,
    "preview": "curl -sL https://git.io/antibody | bash -s\n"
  },
  {
    "path": "docker/antibody/zshrc",
    "chars": 47,
    "preview": "source <(antibody init)\nantibody bundle ~/p9k/\n"
  },
  {
    "path": "docker/antigen/Dockerfile",
    "chars": 137,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/antigen/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/anti"
  },
  {
    "path": "docker/antigen/install.zsh",
    "chars": 138,
    "preview": "#!/bin/zsh\n\nmkdir ~/antigen\n\ncurl \\\n  -qLsSf \\\n  -o ~/antigen/antigen.zsh \\\n  https://git.io/antigen\n\nsource ~/antigen/a"
  },
  {
    "path": "docker/antigen/zshrc",
    "chars": 102,
    "preview": "source ~/antigen/antigen.zsh\n\nantigen theme \"${HOME}/p9k\" powerlevel9k --no-local-clone\nantigen apply\n"
  },
  {
    "path": "docker/base-4.3.11/Dockerfile",
    "chars": 462,
    "preview": "FROM centos:6\n\nRUN \\\n  yum install -y \\\n  curl \\\n  git \\\n  zsh \\\n  mercurial \\\n  subversion \\\n  golang \\\n  jq \\\n  node \\"
  },
  {
    "path": "docker/base-5.0.3/Dockerfile",
    "chars": 648,
    "preview": "FROM ubuntu:14.04\n\nRUN \\\n  apt-get update && \\\n  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-select"
  },
  {
    "path": "docker/base-5.1.1/Dockerfile",
    "chars": 671,
    "preview": "FROM ubuntu:16.04\n\nRUN \\\n  apt-get update && \\\n  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-select"
  },
  {
    "path": "docker/base-5.2/Dockerfile",
    "chars": 669,
    "preview": "FROM ubuntu:17.10\n\nRUN \\\n  apt-get update && \\\n  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-select"
  },
  {
    "path": "docker/base-5.3.1/Dockerfile",
    "chars": 888,
    "preview": "FROM debian:stretch\n\n# We switched here to debian, as there seems no ZSH 5.3 in ubuntu.\n\nRUN \\\n  apt-get update && \\\n  e"
  },
  {
    "path": "docker/base-5.4.2/Dockerfile",
    "chars": 669,
    "preview": "FROM ubuntu:18.04\n\nRUN \\\n  apt-get update && \\\n  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-select"
  },
  {
    "path": "docker/base-5.5.1/Dockerfile",
    "chars": 669,
    "preview": "FROM ubuntu:18.10\n\nRUN \\\n  apt-get update && \\\n  echo 'golang-go golang-go/dashboard boolean false' | debconf-set-select"
  },
  {
    "path": "docker/dotfile/Dockerfile",
    "chars": 73,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY ./ p9k/\nCOPY docker/dotfile/zshrc .zshrc\n"
  },
  {
    "path": "docker/dotfile/zshrc",
    "chars": 47,
    "preview": "source \"${HOME}/p9k/prompt_powerlevel9k_setup\"\n"
  },
  {
    "path": "docker/fred-sudoers",
    "chars": 55,
    "preview": "Defaults:fred !requiretty\nfred ALL=(ALL) NOPASSWD: ALL\n"
  },
  {
    "path": "docker/omz/Dockerfile",
    "chars": 129,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/omz/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY docker/omz/zshrc .zshrc\nCOPY"
  },
  {
    "path": "docker/omz/install.zsh",
    "chars": 195,
    "preview": "sh -c \"$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)\"\n\nmkdir -p ~/.oh-m"
  },
  {
    "path": "docker/omz/zshrc",
    "chars": 116,
    "preview": "export ZSH=$HOME/.oh-my-zsh\nZSH_THEME=\"powerlevel9k/powerlevel9k\"\nplugins=(git rake ruby)\n\nsource $ZSH/oh-my-zsh.sh\n"
  },
  {
    "path": "docker/prezto/Dockerfile",
    "chars": 103,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/prezto/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\n"
  },
  {
    "path": "docker/prezto/install.zsh",
    "chars": 481,
    "preview": "#!/bin/zsh\n\nset -eu\n\ngit clone --recursive https://github.com/sorin-ionescu/prezto.git \"${ZDOTDIR:-$HOME}/.zprezto\"\n\nset"
  },
  {
    "path": "docker/zgen/Dockerfile",
    "chars": 131,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zgen/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/zgen/zs"
  },
  {
    "path": "docker/zgen/install.zsh",
    "chars": 84,
    "preview": "#!/bin/zsh\n\ngit clone https://github.com/tarjoilija/zgen.git \"${HOME}/.zgen\"\n\n# EOF\n"
  },
  {
    "path": "docker/zgen/zshrc",
    "chars": 198,
    "preview": "# load zgen\nsource ~/.zgen/zgen.zsh\n\n# if the init scipt doesn't exist\nif ! zgen saved; then\n  zgen load ~/p9k/powerleve"
  },
  {
    "path": "docker/zim/Dockerfile",
    "chars": 100,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zim/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\n"
  },
  {
    "path": "docker/zim/install.zsh",
    "chars": 674,
    "preview": "#!zsh\n\ngit clone --recursive https://github.com/Eriner/zim.git \"${ZDOTDIR:-${HOME}}/.zim\"\n\nsetopt EXTENDED_GLOB\nfor temp"
  },
  {
    "path": "docker/zplug/Dockerfile",
    "chars": 133,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zplug/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/zplug/"
  },
  {
    "path": "docker/zplug/install.zsh",
    "chars": 178,
    "preview": "#!zsh\n\ncurl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh| zsh\n\n# "
  },
  {
    "path": "docker/zplug/zshrc",
    "chars": 125,
    "preview": "#!zsh\n\nsource ~/.zplug/init.zsh\nzplug \"${HOME}/p9k\", use:\"powerlevel9k.zsh-theme\", from:local, as:theme\nzplug load --ver"
  },
  {
    "path": "docker/zplugin/Dockerfile",
    "chars": 153,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zplugin/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/zplu"
  },
  {
    "path": "docker/zplugin/install.zsh",
    "chars": 376,
    "preview": "sh -c \"$(curl -fsSL https://raw.githubusercontent.com/psprint/zplugin/master/doc/install.sh)\"\n\n# The 'zplugin snippet' o"
  },
  {
    "path": "docker/zplugin/zshrc.plugins",
    "chars": 126,
    "preview": "#!zsh\n\nzplugin load psprint zsh-navigation-tools\nzplugin load psprint---zprompts\nzplugin snippet ~/p9k/powerlevel9k.zsh-"
  },
  {
    "path": "docker/zpm/Dockerfile",
    "chars": 129,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zpm/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\nCOPY docker/zpm/zshr"
  },
  {
    "path": "docker/zpm/install.zsh",
    "chars": 223,
    "preview": "# install zpm\ngit clone --recursive https://github.com/zpm-zsh/zpm.git ~/.zpm\n\n# Install powerlevel9k\nmkdir ~/.zpm/plugi"
  },
  {
    "path": "docker/zpm/zshrc",
    "chars": 45,
    "preview": "source ~/.zpm/zpm.zsh\n\nzpm load powerlevel9k\n"
  },
  {
    "path": "docker/zshing/Dockerfile",
    "chars": 103,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zshing/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\n"
  },
  {
    "path": "docker/zshing/install.zsh",
    "chars": 337,
    "preview": "#!zsh\n\n# install zshing https://github.com/zakariaGatter/zshing\ngit clone https://github.com/zakariaGatter/zshing.git ~/"
  },
  {
    "path": "docker/zulu/Dockerfile",
    "chars": 101,
    "preview": "ARG base\nFROM p9k:${base}\n\nCOPY docker/zulu/install.zsh /tmp/\nRUN zsh /tmp/install.zsh\n\nCOPY ./ p9k/\n"
  },
  {
    "path": "docker/zulu/install.zsh",
    "chars": 218,
    "preview": "#!zsh\n\n# install zulu https://github.com/zulu-zsh/zulu\ncurl -L https://git.io/zulu-install | zsh && zsh\n\n{\necho 'zulu fp"
  },
  {
    "path": "functions/colors.zsh",
    "chars": 7180,
    "preview": "# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n################################################################\n# Color func"
  },
  {
    "path": "functions/icons.zsh",
    "chars": 32580,
    "preview": "# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n################################################################\n# icons\n# Th"
  },
  {
    "path": "functions/utilities.zsh",
    "chars": 13387,
    "preview": "# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n################################################################\n# Utility fu"
  },
  {
    "path": "functions/vcs.zsh",
    "chars": 6780,
    "preview": "# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n################################################################\n# vcs\n# This"
  },
  {
    "path": "powerlevel9k.zsh-theme",
    "chars": 74126,
    "preview": "# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n################################################################\n# powerlevel"
  },
  {
    "path": "test/core/color_overriding.spec",
    "chars": 2110,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/core/joining_segments.spec",
    "chars": 9138,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/core/prompt.spec",
    "chars": 3422,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/core/visual_identifier.spec",
    "chars": 2065,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/functions/colors.spec",
    "chars": 1754,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/functions/icons.spec",
    "chars": 17635,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/functions/utilities.spec",
    "chars": 2690,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/powerlevel9k.spec",
    "chars": 3615,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/anaconda.spec",
    "chars": 1890,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/aws_eb_env.spec",
    "chars": 1907,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/background_jobs.spec",
    "chars": 2165,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/battery.spec",
    "chars": 5822,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/command_execution_time.spec",
    "chars": 3102,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/context.spec",
    "chars": 3551,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/custom.spec",
    "chars": 2616,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/detect_virt.spec",
    "chars": 2590,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/dir.spec",
    "chars": 21480,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/disk_usage.spec",
    "chars": 3633,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/go_version.spec",
    "chars": 1996,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/ip.spec",
    "chars": 7149,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/kubecontext.spec",
    "chars": 2357,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/laravel_version.spec",
    "chars": 1810,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/load.spec",
    "chars": 3598,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/newline.spec",
    "chars": 1200,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/node_version.spec",
    "chars": 982,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/nodeenv.spec",
    "chars": 2018,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/nvm.spec",
    "chars": 1885,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/php_version.spec",
    "chars": 1063,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/public_ip.spec",
    "chars": 10399,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/ram.spec",
    "chars": 1712,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/rust_version.spec",
    "chars": 1241,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/ssh.spec",
    "chars": 2123,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/status.spec",
    "chars": 3430,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/swap.spec",
    "chars": 1501,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/swift_version.spec",
    "chars": 1480,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/symfony_version.spec",
    "chars": 3401,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/todo.spec",
    "chars": 1543,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/vcs-git.spec",
    "chars": 15281,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/vcs-hg.spec",
    "chars": 6240,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/vi_mode.spec",
    "chars": 1006,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/segments/vpn_ip.spec",
    "chars": 5777,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\n# Required for shunit2 to run correctly\nsetopt shwordsplit"
  },
  {
    "path": "test/suite.spec",
    "chars": 310,
    "preview": "#!/usr/bin/env zsh\n#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8\n\nlocal failed=false\n\nfor test in **/*.spec; do\n    echo\n   "
  },
  {
    "path": "test-bsd-vm/Vagrantfile",
    "chars": 3672,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# All Vagrant configuration is done below. The \"2\" in Vagrant.configure\n# conf"
  },
  {
    "path": "test-bsd-vm/bootstrap-zero.sh",
    "chars": 30,
    "preview": "#!/bin/sh\n\npkg install -y sudo"
  },
  {
    "path": "test-bsd-vm/bootstrap.sh",
    "chars": 265,
    "preview": "#!/bin/sh\n\n# Install ZSH\nsudo pkg install -y zsh\nsudo chsh -s `which zsh` vagrant\nsudo ln -s /usr/local/bin/zsh /usr/bin"
  },
  {
    "path": "test-in-docker",
    "chars": 4731,
    "preview": "#!/usr/bin/env zsh\n\nset -eu\n\n# The default ZSH to use; it can just be the first few characters.\n# This should be the old"
  },
  {
    "path": "test-vm/README.md",
    "chars": 1144,
    "preview": "# Test-VM for powerlevel9k\n\nIn this virtual machine you will find a recent ubuntu with preinstalled ZSH, oh-my-zsh, anti"
  },
  {
    "path": "test-vm/Vagrantfile",
    "chars": 3394,
    "preview": "# -*- mode: ruby -*-\n# vi: set ft=ruby :\n\n# All Vagrant configuration is done below. The \"2\" in Vagrant.configure\n# conf"
  },
  {
    "path": "test-vm/antigen.sh",
    "chars": 1089,
    "preview": "#!/usr/bin/zsh\n# We need to run this script in ZSH, so that switching user works!\nNEW_USER=vagrant-antigen\n# Create User"
  },
  {
    "path": "test-vm/bootstrap.sh",
    "chars": 487,
    "preview": "#!/bin/sh\n\n#sudo apt-get update\n\nsudo apt-get install -y curl\nsudo apt-get install -y git\n\nsudo apt-get install -y zsh\ns"
  },
  {
    "path": "test-vm/omz.sh",
    "chars": 1134,
    "preview": "#!/usr/bin/zsh\n# We need to run this script in ZSH, so that switching user works!\nNEW_USER=vagrant-omz\n# Create User\nPAS"
  },
  {
    "path": "test-vm/prezto.sh",
    "chars": 1229,
    "preview": "#!/usr/bin/zsh\n# We need to run this script in ZSH, so that switching user works!\nNEW_USER=vagrant-prezto\n# Create User\n"
  },
  {
    "path": "test-vm-providers/plain.sh",
    "chars": 273,
    "preview": "#!/usr/bin/zsh\n\necho 'LANG=en_US.UTF-8' >! ~/.zshrc\necho 'source /vagrant_data/powerlevel9k.zsh-theme' >> ~/.zshrc\n\necho"
  },
  {
    "path": "test-vm-providers/setup-environment.sh",
    "chars": 861,
    "preview": "#!/usr/bin/zsh\n\nOLDPWD=\"$(pwd)\"\ncd $HOME\n\nTESTFOLDER=\"${HOME}/p9k\"\nmkdir -p $TESTFOLDER\ncd $TESTFOLDER\n\n# Make a deep te"
  }
]

About this extraction

This page contains the full source code of the Powerlevel9k/powerlevel9k GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 111 files (416.5 KB), approximately 127.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!