parent
0f21cf5e2b
commit
7532ade0e3
42 changed files with 5093 additions and 4 deletions
@ -0,0 +1 @@ |
|||||||
|
test-vm/.vagrant |
@ -0,0 +1,3 @@ |
|||||||
|
[submodule "shunit2"] |
||||||
|
path = shunit2 |
||||||
|
url = https://github.com/kward/shunit2.git |
@ -0,0 +1,30 @@ |
|||||||
|
sudo: true |
||||||
|
dist: trusty |
||||||
|
language: sh |
||||||
|
addons: |
||||||
|
apt: |
||||||
|
packages: |
||||||
|
- build-essential |
||||||
|
|
||||||
|
before_script: |
||||||
|
# Show the git version being used to test. |
||||||
|
- "git --version" |
||||||
|
# Show the zsh version being used to test. |
||||||
|
- "zsh --version" |
||||||
|
|
||||||
|
install: |
||||||
|
- "sudo apt-get update -qq" |
||||||
|
- "sudo apt-get install -y zsh" |
||||||
|
- "sudo chsh -s $(which zsh)" |
||||||
|
- "sudo apt-get install -y git mercurial subversion jq node golang ruby python python-virtualenv" |
||||||
|
|
||||||
|
script: |
||||||
|
- test/powerlevel9k.spec |
||||||
|
- test/functions/utilities.spec |
||||||
|
- test/functions/colors.spec |
||||||
|
- test/functions/icons.spec |
||||||
|
- test/segments/command_execution_time.spec |
||||||
|
- test/segments/dir.spec |
||||||
|
- test/segments/rust_version.spec |
||||||
|
- test/segments/go_version.spec |
||||||
|
- test/segments/vcs.spec |
@ -0,0 +1,362 @@ |
|||||||
|
## 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. |
||||||
|
|
||||||
|
## 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 |
@ -0,0 +1,20 @@ |
|||||||
|
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. |
@ -0,0 +1,22 @@ |
|||||||
|
# Structure |
||||||
|
|
||||||
|
The Unit-Tests do not follow exactly the file structure of Powerlevel9k itself. |
||||||
|
|
||||||
|
## Basic Tests |
||||||
|
|
||||||
|
Basic Tests belong in `test/powerlevel9k.spec` if they test basic functionality of |
||||||
|
Powerlevel9k itself. Basic functions from the `functions` directory have their |
||||||
|
Tests in separate files under `test/functions`. |
||||||
|
|
||||||
|
## Segment Tests |
||||||
|
|
||||||
|
These Tests tend to be more complex in setup than the basic tests. To avoid ending |
||||||
|
up in a huge single file, there is one file per segment in `test/segments`. |
||||||
|
|
||||||
|
# Test-VMs |
||||||
|
|
||||||
|
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 could use our Test-VMs! |
||||||
|
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). |
@ -0,0 +1,182 @@ |
|||||||
|
#!/usr/bin/env zsh |
||||||
|
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 |
||||||
|
|
||||||
|
# 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 |
||||||
|
|
||||||
|
# Check $PPID for terminal emulator. |
||||||
|
while [[ -z "$term" ]]; do |
||||||
|
parent="$(get_ppid "$parent")" |
||||||
|
name="$(get_process_name "$parent")" |
||||||
|
|
||||||
|
case "${name// }" in |
||||||
|
"${SHELL/*\/}" | *"sh" | "tmux"* | "screen" | "su"*) ;; |
||||||
|
"login"* | *"Login"* | "init" | "(init)") term="$(tty)" ;; |
||||||
|
"ruby" | "1" | "systemd" | "sshd"* | "python"* | "USER"*"PID"*) break ;; |
||||||
|
"gnome-terminal-") term="gnome-terminal" ;; |
||||||
|
*) term="${name##*/}" ;; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
# Log that the function was run. |
||||||
|
#term_run=1 |
||||||
|
|
||||||
|
echo "${term}" |
||||||
|
} |
||||||
|
|
||||||
|
get_term_font() { |
||||||
|
local term="${1}" |
||||||
|
#((term_run != 1)) && get_term |
||||||
|
|
||||||
|
case "$term" in |
||||||
|
"alacritty"*) |
||||||
|
term_font="$(awk -F ':|#' '/normal:/ {getline; print}' "${XDG_CONFIG_HOME}/alacritty/alacritty.yml")" |
||||||
|
term_font="${term_font/*family:}" |
||||||
|
term_font="${term_font/$'\n'*}" |
||||||
|
term_font="${term_font/\#*}" |
||||||
|
;; |
||||||
|
|
||||||
|
"Apple_Terminal") |
||||||
|
term_font="$(osascript -e 'tell application "Terminal" to font name of window frontmost')" |
||||||
|
;; |
||||||
|
"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 window" |
||||||
|
# thou, 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 |
||||||
|
# and: https://gitlab.com/gnachman/iterm2/issues/5586 |
||||||
|
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 |
||||||
|
|
||||||
|
local nonAsciiFont |
||||||
|
|
||||||
|
# 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" |
||||||
|
term_font=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Normal\ Font:" ~/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. |
||||||
|
local useDifferentFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Use\ Non-ASCII\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) |
||||||
|
if [[ "$useDifferentFont" == "true" ]]; then |
||||||
|
local nonAsciiFont=$(/usr/libexec/PlistBuddy -c "Print :New\ Bookmarks:${idx}:Non\ Ascii\ Font:" ~/Library/Preferences/com.googlecode.iterm2.plist) |
||||||
|
if [[ "$term_font" != "$nonAsciiFont" ]]; then |
||||||
|
term_font="$term_font (normal) / $nonAsciiFont (non-ascii)" |
||||||
|
fi |
||||||
|
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")" |
||||||
|
;; |
||||||
|
|
||||||
|
"Hyper"*) |
||||||
|
term_font="$(awk -F "," '/fontFamily/ {a=$1} END{print a}' "${HOME}/.hyper.js" | awk -F "'" '{a=$2} END{print a}')" |
||||||
|
;; |
||||||
|
|
||||||
|
"konsole"*) |
||||||
|
# Get Process ID of current konsole window / tab |
||||||
|
child="$(get_ppid "$$")" |
||||||
|
|
||||||
|
konsole_instances=($(qdbus | grep 'org.kde.konsole')) |
||||||
|
|
||||||
|
for i in "${konsole_instances[@]}"; do |
||||||
|
konsole_sessions=($(qdbus "${i}" | grep '/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")" |
||||||
|
;; |
||||||
|
|
||||||
|
"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")" |
||||||
|
;; |
||||||
|
|
||||||
|
"sakura"*) |
||||||
|
term_font="$(awk -F '=' '/^font=/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/sakura/sakura.conf")" |
||||||
|
;; |
||||||
|
|
||||||
|
"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} /^font/ {if(opt==1) a=$2; opt=0} END{print a}' "/etc/xdg/termite/config" "$termite_config")" |
||||||
|
;; |
||||||
|
|
||||||
|
"urxvt" | "urxvtd" | "rxvt-unicode" | "xterm") |
||||||
|
term_font="$(grep -i -F "${term/d}*font" < <(xrdb -query))" |
||||||
|
term_font="${term_font/*font:}" |
||||||
|
term_font="$(trim "$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/:*}" |
||||||
|
;; |
||||||
|
|
||||||
|
"-"*) term_font="$(awk -F '\\-' '{printf $3}' <<< "$term_font")" ;; |
||||||
|
esac |
||||||
|
;; |
||||||
|
|
||||||
|
"xfce4-terminal") |
||||||
|
term_font="$(awk -F '=' '/^FontName/ {a=$2} END{print a}' "${XDG_CONFIG_HOME}/xfce4/terminal/terminalrc")" |
||||||
|
;; |
||||||
|
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 |
@ -0,0 +1,86 @@ |
|||||||
|
#!/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 |
@ -0,0 +1,56 @@ |
|||||||
|
# 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 |
||||||
|
################################################################ |
||||||
|
|
||||||
|
# Get numerical color codes. That way we translate ANSI codes |
||||||
|
# into ZSH-Style color codes. |
||||||
|
function getColorCode() { |
||||||
|
# Check if given value is already numerical |
||||||
|
if [[ "$1" = <-> ]]; then |
||||||
|
# ANSI color codes distinguish between "foreground" |
||||||
|
# and "background" colors. We don't need to do that, |
||||||
|
# as ZSH uses a 256 color space anyway. |
||||||
|
if [[ "$1" = <8-15> ]]; then |
||||||
|
echo $(($1 - 8)) |
||||||
|
else |
||||||
|
echo "$1" |
||||||
|
fi |
||||||
|
else |
||||||
|
typeset -A codes |
||||||
|
codes=( |
||||||
|
'black' '000' |
||||||
|
'red' '001' |
||||||
|
'green' '002' |
||||||
|
'yellow' '003' |
||||||
|
'blue' '004' |
||||||
|
'magenta' '005' |
||||||
|
'cyan' '006' |
||||||
|
'white' '007' |
||||||
|
) |
||||||
|
|
||||||
|
# Strip eventual "bg-" prefixes |
||||||
|
1=${1#bg-} |
||||||
|
# Strip eventual "fg-" prefixes |
||||||
|
1=${1#fg-} |
||||||
|
# Strip eventual "br" prefixes ("bright" colors) |
||||||
|
1=${1#br} |
||||||
|
echo $codes[$1] |
||||||
|
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 )) |
||||||
|
} |
||||||
|
|
@ -0,0 +1,234 @@ |
|||||||
|
# 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() { |
||||||
|
local varname="$1" |
||||||
|
|
||||||
|
typeset -p "$varname" > /dev/null 2>&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 |
||||||
|
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') |
||||||
|
;; |
||||||
|
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' |
||||||
|
OS_ICON=$(print_icon 'LINUX_ICON') |
||||||
|
|
||||||
|
# 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 |
||||||
|
if [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)$key]}" ]] || [[ -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)$key]}" ]]; then |
||||||
|
return 0 |
||||||
|
else |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 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 for |
||||||
|
# `truncate_from_right` |
||||||
|
function truncatePathFromRight() { |
||||||
|
local delim_len=${#POWERLEVEL9K_SHORTEN_DELIMITER} |
||||||
|
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 |
||||||
|
} |
@ -0,0 +1,152 @@ |
|||||||
|
# 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 true |
||||||
|
function +vi-git-untracked() { |
||||||
|
# TODO: check git >= 1.7.2 - see function git_compare_version() |
||||||
|
local FLAGS |
||||||
|
FLAGS=('--porcelain') |
||||||
|
|
||||||
|
if [[ "$POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY" == "false" ]]; then |
||||||
|
FLAGS+='--ignore-submodules=dirty' |
||||||
|
fi |
||||||
|
|
||||||
|
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' && \ |
||||||
|
-n $(git status ${FLAGS} | grep -E '^\?\?' 2> /dev/null | tail -n1) ]]; then |
||||||
|
hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" |
||||||
|
VCS_WORKDIR_HALF_DIRTY=true |
||||||
|
else |
||||||
|
VCS_WORKDIR_HALF_DIRTY=false |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
function +vi-git-aheadbehind() { |
||||||
|
local ahead behind branch_name |
||||||
|
local -a gitstatus |
||||||
|
|
||||||
|
branch_name=$(git symbolic-ref --short HEAD 2>/dev/null) |
||||||
|
|
||||||
|
# for git prior to 1.7 |
||||||
|
# ahead=$(git rev-list origin/${branch_name}..HEAD | wc -l) |
||||||
|
ahead=$(git rev-list "${branch_name}"@{upstream}..HEAD 2>/dev/null | wc -l) |
||||||
|
(( ahead )) && gitstatus+=( " $(print_icon 'VCS_OUTGOING_CHANGES_ICON')${ahead// /}" ) |
||||||
|
|
||||||
|
# for git prior to 1.7 |
||||||
|
# behind=$(git rev-list HEAD..origin/${branch_name} | wc -l) |
||||||
|
behind=$(git rev-list HEAD.."${branch_name}"@{upstream} 2>/dev/null | wc -l) |
||||||
|
(( behind )) && gitstatus+=( " $(print_icon 'VCS_INCOMING_CHANGES_ICON')${behind// /}" ) |
||||||
|
|
||||||
|
hook_com[misc]+=${(j::)gitstatus} |
||||||
|
} |
||||||
|
|
||||||
|
function +vi-git-remotebranch() { |
||||||
|
local remote branch_name |
||||||
|
|
||||||
|
# Are we on a remote-tracking branch? |
||||||
|
remote=${$(git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/} |
||||||
|
branch_name=$(git symbolic-ref --short HEAD 2>/dev/null) |
||||||
|
|
||||||
|
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=$(git describe --tags --exact-match HEAD 2>/dev/null) |
||||||
|
|
||||||
|
if [[ -n "${tag}" ]] ; then |
||||||
|
# There is a tag that points to our current commit. Need to determine if we |
||||||
|
# are also on a branch, or are in a DETACHED_HEAD state. |
||||||
|
if [[ -z $(git symbolic-ref HEAD 2>/dev/null) ]]; then |
||||||
|
# DETACHED_HEAD state. We want to append the tag name to the commit hash |
||||||
|
# and print it. Unfortunately, `vcs_info` blows away the hash when a tag |
||||||
|
# exists, so we have to manually retrieve it and clobber the branch |
||||||
|
# string. |
||||||
|
local revision |
||||||
|
revision=$(git rev-list -n 1 --abbrev-commit --abbrev=${POWERLEVEL9K_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() { |
||||||
|
local -a stashes |
||||||
|
|
||||||
|
if [[ -s $(git rev-parse --git-dir)/refs/stash ]] ; then |
||||||
|
stashes=$(git stash list 2>/dev/null | wc -l) |
||||||
|
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=$(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" =~ "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 diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@ |
|||||||
|
powerlevel9k.zsh-theme |
@ -0,0 +1,87 @@ |
|||||||
|
# -*- mode: ruby -*- |
||||||
|
# vi: set ft=ruby : |
||||||
|
|
||||||
|
# All Vagrant configuration is done below. The "2" in Vagrant.configure |
||||||
|
# configures the configuration version (we support older styles for |
||||||
|
# backwards compatibility). Please don't change it unless you know what |
||||||
|
# you're doing. |
||||||
|
Vagrant.configure("2") do |config| |
||||||
|
# The most common configuration options are documented and commented below. |
||||||
|
# For a complete reference, please see the online documentation at |
||||||
|
# https://docs.vagrantup.com. |
||||||
|
|
||||||
|
# Every Vagrant development environment requires a box. You can search for |
||||||
|
# boxes at https://atlas.hashicorp.com/search. |
||||||
|
config.vm.box = "freebsd/FreeBSD-11.0-STABLE" |
||||||
|
|
||||||
|
# Bootstrap |
||||||
|
config.vm.provision :shell, path: "bootstrap-zero.sh", privileged: true |
||||||
|
config.vm.provision :shell, path: "bootstrap.sh", privileged: false |
||||||
|
config.vm.provision :shell, path: "../test-vm-providers/plain.sh", privileged: false |
||||||
|
|
||||||
|
# Disable automatic box update checking. If you disable this, then |
||||||
|
# boxes will only be checked for updates when the user runs |
||||||
|
# `vagrant box outdated`. This is not recommended. |
||||||
|
# config.vm.box_check_update = false |
||||||
|
|
||||||
|
# Create a forwarded port mapping which allows access to a specific port |
||||||
|
# within the machine from a port on the host machine. In the example below, |
||||||
|
# accessing "localhost:8080" will access port 80 on the guest machine. |
||||||
|
# config.vm.network "forwarded_port", guest: 80, host: 8080 |
||||||
|
|
||||||
|
# Create a private network, which allows host-only access to the machine |
||||||
|
# using a specific IP. |
||||||
|
config.vm.network "private_network", ip: "192.168.33.10" |
||||||
|
|
||||||
|
# Create a public network, which generally matched to bridged network. |
||||||
|
# Bridged networks make the machine appear as another physical device on |
||||||
|
# your network. |
||||||
|
#config.vm.network "public_network" |
||||||
|
|
||||||
|
# The BSD base box does not define a MAC address. Whysoever. |
||||||
|
config.vm.base_mac = "8AAB4975994A" |
||||||
|
|
||||||
|
# There is no BASH for root on BSD. We need to set another shell. |
||||||
|
# See https://www.freebsd.org/doc/en/articles/linux-users/shells.html |
||||||
|
config.ssh.shell = "/bin/sh" |
||||||
|
|
||||||
|
# Share an additional folder to the guest VM. The first argument is |
||||||
|
# the path on the host to the actual folder. The second argument is |
||||||
|
# the path on the guest to mount the folder. And the optional third |
||||||
|
# argument is a set of non-required options. |
||||||
|
config.vm.synced_folder "..", "/vagrant_data", type: "nfs" |
||||||
|
config.vm.synced_folder ".", "/vagrant", type: "nfs" |
||||||
|
|
||||||
|
# Provider-specific configuration so you can fine-tune various |
||||||
|
# backing providers for Vagrant. These expose provider-specific options. |
||||||
|
# Example for VirtualBox: |
||||||
|
config.vm.provider "virtualbox" do |vb| |
||||||
|
|
||||||
|
# Change name to "powerlevel9k-bsd" |
||||||
|
vb.name = "powerlevel9k-bsd" |
||||||
|
|
||||||
|
# Display the VirtualBox GUI when booting the machine |
||||||
|
#vb.gui = true |
||||||
|
|
||||||
|
# Customize the amount of memory on the VM: |
||||||
|
vb.memory = "256" |
||||||
|
end |
||||||
|
|
||||||
|
# View the documentation for the provider you are using for more |
||||||
|
# information on available options. |
||||||
|
|
||||||
|
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies |
||||||
|
# such as FTP and Heroku are also available. See the documentation at |
||||||
|
# https://docs.vagrantup.com/v2/push/atlas.html for more information. |
||||||
|
# config.push.define "atlas" do |push| |
||||||
|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" |
||||||
|
# end |
||||||
|
|
||||||
|
# Enable provisioning with a shell script. Additional provisioners such as |
||||||
|
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the |
||||||
|
# documentation for more information about their specific syntax and use. |
||||||
|
# config.vm.provision "shell", inline: <<-SHELL |
||||||
|
# apt-get update |
||||||
|
# apt-get install -y apache2 |
||||||
|
# SHELL |
||||||
|
end |
@ -0,0 +1,3 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
pkg install -y sudo |
@ -0,0 +1,13 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
# Install ZSH |
||||||
|
sudo pkg install -y zsh |
||||||
|
sudo chsh -s `which zsh` vagrant |
||||||
|
sudo ln -s /usr/local/bin/zsh /usr/bin/zsh |
||||||
|
|
||||||
|
# Install git |
||||||
|
sudo pkg install -y git |
||||||
|
# Install mercurial |
||||||
|
sudo pkg install -y mercurial |
||||||
|
# Install subversion |
||||||
|
sudo pkg install -y subversion |
@ -0,0 +1,9 @@ |
|||||||
|
#!/usr/bin/zsh |
||||||
|
|
||||||
|
echo 'LANG=en_US.UTF-8' >! ~/.zshrc |
||||||
|
echo 'source /vagrant_data/powerlevel9k.zsh-theme' >> ~/.zshrc |
||||||
|
|
||||||
|
echo 'echo "Have a look at the ~/p9k folder for prepared test setups."' >> ~/.zshrc |
||||||
|
|
||||||
|
# setup environment |
||||||
|
/vagrant_data/test-vm-providers/setup-environment.sh |
@ -0,0 +1,44 @@ |
|||||||
|
#!/usr/bin/zsh |
||||||
|
|
||||||
|
OLDPWD="$(pwd)" |
||||||
|
cd $HOME |
||||||
|
|
||||||
|
TESTFOLDER="${HOME}/p9k" |
||||||
|
mkdir -p $TESTFOLDER |
||||||
|
cd $TESTFOLDER |
||||||
|
|
||||||
|
# Make a deep test folder |
||||||
|
mkdir -p deep-folder/1/12/123/1234/12345/123456/1234567/123455678/123456789 |
||||||
|
|
||||||
|
# Make a git repo |
||||||
|
mkdir git-repo |
||||||
|
cd git-repo |
||||||
|
git config --global user.email "test@powerlevel9k.theme" |
||||||
|
git config --global user.name "Testing Tester" |
||||||
|
git init |
||||||
|
echo "TEST" >> testfile |
||||||
|
git add testfile |
||||||
|
git commit -m "Initial commit" |
||||||
|
cd $TESTFOLDER |
||||||
|
|
||||||
|
# Make a Mercurial repo |
||||||
|
mkdir hg-repo |
||||||
|
cd hg-repo |
||||||
|
export HGUSER="Test bot <bot@example.com>" |
||||||
|
hg init |
||||||
|
echo "TEST" >> testfile |
||||||
|
hg add testfile |
||||||
|
hg ci -m "Initial commit" |
||||||
|
cd $TESTFOLDER |
||||||
|
|
||||||
|
# Setup a SVN folder |
||||||
|
svnadmin create ~/.svn-repo |
||||||
|
mkdir svn-repo |
||||||
|
svn checkout "file://${HOME}/.svn-repo" "svn-repo" |
||||||
|
cd svn-repo |
||||||
|
echo "TEST" >> testfile |
||||||
|
svn add testfile |
||||||
|
svn commit -m "Initial commit" |
||||||
|
cd $TESTFOLDER |
||||||
|
|
||||||
|
cd $OLDPWD |
@ -0,0 +1,25 @@ |
|||||||
|
# Test-VM for powerlevel9k |
||||||
|
|
||||||
|
In this virtual machine you will find a recent ubuntu with preinstalled ZSH, oh-my-zsh, antigen, prezto and - of course - powerlevel9k. The main use-case is to test the powerlevel9k theme. |
||||||
|
|
||||||
|
## Installation |
||||||
|
|
||||||
|
In order to run this virtual machine, you need [vagrant](https://www.vagrantup.com/) and [VirtualBox](http://www.virtualbox.org/). |
||||||
|
|
||||||
|
## Running |
||||||
|
|
||||||
|
`vagrant` is a quite easy to use command line tool to configure a virtual machine. To fire the machine up, just run `vagrant up`. At the first run, it will install a whole ubuntu. With `vagrant ssh` you can log in into the machine. |
||||||
|
|
||||||
|
## Testing |
||||||
|
|
||||||
|
Once you have SSH'd into the machine, you'll see a plain ZSH. To test the other frameworks, you just have to switch to one of the following users: |
||||||
|
|
||||||
|
* `vagrant-antigen` |
||||||
|
* `vagrant-prezto` |
||||||
|
* `vagrant-omz` |
||||||
|
|
||||||
|
To switch use `sudo -i -H -u <USERNAME>`. `-i` stands for "simulate initial login", `-H` sets the "$HOME" variable to the directory of the user , `-u` for the username. |
||||||
|
|
||||||
|
All users have `vagrant` as password and are in the /etc/sudoers. |
||||||
|
|
||||||
|
The regular `vagrant` user has a plain ZSH with the powerlevel9k theme. |
@ -0,0 +1,82 @@ |
|||||||
|
# -*- mode: ruby -*- |
||||||
|
# vi: set ft=ruby : |
||||||
|
|
||||||
|
# All Vagrant configuration is done below. The "2" in Vagrant.configure |
||||||
|
# configures the configuration version (we support older styles for |
||||||
|
# backwards compatibility). Please don't change it unless you know what |
||||||
|
# you're doing. |
||||||
|
Vagrant.configure(2) do |config| |
||||||
|
# The most common configuration options are documented and commented below. |
||||||
|
# For a complete reference, please see the online documentation at |
||||||
|
# https://docs.vagrantup.com. |
||||||
|
|
||||||
|
# Every Vagrant development environment requires a box. You can search for |
||||||
|
# boxes at https://atlas.hashicorp.com/search. |
||||||
|
config.vm.box = "ubuntu/precise64" |
||||||
|
|
||||||
|
# Bootstrap |
||||||
|
config.vm.provision :shell, path: "bootstrap.sh", privileged: false |
||||||
|
config.vm.provision :shell, path: "../test-vm-providers/plain.sh", privileged: false |
||||||
|
config.vm.provision :shell, path: "antigen.sh" |
||||||
|
config.vm.provision :shell, path: "prezto.sh" |
||||||
|
config.vm.provision :shell, path: "omz.sh" |
||||||
|
|
||||||
|
# Disable automatic box update checking. If you disable this, then |
||||||
|
# boxes will only be checked for updates when the user runs |
||||||
|
# `vagrant box outdated`. This is not recommended. |
||||||
|
# config.vm.box_check_update = false |
||||||
|
|
||||||
|
# Create a forwarded port mapping which allows access to a specific port |
||||||
|
# within the machine from a port on the host machine. In the example below, |
||||||
|
# accessing "localhost:8080" will access port 80 on the guest machine. |
||||||
|
# config.vm.network "forwarded_port", guest: 80, host: 8080 |
||||||
|
|
||||||
|
# Create a private network, which allows host-only access to the machine |
||||||
|
# using a specific IP. |
||||||
|
# config.vm.network "private_network", ip: "192.168.33.10" |
||||||
|
|
||||||
|
# Create a public network, which generally matched to bridged network. |
||||||
|
# Bridged networks make the machine appear as another physical device on |
||||||
|
# your network. |
||||||
|
# config.vm.network "public_network" |
||||||
|
|
||||||
|
# Share an additional folder to the guest VM. The first argument is |
||||||
|
# the path on the host to the actual folder. The second argument is |
||||||
|
# the path on the guest to mount the folder. And the optional third |
||||||
|
# argument is a set of non-required options. |
||||||
|
config.vm.synced_folder "..", "/vagrant_data" |
||||||
|
|
||||||
|
# Provider-specific configuration so you can fine-tune various |
||||||
|
# backing providers for Vagrant. These expose provider-specific options. |
||||||
|
# Example for VirtualBox: |
||||||
|
|
||||||
|
config.vm.provider "virtualbox" do |vb| |
||||||
|
|
||||||
|
# Change name to "powerlevel9k" |
||||||
|
vb.name = "powerlevel9k" |
||||||
|
|
||||||
|
# Display the VirtualBox GUI when booting the machine |
||||||
|
#vb.gui = true |
||||||
|
|
||||||
|
# Customize the amount of memory on the VM: |
||||||
|
vb.memory = "256" |
||||||
|
end |
||||||
|
# |
||||||
|
# View the documentation for the provider you are using for more |
||||||
|
# information on available options. |
||||||
|
|
||||||
|
# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies |
||||||
|
# such as FTP and Heroku are also available. See the documentation at |
||||||
|
# https://docs.vagrantup.com/v2/push/atlas.html for more information. |
||||||
|
# config.push.define "atlas" do |push| |
||||||
|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" |
||||||
|
# end |
||||||
|
|
||||||
|
# Enable provisioning with a shell script. Additional provisioners such as |
||||||
|
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the |
||||||
|
# documentation for more information about their specific syntax and use. |
||||||
|
# config.vm.provision "shell", inline: <<-SHELL |
||||||
|
# sudo apt-get update |
||||||
|
# sudo apt-get install -y apache2 |
||||||
|
# SHELL |
||||||
|
end |
@ -0,0 +1,30 @@ |
|||||||
|
#!/usr/bin/zsh |
||||||
|
# We need to run this script in ZSH, so that switching user works! |
||||||
|
NEW_USER=vagrant-antigen |
||||||
|
# Create User |
||||||
|
PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' |
||||||
|
useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER |
||||||
|
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER |
||||||
|
chmod 440 /etc/sudoers.d/$NEW_USER |
||||||
|
|
||||||
|
( |
||||||
|
# Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) |
||||||
|
USERNAME=$NEW_USER |
||||||
|
#UID=$(id -u $NEW_USER) |
||||||
|
#EUID=$(id -u $NEW_USER) |
||||||
|
HOME=/home/$NEW_USER |
||||||
|
|
||||||
|
echo " |
||||||
|
source ~/antigen/antigen.zsh\n |
||||||
|
antigen theme /vagrant_data powerlevel9k --no-local-clone\n |
||||||
|
antigen apply |
||||||
|
" > ~/.zshrc |
||||||
|
|
||||||
|
# install antigen |
||||||
|
mkdir ~/antigen |
||||||
|
curl -qL https://raw.githubusercontent.com/zsh-users/antigen/master/antigen.zsh > ~/antigen/antigen.zsh |
||||||
|
source ~/antigen/antigen.zsh |
||||||
|
|
||||||
|
# setup environment |
||||||
|
/vagrant_data/test-vm-providers/setup-environment.sh |
||||||
|
) |
@ -0,0 +1,19 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
#sudo apt-get update |
||||||
|
|
||||||
|
sudo apt-get install -y curl |
||||||
|
sudo apt-get install -y git |
||||||
|
|
||||||
|
sudo apt-get install -y zsh |
||||||
|
sudo chsh -s $(which zsh) vagrant |
||||||
|
|
||||||
|
# Install mercurial |
||||||
|
sudo apt-get install -y mercurial |
||||||
|
# Install Subversion |
||||||
|
sudo apt-get install -y subversion |
||||||
|
# install golang |
||||||
|
echo 'golang-go golang-go/dashboard boolean false' | sudo debconf-set-selections |
||||||
|
sudo apt-get install -y golang |
||||||
|
# Install dependencies for tests |
||||||
|
sudo apt-get install -y jq node ruby python python-virtualenv |
@ -0,0 +1,33 @@ |
|||||||
|
#!/usr/bin/zsh |
||||||
|
# We need to run this script in ZSH, so that switching user works! |
||||||
|
NEW_USER=vagrant-omz |
||||||
|
# Create User |
||||||
|
PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' |
||||||
|
useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER |
||||||
|
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER |
||||||
|
chmod 440 /etc/sudoers.d/$NEW_USER |
||||||
|
|
||||||
|
( |
||||||
|
# Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) |
||||||
|
USERNAME=$NEW_USER |
||||||
|
#UID=$(id -u $NEW_USER) |
||||||
|
#EUID=$(id -u $NEW_USER) |
||||||
|
HOME=/home/$NEW_USER |
||||||
|
SHELL=$(which zsh) |
||||||
|
|
||||||
|
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" |
||||||
|
|
||||||
|
mkdir -p ~/.oh-my-zsh/custom/themes |
||||||
|
ln -s /vagrant_data ~/.oh-my-zsh/custom/themes/powerlevel9k |
||||||
|
|
||||||
|
echo ' |
||||||
|
export ZSH=$HOME/.oh-my-zsh |
||||||
|
ZSH_THEME="powerlevel9k/powerlevel9k" |
||||||
|
plugins=(git rake ruby) |
||||||
|
|
||||||
|
source $ZSH/oh-my-zsh.sh |
||||||
|
' > $HOME/.zshrc |
||||||
|
|
||||||
|
# setup environment |
||||||
|
/vagrant_data/test-vm-providers/setup-environment.sh |
||||||
|
) |
@ -0,0 +1,29 @@ |
|||||||
|
#!/usr/bin/zsh |
||||||
|
# We need to run this script in ZSH, so that switching user works! |
||||||
|
NEW_USER=vagrant-prezto |
||||||
|
# Create User |
||||||
|
PASSWORD='$6$OgLg9v2Z$Db38Jr9inZG7y8BzL8kqFK23fF5jZ7FU1oiIBLFjNYR9XVX03fwQayMgA6Rm1rzLbXaf.gkZaTWhB9pv5XLq11' |
||||||
|
useradd -p $PASSWORD -g vagrant -s $(which zsh) -m $NEW_USER |
||||||
|
echo "$NEW_USER ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/$NEW_USER |
||||||
|
chmod 440 /etc/sudoers.d/$NEW_USER |
||||||
|
|
||||||
|
( |
||||||
|
# Change User (See http://unix.stackexchange.com/questions/86778/why-cant-we-execute-a-list-of-commands-as-different-user-without-sudo) |
||||||
|
USERNAME=$NEW_USER |
||||||
|
#UID=$(id -u $NEW_USER) |
||||||
|
#EUID=$(id -u $NEW_USER) |
||||||
|
HOME=/home/$NEW_USER |
||||||
|
|
||||||
|
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 -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}" |
||||||
|
done |
||||||
|
|
||||||
|
ln -s /vagrant_data/powerlevel9k.zsh-theme ~/.zprezto/modules/prompt/functions/prompt_powerlevel9k_setup |
||||||
|
sed -i "s/theme\ 'sorin'/theme\ 'powerlevel9k'/g" ~/.zpreztorc |
||||||
|
|
||||||
|
# setup environment |
||||||
|
/vagrant_data/test-vm-providers/setup-environment.sh |
||||||
|
) |
@ -0,0 +1,42 @@ |
|||||||
|
#!/usr/bin/env zsh |
||||||
|
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 |
||||||
|
|
||||||
|
# Required for shunit2 to run correctly |
||||||
|
setopt shwordsplit |
||||||
|
SHUNIT_PARENT=$0 |
||||||
|
|
||||||
|
function setUp() { |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/colors.zsh |
||||||
|
} |
||||||
|
|
||||||
|
function testGetColorCodeWithAnsiForegroundColor() { |
||||||
|
assertEquals '002' "$(getColorCode 'green')" |
||||||
|
} |
||||||
|
|
||||||
|
function testGetColorCodeWithAnsiBackgroundColor() { |
||||||
|
assertEquals '002' "$(getColorCode 'bg-green')" |
||||||
|
} |
||||||
|
|
||||||
|
function testGetColorCodeWithNumericalColor() { |
||||||
|
assertEquals '002' "$(getColorCode '002')" |
||||||
|
} |
||||||
|
|
||||||
|
function testIsSameColorComparesAnsiForegroundAndNumericalColorCorrectly() { |
||||||
|
assertTrue "isSameColor 'green' '002'" |
||||||
|
} |
||||||
|
|
||||||
|
function testIsSameColorComparesAnsiBackgroundAndNumericalColorCorrectly() { |
||||||
|
assertTrue "isSameColor 'bg-green' '002'" |
||||||
|
} |
||||||
|
|
||||||
|
function testIsSameColorComparesNumericalBackgroundAndNumericalColorCorrectly() { |
||||||
|
assertTrue "isSameColor '010' '2'" |
||||||
|
} |
||||||
|
|
||||||
|
function testIsSameColorDoesNotYieldNotEqualColorsTruthy() { |
||||||
|
assertFalse "isSameColor 'green' '003'" |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
source shunit2/source/2.1/src/shunit2 |
@ -0,0 +1,362 @@ |
|||||||
|
#!/usr/bin/env zsh |
||||||
|
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 |
||||||
|
|
||||||
|
# Required for shunit2 to run correctly |
||||||
|
setopt shwordsplit |
||||||
|
SHUNIT_PARENT=$0 |
||||||
|
|
||||||
|
function setUp() { |
||||||
|
# Store old value for LC_CTYPE |
||||||
|
_OLD_LC_CTYPE="${LC_CTYPE}" |
||||||
|
# Reset actual LC_CTYPE |
||||||
|
unset LC_CTYPE |
||||||
|
|
||||||
|
# Store old P9K mode |
||||||
|
_OLD_P9K_MODE="${POWERLEVEL9K_MODE}" |
||||||
|
} |
||||||
|
|
||||||
|
function tearDown() { |
||||||
|
# Restore LC_CTYPE |
||||||
|
LC_CTYPE="${_OLD_LC_CTYPE}" |
||||||
|
|
||||||
|
# Restore old P9K mode |
||||||
|
POWERLEVEL9K_MODE="${_OLD_P9K_MODE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInDefaultMode() { |
||||||
|
POWERLEVEL9K_MODE="default" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInAwesomePatchedMode() { |
||||||
|
POWERLEVEL9K_MODE="awesome-patched" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInAwesomeFontconfigMode() { |
||||||
|
POWERLEVEL9K_MODE="awesome-fontconfig" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInNerdfontFontconfigMode() { |
||||||
|
POWERLEVEL9K_MODE="nerdfont-fontconfig" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInFlatMode() { |
||||||
|
POWERLEVEL9K_MODE="flat" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
function testLcCtypeIsSetCorrectlyInCompatibleMode() { |
||||||
|
POWERLEVEL9K_MODE="compatible" |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
|
||||||
|
assertEquals 'en_US.UTF-8' "${LC_CTYPE}" |
||||||
|
} |
||||||
|
|
||||||
|
# Go through all icons defined in default mode, and |
||||||
|
# check if all of them are defined in the other modes. |
||||||
|
function testAllIconsAreDefinedLikeInDefaultMode() { |
||||||
|
# Always compare against this mode |
||||||
|
local _P9K_TEST_MODE="default" |
||||||
|
POWERLEVEL9K_MODE="${_P9K_TEST_MODE}" |
||||||
|
source functions/icons.zsh |
||||||
|
# _ICONS_UNDER_TEST is an array of just the keys of $icons. |
||||||
|
# We later check via (r) "subscript" flag that our key |
||||||
|
# is in the values of our flat array. |
||||||
|
typeset -ah _ICONS_UNDER_TEST |
||||||
|
_ICONS_UNDER_TEST=(${(k)icons[@]}) |
||||||
|
|
||||||
|
# Switch to "awesome-patched" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-patched" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
# Iterate over all keys found in the _ICONS_UNDER_TEST |
||||||
|
# array and compare it with the icons array of the |
||||||
|
# current POWERLEVEL9K_MODE. |
||||||
|
# Use parameter expansion, to directly check if the |
||||||
|
# key exists in the flat current array of keys. That |
||||||
|
# is quite complicated, but there seems no easy way |
||||||
|
# to check the mere existance of a key in an array. |
||||||
|
# The usual way would always return the value, so that |
||||||
|
# would do the wrong thing as we have some (on purpose) |
||||||
|
# empty values. |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "awesome-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "nerdfont-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="nerdfont-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "flat" mode |
||||||
|
POWERLEVEL9K_MODE="flat" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "compatible" mode |
||||||
|
POWERLEVEL9K_MODE="compatible" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
unset current_icons |
||||||
|
unset _ICONS_UNDER_TEST |
||||||
|
} |
||||||
|
|
||||||
|
# Go through all icons defined in awesome-patched mode, and |
||||||
|
# check if all of them are defined in the other modes. |
||||||
|
function testAllIconsAreDefinedLikeInAwesomePatchedMode() { |
||||||
|
# Always compare against this mode |
||||||
|
local _P9K_TEST_MODE="awesome-patched" |
||||||
|
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" |
||||||
|
source functions/icons.zsh |
||||||
|
# _ICONS_UNDER_TEST is an array of just the keys of $icons. |
||||||
|
# We later check via (r) "subscript" flag that our key |
||||||
|
# is in the values of our flat array. |
||||||
|
typeset -ah _ICONS_UNDER_TEST |
||||||
|
_ICONS_UNDER_TEST=(${(k)icons[@]}) |
||||||
|
|
||||||
|
# Switch to "default" mode |
||||||
|
POWERLEVEL9K_MODE="default" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
# Iterate over all keys found in the _ICONS_UNDER_TEST |
||||||
|
# array and compare it with the icons array of the |
||||||
|
# current POWERLEVEL9K_MODE. |
||||||
|
# Use parameter expansion, to directly check if the |
||||||
|
# key exists in the flat current array of keys. That |
||||||
|
# is quite complicated, but there seems no easy way |
||||||
|
# to check the mere existance of a key in an array. |
||||||
|
# The usual way would always return the value, so that |
||||||
|
# would do the wrong thing as we have some (on purpose) |
||||||
|
# empty values. |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "awesome-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "nerdfont-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="nerdfont-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "flat" mode |
||||||
|
POWERLEVEL9K_MODE="flat" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "compatible" mode |
||||||
|
POWERLEVEL9K_MODE="compatible" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
unset current_icons |
||||||
|
unset _ICONS_UNDER_TEST |
||||||
|
} |
||||||
|
|
||||||
|
# Go through all icons defined in awesome-fontconfig mode, and |
||||||
|
# check if all of them are defined in the other modes. |
||||||
|
function testAllIconsAreDefinedLikeInAwesomeFontconfigMode() { |
||||||
|
# Always compare against this mode |
||||||
|
local _P9K_TEST_MODE="awesome-fontconfig" |
||||||
|
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" |
||||||
|
source functions/icons.zsh |
||||||
|
# _ICONS_UNDER_TEST is an array of just the keys of $icons. |
||||||
|
# We later check via (r) "subscript" flag that our key |
||||||
|
# is in the values of our flat array. |
||||||
|
typeset -ah _ICONS_UNDER_TEST |
||||||
|
_ICONS_UNDER_TEST=(${(k)icons[@]}) |
||||||
|
|
||||||
|
# Switch to "default" mode |
||||||
|
POWERLEVEL9K_MODE="default" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
# Iterate over all keys found in the _ICONS_UNDER_TEST |
||||||
|
# array and compare it with the icons array of the |
||||||
|
# current POWERLEVEL9K_MODE. |
||||||
|
# Use parameter expansion, to directly check if the |
||||||
|
# key exists in the flat current array of keys. That |
||||||
|
# is quite complicated, but there seems no easy way |
||||||
|
# to check the mere existance of a key in an array. |
||||||
|
# The usual way would always return the value, so that |
||||||
|
# would do the wrong thing as we have some (on purpose) |
||||||
|
# empty values. |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "awesome-patched" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-patched" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "nerdfont-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="nerdfont-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "flat" mode |
||||||
|
POWERLEVEL9K_MODE="flat" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "compatible" mode |
||||||
|
POWERLEVEL9K_MODE="compatible" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
unset current_icons |
||||||
|
unset _ICONS_UNDER_TEST |
||||||
|
} |
||||||
|
|
||||||
|
# Go through all icons defined in nerdfont-fontconfig mode, and |
||||||
|
# check if all of them are defined in the other modes. |
||||||
|
function testAllIconsAreDefinedLikeInNerdfontFontconfigMode() { |
||||||
|
# Always compare against this mode |
||||||
|
local _P9K_TEST_MODE="nerdfont-fontconfig" |
||||||
|
POWERLEVEL9K_MODE="$_P9K_TEST_MODE" |
||||||
|
source functions/icons.zsh |
||||||
|
# _ICONS_UNDER_TEST is an array of just the keys of $icons. |
||||||
|
# We later check via (r) "subscript" flag that our key |
||||||
|
# is in the values of our flat array. |
||||||
|
typeset -ah _ICONS_UNDER_TEST |
||||||
|
_ICONS_UNDER_TEST=(${(k)icons[@]}) |
||||||
|
|
||||||
|
# Switch to "default" mode |
||||||
|
POWERLEVEL9K_MODE="default" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
# Iterate over all keys found in the _ICONS_UNDER_TEST |
||||||
|
# array and compare it with the icons array of the |
||||||
|
# current POWERLEVEL9K_MODE. |
||||||
|
# Use parameter expansion, to directly check if the |
||||||
|
# key exists in the flat current array of keys. That |
||||||
|
# is quite complicated, but there seems no easy way |
||||||
|
# to check the mere existance of a key in an array. |
||||||
|
# The usual way would always return the value, so that |
||||||
|
# would do the wrong thing as we have some (on purpose) |
||||||
|
# empty values. |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "awesome-patched" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-patched" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "awesome-fontconfig" mode |
||||||
|
POWERLEVEL9K_MODE="awesome-fontconfig" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "flat" mode |
||||||
|
POWERLEVEL9K_MODE="flat" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
# Switch to "compatible" mode |
||||||
|
POWERLEVEL9K_MODE="compatible" |
||||||
|
source functions/icons.zsh |
||||||
|
typeset -ah current_icons |
||||||
|
current_icons=(${(k)icons[@]}) |
||||||
|
for key in ${_ICONS_UNDER_TEST}; do |
||||||
|
assertTrue "The key ${key} does exist in ${_P9K_TEST_MODE} mode, but not in ${POWERLEVEL9K_MODE}!" "(( ${+current_icons[(r)$key]} ))" |
||||||
|
done |
||||||
|
|
||||||
|
unset current_icons |
||||||
|
unset _ICONS_UNDER_TEST |
||||||
|
} |
||||||
|
|
||||||
|
source shunit2/source/2.1/src/shunit2 |
@ -0,0 +1,109 @@ |
|||||||
|
#!/usr/bin/env zsh |
||||||
|
#vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 |
||||||
|
|
||||||
|
# Required for shunit2 to run correctly |
||||||
|
setopt shwordsplit |
||||||
|
SHUNIT_PARENT=$0 |
||||||
|
|
||||||
|
function setUp() { |
||||||
|
# Load Powerlevel9k |
||||||
|
source functions/icons.zsh |
||||||
|
source functions/utilities.zsh |
||||||
|
} |
||||||
|
|
||||||
|
function testDefinedFindsDefinedVariable() { |
||||||
|
my_var='X' |
||||||
|
|
||||||
|
assertTrue "defined 'my_var'" |
||||||
|
unset my_var |
||||||
|
} |
||||||
|
|
||||||
|
function testDefinedDoesNotFindUndefinedVariable() { |
||||||
|
assertFalse "defined 'my_var'" |
||||||
|
} |
||||||
|
|
||||||
|
function testSetDefaultSetsVariable() { |
||||||
|
set_default 'my_var' 'x' |
||||||
|
|
||||||
|
assertEquals 'x' "$my_var" |
||||||
|
unset my_var |
||||||
|
} |
||||||
|
|
||||||
|
function testPrintSizeHumanReadableWithBigNumber() { |
||||||
|
# Interesting: Currently we can't support numbers bigger than that. |
||||||
|
assertEquals '0.87E' "$(printSizeHumanReadable 1000000000000000000)" |
||||||
|
} |
||||||
|
|
||||||
|
function testPrintSizeHumanReadableWithExabytesAsBase() { |
||||||
|
assertEquals '9.77Z' "$(printSizeHumanReadable 10000 'E')" |
||||||
|
} |
||||||
|
|
||||||
|
function testGetRelevantItem() { |
||||||
|
typeset -a list |
||||||
|
list=(a b c) |
||||||
|
local callback='[[ "$item" == "b" ]] && echo "found"' |
||||||
|
|
||||||
|
local result=$(getRelevantItem "$list" "$callback") |
||||||
|
assertEquals 'found' "$result" |
||||||
|
|
||||||
|
unset list |
||||||
|
} |
||||||
|
|
||||||
|
function testGetRelevantItemDoesNotReturnNotFoundItems() { |
||||||
|
typeset -a list |
||||||
|
list=(a b c) |
||||||
|
local callback='[[ "$item" == "d" ]] && echo "found"' |
||||||
|
|
||||||
|
local result=$(getRelevantItem "$list" "$callback") |
||||||
|
assertEquals '' '' |
||||||
|
|
||||||
|
unset list |
||||||
|
} |
||||||
|
|
||||||
|
function testSegmentShouldBeJoinedIfDirectPredecessingSegmentIsJoined() { |
||||||
|
typeset -a segments |
||||||
|
segments=(a b_joined c_joined) |
||||||
|
# Look at the third segment |
||||||
|
local current_index=3 |
||||||
|
local last_element_index=2 |
||||||
|
|
||||||
|
local joined |
||||||
|
segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false |
||||||
|
assertTrue "$joined" |
||||||
|
|
||||||
|
unset segments |
||||||
|
} |
||||||
|
|
||||||
|
function testSegmentShouldBeJoinedIfPredecessingSegmentIsJoinedTransitivley() { |
||||||
|
typeset -a segments |
||||||
|
segments=(a b_joined c_joined) |
||||||
|
# Look at the third segment |
||||||
|
local current_index=3 |
||||||
|
# The last printed segment was the first one, |
||||||
|
# the second segmend was conditional. |
||||||
|
local last_element_index=1 |
||||||
|
|
||||||
|
local joined |
||||||
|
segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false |
||||||
|
assertTrue "$joined" |
||||||
|
|
||||||
|
unset segments |
||||||
|
} |
||||||
|
|
||||||
|
function testSegmentShouldNotBeJoinedIfPredecessingSegmentIsNotJoinedButConditional() { |
||||||
|
typeset -a segments |
||||||
|
segments=(a b_joined c d_joined) |
||||||
|
# Look at the fourth segment |
||||||
|
local current_index=4 |
||||||
|
# The last printed segment was the first one, |
||||||
|
# the second segmend was conditional. |
||||||
|
local last_element_index=1 |
||||||
|
|
||||||
|
local joined |
||||||
|
segmentShouldBeJoined $current_index $last_element_index "$segments" && joined=true || joined=false |
||||||
|
assertFalse "$joined" |
||||||
|
|
||||||
|
unset segments |
||||||
|
} |
||||||
|
|
||||||
|
source shunit2/source/2.1/src/shunit2 |
@ -1 +0,0 @@ |
|||||||
Subproject commit 4be16020b7cd7241b75c23db9f5bd3d4fce84686 |
|
Loading…
Reference in new issue