This post was originally published at thbe.org.
In my previous blog post about enhancing the MacOS terminal I used the powerlevel9k theme. When I was publishing the article on dev.to as well, I was made aware there is a re-implementation of p9k available called powerlevel10k. p10k is calling itself a fast drop-in replacement for Powerlevel9k. Fast sounds always good so I thought, give it a try.
p10k is able to use the same configuration p9k is using, so if you only install p10k and change the theme in oh-my-zsh to p10k without further modifications, everything will look the same as it looked before. The only difference you might notice is that the terminal indeed behaves a little faster. This is, what I did first:
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
Now where p10k is installed, it needs to be activated in the ZSH configuration:
# zsh configuration file
#
# Author: Thomas Bendler <code@thbe.org>
# Date: Tue Sep 24 20:28:27 UTC 2019
[...]
ZSH_THEME="powerlevel10k/powerlevel10k"
[...]
# Configure the prompt content
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(root_indicator context dir vcs)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status command_execution_time ram disk_usage ip)
# Local custom plugins
for item in $(ls -1 ${HOME}/.profile.d/*.plugin.zsh); do
[ -e "${item}" ] && source "${item}"
done
After the restart of my terminal, literally, nothing has changed. It looks like the drop-in replacement part seems to be true. Let's check if we really use p10k now:
$ set | grep "__p9k_root_dir="
__p9k_root_dir=/Users/thbe/.oh-my-zsh/custom/themes/powerlevel10k
So far, so good. But p10k should not only be a drop-in replacement, but it also offers additional functionality that goes beyond the functionality of p9k. One thing I personally like is the fact that p10k separate the configuration from the .zshrc file per default. p10k also comes with a wizard that generates a sample configuration. I started with the lean configuration and adjusted it in a way that it fits my need. This is how my terminal now looks like:
The first thing I did was to clean up my .zshrc configuration file. I removed some of my oh-my-zsh plugins because I hadn't used them recently. I also added some and ended up with the following .zshrc configuration file:
# zsh configuration file
#
# Author: Thomas Bendler <code@thbe.org>
# Date: Fri Dec 27 23:48:31 CET 2019
# Add local sbin to $PATH.
export PATH="/usr/local/sbin:${PATH}"
# Path to the oh-my-zsh installation.
export ZSH="${HOME}/.oh-my-zsh"
# Use case-sensitive completion.
CASE_SENSITIVE="true"
# Define how often to auto-update (in days).
export UPDATE_ZSH_DAYS=7
# Enable command auto-correction.
ENABLE_CORRECTION="true"
# Display red dots whilst waiting for completion.
COMPLETION_WAITING_DOTS="true"
# Configure history stamp format
HIST_STAMPS="yyyy-mm-dd"
# Plugin configuration
# Standard plugins can be found in ~/.oh-my-zsh/plugins/*
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Add wisely, as too many plugins slow down shell startup.
plugins=(
ansible
brew
bundler
colored-man-pages
colorize
docker
git
nmap
osx
zsh-navigation-tools
zsh_reload
)
ZSH_THEME="powerlevel10k/powerlevel10k"
# Load Zsh tools for syntax highlighting and autosuggestions
HOMEBREW_FOLDER="/usr/local/share"
source "${HOMEBREW_FOLDER}/zsh-autosuggestions/zsh-autosuggestions.zsh"
source "${HOMEBREW_FOLDER}/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
# Load oh-my-zsh framework
source "${ZSH}/oh-my-zsh.sh"
# Powerlevel10k configuration
[ -e ${HOME}/.p10k.zsh ] && source ${HOME}/.p10k.zsh
# Local custom plugins
for item in $(ls -1 ${HOME}/.profile.d/*.plugin.zsh); do
[ -e "${item}" ] && source "${item}"
done
The important line from the p10k perspective is:
[ -e ${HOME}/.p10k.zsh ] && source ${HOME}/.p10k.zsh
This line source the p10k configuration that is stored in the .p10k.zsh file. The one that creates the layout shown in the screenshot above is the following:
# p10k.zsh configuration file | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Sun Jan 12 17:54:00 CET 2020 | |
# | |
# Based on romkatv/powerlevel10k/config/p10k-lean.zsh, checksum 551. | |
# For more information see https://github.com/romkatv/powerlevel10k | |
# | |
# Apply configiguration changes without restarting zsh. | |
# Edit ~/.p10k.zsh and type `source ~/.p10k.zsh`. | |
# | |
# Temporarily change options | |
'builtin' 'local' '-a' 'p10k_config_opts' | |
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases') | |
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob') | |
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand') | |
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand' | |
() { | |
emulate -L zsh | |
setopt no_unset extended_glob | |
unset -m 'POWERLEVEL9K_*' | |
autoload -Uz is-at-least && is-at-least 5.1 || return | |
zmodload zsh/langinfo | |
if [[ ${langinfo[CODESET]:-} != (utf|UTF)(-|)8 ]]; then | |
local LC_ALL=${${(@M)$(locale -a):#*.(utf|UTF)(-|)8}[1]:-en_US.UTF-8} | |
fi | |
# The list of segments shown on the left | |
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=( | |
# =========================[ Line #1 ]========================= | |
os_icon # os identifier | |
context # user@hostname | |
dir # current directory | |
vcs # git status | |
# =========================[ Line #2 ]========================= | |
newline | |
prompt_char # prompt symbol | |
) | |
# The list of segments shown on the right | |
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=( | |
# =========================[ Line #1 ]========================= | |
status # exit code of the last command | |
command_execution_time # duration of the last command | |
background_jobs # presence of background jobs | |
direnv # direnv status (https://direnv.net/) | |
virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html) | |
# anaconda # conda environment (https://conda.io/) | |
pyenv # python environment (https://github.com/pyenv/pyenv) | |
# goenv # go environment (https://github.com/syndbg/goenv) | |
nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv) | |
nvm # node.js version from nvm (https://github.com/nvm-sh/nvm) | |
nodeenv # node.js environment (https://github.com/ekalinin/nodeenv) | |
# node_version # node.js version | |
# go_version # go version (https://golang.org) | |
# rust_version # rustc version (https://www.rust-lang.org) | |
# dotnet_version # .NET version (https://dotnet.microsoft.com) | |
rbenv # ruby version from rbenv (https://github.com/rbenv/rbenv) | |
rvm # ruby version from rvm (https://rvm.io) | |
# fvm # flutter version management (https://github.com/leoafarias/fvm) | |
# luaenv # lua version from luaenv (https://github.com/cehoffman/luaenv) | |
# jenv # java version from jenv (https://github.com/jenv/jenv) | |
# plenv # perl version from plenv (https://github.com/tokuhirom/plenv) | |
# kubecontext # current kubernetes context (https://kubernetes.io/) | |
# terraform # terraform workspace (https://www.terraform.io) | |
# aws # aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) | |
# aws_eb_env # aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) | |
# azure # azure account name (https://docs.microsoft.com/en-us/cli/azure) | |
# gcloud # google cloud cli acccount and project (https://cloud.google.com/) | |
# google_app_cred # google application credentials (https://cloud.google.com/docs/authentication/production) | |
# nordvpn # nordvpn connection status, linux only (https://nordvpn.com/) | |
# ranger # ranger shell (https://github.com/ranger/ranger) | |
# nnn # nnn shell (https://github.com/jarun/nnn) | |
vim_shell # vim shell indicator (:sh) | |
# midnight_commander # midnight commander shell (https://midnight-commander.org/) | |
# vpn_ip # virtual private network indicator | |
disk_usage # fill percentage HD | |
ram # free RAM | |
load # CPU load | |
# todo # todo items (https://github.com/todotxt/todo.txt-cli) | |
time # current time | |
# =========================[ Line #2 ]========================= | |
newline | |
public_ip # public IP address | |
proxy # system-wide http/https/ftp proxy | |
battery # internal battery | |
# example # example user-defined segment (see prompt_example function below) | |
) | |
# Basic style options that define the overall look of your prompt. You probably don't want to | |
# change them. | |
typeset -g POWERLEVEL9K_BACKGROUND= # transparent background | |
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace | |
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space | |
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol | |
# To disable default icons for all segments, set POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION=''. | |
# | |
# To enable default icons for all segments, don't define POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION | |
# or set it to '${P9K_VISUAL_IDENTIFIER}'. | |
# | |
# To remove spaces from all default icons, set POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION | |
# to '${P9K_VISUAL_IDENTIFIER// }'. You'll know that you you need this option if you see extra | |
# spaces after icons. | |
# | |
# To enable default icons for one segment (e.g., dir), set | |
# POWERLEVEL9K_DIR_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}'. | |
# | |
# To assign a specific icon to one segment (e.g., dir), set | |
# POWERLEVEL9K_DIR_VISUAL_IDENTIFIER_EXPANSION='⭐'. | |
# | |
# To assign a specific icon to a segment in a given state (e.g., dir in state NOT_WRITABLE), | |
# set POWERLEVEL9K_DIR_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐'. | |
# | |
# Note: You can use $'\u2B50' instead of '⭐'. It's especially convenient when specifying | |
# icons that your text editor cannot render. Don't forget to put $ and use single quotes when | |
# defining icons via Unicode codepoints. | |
# | |
# Note: Many default icons cannot be displayed with system fonts. You'll need to install a | |
# capable font to use them. See POWERLEVEL9K_MODE below. | |
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
# This option makes a difference only when default icons are enabled for all or some prompt | |
# segments (see POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION above). LOCK_ICON can be printed as | |
# $'\uE0A2', $'\uE138' or $'\uF023' depending on POWERLEVEL9K_MODE. The correct value of this | |
# parameter depends on the provider of the font your terminal is using. | |
# | |
# Font Provider | POWERLEVEL9K_MODE | |
# ---------------------------------+------------------- | |
# Powerline | powerline | |
# Font Awesome | awesome-fontconfig | |
# Adobe Source Code Pro | awesome-fontconfig | |
# Source Code Pro | awesome-fontconfig | |
# Awesome-Terminal Fonts (regular) | awesome-fontconfig | |
# Awesome-Terminal Fonts (patched) | awesome-patched | |
# Nerd Fonts | nerdfont-complete | |
# Other | compatible | |
# | |
# If this looks overwhelming, either stick with a preinstalled system font and set | |
# POWERLEVEL9K_MODE=compatible, or install the recommended Powerlevel10k font from | |
# https://github.com/romkatv/powerlevel10k/#recommended-meslo-nerd-font-patched-for-powerlevel10k | |
# and set POWERLEVEL9K_MODE=nerdfont-complete. | |
typeset -g POWERLEVEL9K_MODE=nerdfont-complete | |
# When set to true, icons appear before content on both sides of the prompt. When set | |
# to false, icons go after content. If empty or not set, icons go before content in the left | |
# prompt and after content in the right prompt. | |
# | |
# You can also override it for a specific segment: | |
# | |
# POWERLEVEL9K_STATUS_ICON_BEFORE_CONTENT=false | |
# | |
# Or for a specific segment in specific state: | |
# | |
# POWERLEVEL9K_DIR_NOT_WRITABLE_ICON_BEFORE_CONTENT=false | |
typeset -g POWERLEVEL9K_ICON_BEFORE_CONTENT=true | |
# Add an empty line before each prompt. | |
typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=false | |
# Connect left prompt lines with these symbols. | |
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX= | |
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX= | |
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX= | |
# Connect right prompt lines with these symbols. | |
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_SUFFIX= | |
typeset -g POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_SUFFIX= | |
typeset -g POWERLEVEL9K_MULTILINE_LAST_PROMPT_SUFFIX= | |
# The left end of left prompt. | |
typeset -g POWERLEVEL9K_LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL= | |
# The right end of right prompt. | |
typeset -g POWERLEVEL9K_RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL= | |
# Ruler, a.k.a. the horizontal line before each prompt. If you set it to true, you'll | |
# probably want to set POWERLEVEL9K_PROMPT_ADD_NEWLINE=false above and | |
# POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' below. | |
typeset -g POWERLEVEL9K_SHOW_RULER=false | |
typeset -g POWERLEVEL9K_RULER_CHAR='─' # reasonable alternative: '·' | |
typeset -g POWERLEVEL9K_RULER_FOREGROUND=240 | |
# Filler between left and right prompt on the first prompt line. You can set it to '·' or '─' | |
# to make it easier to see the alignment between left and right prompt and to separate prompt | |
# from command output. It serves the same purpose as ruler (see above) without increasing | |
# the number of prompt lines. You'll probably want to set POWERLEVEL9K_SHOW_RULER=false | |
# if using this. You might also like POWERLEVEL9K_PROMPT_ADD_NEWLINE=false for more compact | |
# prompt. | |
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR=' ' | |
if [[ $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_CHAR != ' ' ]]; then | |
# The color of the filler. | |
typeset -g POWERLEVEL9K_MULTILINE_FIRST_PROMPT_GAP_FOREGROUND=242 | |
# Add a space between the end of left prompt and the filler. | |
typeset -g POWERLEVEL9K_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL=' ' | |
# Add a space between the filler and the start of right prompt. | |
typeset -g POWERLEVEL9K_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL=' ' | |
# Start filler from the edge of the screen if there are no left segments on the first line. | |
typeset -g POWERLEVEL9K_EMPTY_LINE_LEFT_PROMPT_FIRST_SEGMENT_END_SYMBOL='%{%}' | |
# End filler on the edge of the screen if there are no right segments on the first line. | |
typeset -g POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL='%{%}' | |
fi | |
#################################[ os_icon: os identifier ]################################## | |
# OS identifier color. | |
typeset -g POWERLEVEL9K_OS_ICON_FOREGROUND= | |
# Make the icon bold. | |
typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION='%B${P9K_CONTENT}' | |
################################[ prompt_char: prompt symbol ]################################ | |
# Green prompt symbol if the last command succeeded. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=76 | |
# Red prompt symbol if the last command failed. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS,VIOWR}_FOREGROUND=196 | |
# Default prompt symbol. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯' | |
# Prompt symbol in command vi mode. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮' | |
# Prompt symbol in visual vi mode. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='Ⅴ' | |
# Prompt symbol in overwrite vi mode. | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIOWR_CONTENT_EXPANSION='▶' | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=true | |
typeset -g POWERLEVEL9K_PROMPT_CHAR_LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL='' | |
##################################[ dir: current directory ]################################## | |
# Default current directory color. | |
typeset -g POWERLEVEL9K_DIR_FOREGROUND=31 | |
# If directory is too long, shorten some of its segments to the shortest possible unique | |
# prefix. The shortened directory can be tab-completed to the original. | |
typeset -g POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique | |
# Replace removed segment suffixes with this symbol. | |
typeset -g POWERLEVEL9K_SHORTEN_DELIMITER= | |
# Color of the shortened directory segments. | |
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=103 | |
# Color of the anchor directory segments. Anchor segments are never shortened. The first | |
# segment is always an anchor. | |
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=39 | |
# Display anchor directory segments in bold. | |
typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true | |
# Don't shorten directories that contain any of these files. They are anchors. | |
local anchor_files=( | |
.bzr | |
.citc | |
.git | |
.hg | |
.node-version | |
.python-version | |
.ruby-version | |
.shorten_folder_marker | |
.svn | |
.terraform | |
CVS | |
Cargo.toml | |
composer.json | |
go.mod | |
package.json | |
) | |
typeset -g POWERLEVEL9K_SHORTEN_FOLDER_MARKER="(${(j:|:)anchor_files})" | |
# Don't shorten this many last directory segments. They are anchors. | |
typeset -g POWERLEVEL9K_SHORTEN_DIR_LENGTH=1 | |
# Shorten directory if it's longer than this even if there is space for it. The value can | |
# be either absolute (e.g., '80') or a percentage of terminal width (e.g, '50%'). If empty, | |
# directory will be shortened only when prompt doesn't fit or when other parameters demand it | |
# (see POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS and POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT below). | |
# If set to `0`, directory will always be shortened to its minimum length. | |
typeset -g POWERLEVEL9K_DIR_MAX_LENGTH=80 | |
# When `dir` segment is on the last prompt line, try to shorten it enough to leave at least this | |
# many columns for typing commands. | |
typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS=40 | |
# When `dir` segment is on the last prompt line, try to shorten it enough to leave at least | |
# COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. | |
typeset -g POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT=50 | |
# If set to true, embed a hyperlink into the directory. Useful for quickly | |
# opening a directory in the file manager simply by clicking the link. | |
# Can also be handy when the directory is shortened, as it allows you to see | |
# the full directory that was used in previous commands. | |
typeset -g POWERLEVEL9K_DIR_HYPERLINK=false | |
# Enable special styling for non-writable directories. | |
typeset -g POWERLEVEL9K_DIR_SHOW_WRITABLE=true | |
# Show this icon when the current directory is not writable. POWERLEVEL9K_DIR_SHOW_WRITABLE | |
# above must be set to true for this parameter to have effect. | |
# typeset -g POWERLEVEL9K_DIR_NOT_WRITABLE_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_DIR_PREFIX='%fin ' | |
# POWERLEVEL9K_DIR_CLASSES allows you to specify custom icons for different directories. | |
# It must be an array with 3 * N elements. Each triplet consists of: | |
# | |
# 1. A pattern against which the current directory is matched. Matching is done with | |
# extended_glob option enabled. | |
# 2. Directory class for the purpose of styling. | |
# 3. Icon. | |
# | |
# Triplets are tried in order. The first triplet whose pattern matches $PWD wins. If there | |
# are no matches, the directory will have no icon. | |
# | |
# Example: | |
# | |
# typeset -g POWERLEVEL9K_DIR_CLASSES=( | |
# '~/work(|/*)' WORK '(╯°□°)╯︵ ┻━┻' | |
# '~(|/*)' HOME '⌂' | |
# '*' DEFAULT '') | |
# | |
# With these settings, the current directory in the prompt may look like this: | |
# | |
# (╯°□°)╯︵ ┻━┻ ~/work/projects/important/urgent | |
# | |
# Or like this: | |
# | |
# ⌂ ~/best/powerlevel10k | |
# | |
# You can also set different colors for directories of different classes. Remember to override | |
# FOREGROUND, SHORTENED_FOREGROUND and ANCHOR_FOREGROUND for every directory class that you wish | |
# to have its own color. | |
# | |
# typeset -g POWERLEVEL9K_DIR_WORK_FOREGROUND=31 | |
# typeset -g POWERLEVEL9K_DIR_WORK_SHORTENED_FOREGROUND=103 | |
# typeset -g POWERLEVEL9K_DIR_WORK_ANCHOR_FOREGROUND=39 | |
# | |
# typeset -g POWERLEVEL9K_DIR_CLASSES=() | |
#####################################[ vcs: git status ]###################################### | |
# Branch icon. Set this parameter to '\uF126 ' for the popular Powerline branch icon. | |
typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 ' | |
POWERLEVEL9K_VCS_BRANCH_ICON=${(g::)POWERLEVEL9K_VCS_BRANCH_ICON} | |
# Untracked files icon. It's really a question mark, your font isn't broken. | |
# Change the value of this parameter to show a different icon. | |
typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?' | |
POWERLEVEL9K_VCS_UNTRACKED_ICON=${(g::)POWERLEVEL9K_VCS_UNTRACKED_ICON} | |
# Formatter for Git status. | |
# | |
# Example output: master ⇣42⇡42 *42 merge ~42 +42 !42 ?42. | |
# | |
# You can edit the function to customize how Git status looks. | |
# | |
# VCS_STATUS_* parameters are set by gitstatus plugin. See reference: | |
# https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh. | |
function my_git_formatter() { | |
emulate -L zsh | |
if [[ -n $P9K_CONTENT ]]; then | |
# If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from | |
# gitstatus plugin). VCS_STATUS_* parameters are not available in this case. | |
typeset -g my_git_format=$P9K_CONTENT | |
return | |
fi | |
if (( $1 )); then | |
# Styling for up-to-date Git status. | |
local meta='%f' # default foreground | |
local clean='%76F' # green foreground | |
local modified='%178F' # yellow foreground | |
local untracked='%39F' # blue foreground | |
local conflicted='%196F' # red foreground | |
else | |
# Styling for incomplete and stale Git status. | |
local meta='%244F' # grey foreground | |
local clean='%244F' # grey foreground | |
local modified='%244F' # grey foreground | |
local untracked='%244F' # grey foreground | |
local conflicted='%244F' # grey foreground | |
fi | |
local res | |
local where # branch or tag | |
if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then | |
res+="${clean}${POWERLEVEL9K_VCS_BRANCH_ICON}" | |
where=${(V)VCS_STATUS_LOCAL_BRANCH} | |
elif [[ -n $VCS_STATUS_TAG ]]; then | |
res+="${meta}#" | |
where=${(V)VCS_STATUS_TAG} | |
fi | |
# If local branch name or tag is at most 32 characters long, show it in full. | |
# Otherwise show the first 12 … the last 12. | |
(( $#where > 32 )) && where[13,-13]="…" | |
res+="${clean}${where//\%/%%}" # escape % | |
# Display the current Git commit if there is no branch or tag. | |
# Tip: To always display the current Git commit, remove `[[ -z $where ]] &&` from the next line. | |
[[ -z $where ]] && res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}" | |
# Show tracking branch name if it differs from local branch. | |
if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then | |
res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}" # escape % | |
fi | |
# Show the git commit | |
# res+=" (${VCS_STATUS_COMMIT:0:5})" | |
# ⇣42 if behind the remote. | |
(( VCS_STATUS_COMMITS_BEHIND )) && res+=" ${clean}⇣${VCS_STATUS_COMMITS_BEHIND}" | |
# ⇡42 if ahead of the remote; no leading space if also behind the remote: ⇣42⇡42. | |
(( VCS_STATUS_COMMITS_AHEAD && !VCS_STATUS_COMMITS_BEHIND )) && res+=" " | |
(( VCS_STATUS_COMMITS_AHEAD )) && res+="${clean}⇡${VCS_STATUS_COMMITS_AHEAD}" | |
# *42 if have stashes. | |
(( VCS_STATUS_STASHES )) && res+=" ${clean}*${VCS_STATUS_STASHES}" | |
# 'merge' if the repo is in an unusual state. | |
[[ -n $VCS_STATUS_ACTION ]] && res+=" ${conflicted}${VCS_STATUS_ACTION}" | |
# ~42 if have merge conflicts. | |
(( VCS_STATUS_NUM_CONFLICTED )) && res+=" ${conflicted}~${VCS_STATUS_NUM_CONFLICTED}" | |
# +42 if have staged changes. | |
(( VCS_STATUS_NUM_STAGED )) && res+=" ${modified}+${VCS_STATUS_NUM_STAGED}" | |
# !42 if have unstaged changes. | |
(( VCS_STATUS_NUM_UNSTAGED )) && res+=" ${modified}!${VCS_STATUS_NUM_UNSTAGED}" | |
# ?42 if have untracked files. It's really a question mark, your font isn't broken. | |
# See POWERLEVEL9K_VCS_UNTRACKED_ICON above if you want to use a different icon. | |
# Remove the next line if you don't want to see untracked files at all. | |
(( VCS_STATUS_NUM_UNTRACKED )) && res+=" ${untracked}${POWERLEVEL9K_VCS_UNTRACKED_ICON}${VCS_STATUS_NUM_UNTRACKED}" | |
typeset -g my_git_format=$res | |
} | |
functions -M my_git_formatter 2>/dev/null | |
# Disable the default Git status formatting. | |
typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true | |
# Install our own Git status formatter. | |
typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}' | |
typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}' | |
# Enable counters for staged, unstaged, etc. | |
typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1 | |
# Icon color. | |
typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=76 | |
typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=244 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_VCS_PREFIX='%fon ' | |
# Show status of repositories of these types. You can add svn and/or hg if you are | |
# using them. If you do, your prompt may become slow even when your current directory | |
# isn't in an svn or hg reposotiry. | |
typeset -g POWERLEVEL9K_VCS_BACKENDS=(git) | |
# These settings are used for respositories other than Git or when gitstatusd fails and | |
# Powerlevel10k has to fall back to using vcs_info. | |
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=76 | |
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=76 | |
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=178 | |
##########################[ status: exit code of the last command ]########################### | |
# Enable OK_PIPE, ERROR_PIPE and ERROR_SIGNAL status states to allow us to enable, disable and | |
# style them independently from the regular OK and ERROR state. | |
typeset -g POWERLEVEL9K_STATUS_EXTENDED_STATES=true | |
# Status on success. No content, just an icon. No need to show it if prompt_char is enabled as | |
# it will signify success by turning green. | |
typeset -g POWERLEVEL9K_STATUS_OK=false | |
typeset -g POWERLEVEL9K_STATUS_OK_FOREGROUND=70 | |
typeset -g POWERLEVEL9K_STATUS_OK_VISUAL_IDENTIFIER_EXPANSION='✔' | |
# Status when some part of a pipe command fails but the overall exit status is zero. It may look | |
# like this: 1|0. | |
typeset -g POWERLEVEL9K_STATUS_OK_PIPE=true | |
typeset -g POWERLEVEL9K_STATUS_OK_PIPE_FOREGROUND=70 | |
typeset -g POWERLEVEL9K_STATUS_OK_PIPE_VISUAL_IDENTIFIER_EXPANSION='✔' | |
# Status when it's just an error code (e.g., '1'). No need to show it if prompt_char is enabled as | |
# it will signify error by turning red. | |
typeset -g POWERLEVEL9K_STATUS_ERROR=false | |
typeset -g POWERLEVEL9K_STATUS_ERROR_FOREGROUND=160 | |
typeset -g POWERLEVEL9K_STATUS_ERROR_VISUAL_IDENTIFIER_EXPANSION='✘' | |
# Status when the last command was terminated by a signal. | |
typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL=true | |
typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_FOREGROUND=160 | |
# Use terse signal names: "INT" instead of "SIGINT(2)". | |
typeset -g POWERLEVEL9K_STATUS_VERBOSE_SIGNAME=false | |
typeset -g POWERLEVEL9K_STATUS_ERROR_SIGNAL_VISUAL_IDENTIFIER_EXPANSION='✘' | |
# Status when some part of a pipe command fails and the overall exit status is also non-zero. | |
# It may look like this: 1|0. | |
typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE=true | |
typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_FOREGROUND=160 | |
typeset -g POWERLEVEL9K_STATUS_ERROR_PIPE_VISUAL_IDENTIFIER_EXPANSION='✘' | |
###################[ command_execution_time: duration of the last command ]################### | |
# Show duration of the last command if takes longer than this many seconds. | |
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3 | |
# Show this many fractional digits. Zero means round to seconds. | |
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0 | |
# Execution time color. | |
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=101 | |
# Duration format: 1d 2h 3m 4s. | |
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s' | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PREFIX='%ftook ' | |
#######################[ background_jobs: presence of background jobs ]####################### | |
# Don't show the number of background jobs. | |
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE=false | |
# Background jobs color. | |
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_FOREGROUND=70 | |
# Icon to show when there are background jobs. | |
typeset -g POWERLEVEL9K_BACKGROUND_JOBS_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
#######################[ direnv: direnv status (https://direnv.net/) ]######################## | |
# Direnv color. | |
typeset -g POWERLEVEL9K_DIRENV_FOREGROUND=178 | |
# Icon to show when direnv is active. | |
typeset -g POWERLEVEL9K_DIRENV_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
##########[ nordvpn: nordvpn connection status, linux only (https://nordvpn.com/) ]########### | |
# NordVPN connection indicator color. | |
typeset -g POWERLEVEL9K_NORDVPN_FOREGROUND=39 | |
# Hide NordVPN connection indicator when not connected. | |
typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_CONTENT_EXPANSION= | |
typeset -g POWERLEVEL9K_NORDVPN_{DISCONNECTED,CONNECTING,DISCONNECTING}_VISUAL_IDENTIFIER_EXPANSION= | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NORDVPN_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#################[ ranger: ranger shell (https://github.com/ranger/ranger) ]################## | |
# Ranger shell color. | |
typeset -g POWERLEVEL9K_RANGER_FOREGROUND=178 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_RANGER_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
######################[ nnn: nnn shell (https://github.com/jarun/nnn) ]####################### | |
# Nnn shell color. | |
typeset -g POWERLEVEL9K_NNN_FOREGROUND=72 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NNN_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
###########################[ vim_shell: vim shell indicator (:sh) ]########################### | |
# Vim shell indicator color. | |
typeset -g POWERLEVEL9K_VIM_SHELL_FOREGROUND=34 | |
# Icon to show when in a vim shell. | |
typeset -g POWERLEVEL9K_VIM_SHELL_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
######[ midnight_commander: midnight commander shell (https://midnight-commander.org/) ]###### | |
# Midnight Commander shell color. | |
typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_FOREGROUND=178 | |
# Icon to show when in a midnight commander shell. | |
typeset -g POWERLEVEL9K_MIDNIGHT_COMMANDER_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
#################################[ disk_usage: free disk space ]############################### | |
# Disk usage color when usage is under 90%. | |
typeset -g POWERLEVEL9K_DISK_USAGE_NORMAL_FOREGROUND=66 | |
# Disk usage color when usage is between 90% and 95%. | |
typeset -g POWERLEVEL9K_DISK_USAGE_WARNING_FOREGROUND=178 | |
# Disk usage color when usage is over 95%. | |
typeset -g POWERLEVEL9K_DISK_USAGE_CRITICAL_FOREGROUND=166 | |
######################################[ ram: free RAM ]####################################### | |
# RAM color. | |
typeset -g POWERLEVEL9K_RAM_FOREGROUND=66 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_RAM_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
######################################[ load: CPU load ]###################################### | |
# Show average CPU load over this many last minutes. Valid values are 1, 5 and 15. | |
typeset -g POWERLEVEL9K_LOAD_WHICH=1 | |
# Load color when load is under 50%. | |
typeset -g POWERLEVEL9K_LOAD_NORMAL_FOREGROUND=66 | |
# Load color when load is between 50% and 70%. | |
typeset -g POWERLEVEL9K_LOAD_WARNING_FOREGROUND=178 | |
# Load color when load is over 70%. | |
typeset -g POWERLEVEL9K_LOAD_CRITICAL_FOREGROUND=166 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_LOAD_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
################[ todo: todo items (https://github.com/todotxt/todo.txt-cli) ]################ | |
# Todo color. | |
typeset -g POWERLEVEL9K_TODO_FOREGROUND=110 | |
# Hide todo when the total number of tasks is zero. | |
typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_TOTAL=true | |
# Hide todo when the number of tasks after filtering is zero. | |
typeset -g POWERLEVEL9K_TODO_HIDE_ZERO_FILTERED=false | |
# Todo format. The following parameters are available within the expansion. | |
# | |
# - P9K_TODO_TOTAL_TASK_COUNT The total number of tasks. | |
# - P9K_TODO_FILTERED_TASK_COUNT The number of tasks after filtering. | |
# | |
# These variables correspond to the last line of the output of `todo.sh -p ls`: | |
# | |
# TODO: 24 of 42 tasks shown | |
# | |
# Here 24 is P9K_TODO_FILTERED_TASK_COUNT and 42 is P9K_TODO_TOTAL_TASK_COUNT. | |
# | |
# typeset -g POWERLEVEL9K_TODO_CONTENT_EXPANSION='$P9K_TODO_FILTERED_TASK_COUNT' | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_TODO_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##################################[ context: user@hostname ]################################## | |
# Context color when running with privileges. | |
typeset -g POWERLEVEL9K_CONTEXT_ROOT_FOREGROUND=178 | |
# Context color in SSH without privileges. | |
typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_FOREGROUND=180 | |
# Default context color (no privileges, no SSH). | |
typeset -g POWERLEVEL9K_CONTEXT_FOREGROUND=180 | |
# Context format when running with privileges: bold user@hostname. | |
typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%B%n@%m' | |
# Context format when in SSH without privileges: user@hostname. | |
typeset -g POWERLEVEL9K_CONTEXT_{REMOTE,REMOTE_SUDO}_TEMPLATE='%n@%m' | |
# Default context format (no privileges, no SSH): user@hostname. | |
typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%n@%m' | |
# Don't show context unless running with privileges or in SSH. | |
# Tip: Remove the next line to always show context. | |
# typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_{CONTENT,VISUAL_IDENTIFIER}_EXPANSION= | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_CONTEXT_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_CONTEXT_PREFIX='%fwith ' | |
###[ virtualenv: python virtual environment (https://docs.python.org/3/library/venv.html) ]### | |
# Python virtual environment color. | |
typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=37 | |
# Don't show Python version next to the virtual environment name. | |
typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false | |
# Separate environment name from Python version only with a space. | |
typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER= | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_VIRTUALENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#####################[ anaconda: conda environment (https://conda.io/) ]###################### | |
# Anaconda environment color. | |
typeset -g POWERLEVEL9K_ANACONDA_FOREGROUND=37 | |
# Don't show Python version next to the anaconda environment name. | |
typeset -g POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION=false | |
# Separate environment name from Python version only with a space. | |
typeset -g POWERLEVEL9K_ANACONDA_{LEFT,RIGHT}_DELIMITER= | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_ANACONDA_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
################[ pyenv: python environment (https://github.com/pyenv/pyenv) ]################ | |
# Pyenv color. | |
typeset -g POWERLEVEL9K_PYENV_FOREGROUND=37 | |
# Hide python version if it doesn't come from one of these sources. | |
typeset -g POWERLEVEL9K_PYENV_SOURCES=(shell local global) | |
# If set to false, hide python version if it's the same as global: | |
# $(pyenv version-name) == $(pyenv global). | |
typeset -g POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_PYENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
################[ goenv: go environment (https://github.com/syndbg/goenv) ]################ | |
# Goenv color. | |
typeset -g POWERLEVEL9K_GOENV_FOREGROUND=37 | |
# Don't show the current Go version if it's the same as global. | |
typeset -g POWERLEVEL9K_GOENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_GOENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##########[ nodenv: node.js version from nodenv (https://github.com/nodenv/nodenv) ]########## | |
# Nodenv color. | |
typeset -g POWERLEVEL9K_NODENV_FOREGROUND=70 | |
# Don't show node version if it's the same as global: $(nodenv version-name) == $(nodenv global). | |
typeset -g POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NODENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##############[ nvm: node.js version from nvm (https://github.com/nvm-sh/nvm) ]############### | |
# Nvm color. | |
typeset -g POWERLEVEL9K_NVM_FOREGROUND=70 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NVM_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
############[ nodeenv: node.js environment (https://github.com/ekalinin/nodeenv) ]############ | |
# Nodeenv color. | |
typeset -g POWERLEVEL9K_NODEENV_FOREGROUND=70 | |
# Don't show Node version next to the environment name. | |
typeset -g POWERLEVEL9K_NODEENV_SHOW_NODE_VERSION=false | |
# Separate environment name from Node version only with a space. | |
typeset -g POWERLEVEL9K_NODEENV_{LEFT,RIGHT}_DELIMITER= | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NODEENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##############################[ node_version: node.js version ]############################### | |
# Node version color. | |
typeset -g POWERLEVEL9K_NODE_VERSION_FOREGROUND=70 | |
# Show node version only when in a directory tree containing package.json. | |
typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_NODE_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#######################[ go_version: go version (https://golang.org) ]######################## | |
# Go version color. | |
typeset -g POWERLEVEL9K_GO_VERSION_FOREGROUND=37 | |
# Show go version only when in a go project subdirectory. | |
typeset -g POWERLEVEL9K_GO_VERSION_PROJECT_ONLY=true | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_GO_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#################[ rust_version: rustc version (https://www.rust-lang.org) ]################## | |
# Rust version color. | |
typeset -g POWERLEVEL9K_RUST_VERSION_FOREGROUND=37 | |
# Show rust version only when in a rust project subdirectory. | |
typeset -g POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY=true | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_RUST_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
###############[ dotnet_version: .NET version (https://dotnet.microsoft.com) ]################ | |
# .NET version color. | |
typeset -g POWERLEVEL9K_DOTNET_VERSION_FOREGROUND=134 | |
# Show .NET version only when in a .NET project subdirectory. | |
typeset -g POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY=true | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_DOTNET_VERSION_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#############[ rbenv: ruby version from rbenv (https://github.com/rbenv/rbenv) ]############## | |
# Rbenv color. | |
typeset -g POWERLEVEL9K_RBENV_FOREGROUND=168 | |
# Hide ruby version if it doesn't come from one of these sources. | |
typeset -g POWERLEVEL9K_RBENV_SOURCES=(shell local global) | |
# If set to false, hide ruby version if it's the same as global: | |
# $(rbenv version-name) == $(rbenv global). | |
typeset -g POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_RBENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#######################[ rvm: ruby version from rvm (https://rvm.io) ]######################## | |
# Rvm color. | |
typeset -g POWERLEVEL9K_RVM_FOREGROUND=168 | |
# Don't show @gemset at the end. | |
typeset -g POWERLEVEL9K_RVM_SHOW_GEMSET=false | |
# Don't show ruby- at the front. | |
typeset -g POWERLEVEL9K_RVM_SHOW_PREFIX=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_RVM_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
###########[ fvm: flutter version management (https://github.com/leoafarias/fvm) ]############ | |
# Fvm color. | |
typeset -g POWERLEVEL9K_FVM_FOREGROUND=38 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_FVM_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##########[ luaenv: lua version from luaenv (https://github.com/cehoffman/luaenv) ]########### | |
# Lua color. | |
typeset -g POWERLEVEL9K_LUAENV_FOREGROUND=32 | |
# Hide lua version if it doesn't come from one of these sources. | |
typeset -g POWERLEVEL9K_LUAENV_SOURCES=(shell local global) | |
# If set to false, hide lua version if it's the same as global: | |
# $(luaenv version-name) == $(luaenv global). | |
typeset -g POWERLEVEL9K_LUAENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_LUAENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
###############[ jenv: java version from jenv (https://github.com/jenv/jenv) ]################ | |
# Java color. | |
typeset -g POWERLEVEL9K_JENV_FOREGROUND=32 | |
# Hide java version if it doesn't come from one of these sources. | |
typeset -g POWERLEVEL9K_JENV_SOURCES=(shell local global) | |
# If set to false, hide java version if it's the same as global: | |
# $(jenv version-name) == $(jenv global). | |
typeset -g POWERLEVEL9K_JENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_JENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
###########[ plenv: perl version from plenv (https://github.com/tokuhirom/plenv) ]############ | |
# Perl color. | |
typeset -g POWERLEVEL9K_PLENV_FOREGROUND=67 | |
# Hide perl version if it doesn't come from one of these sources. | |
typeset -g POWERLEVEL9K_PLENV_SOURCES=(shell local global) | |
# If set to false, hide perl version if it's the same as global: | |
# $(plenv version-name) == $(plenv global). | |
typeset -g POWERLEVEL9K_PLENV_PROMPT_ALWAYS_SHOW=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_PLENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#############[ kubecontext: current kubernetes context (https://kubernetes.io/) ]############# | |
# Kubernetes context classes for the purpose of using different colors, icons and expansions with | |
# different contexts. | |
# | |
# POWERLEVEL9K_KUBECONTEXT_CLASSES is an array with even number of elements. The first element | |
# in each pair defines a pattern against which the current kubernetes context gets matched. | |
# More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) | |
# that gets matched. If you unset all POWERLEVEL9K_KUBECONTEXT_*CONTENT_EXPANSION parameters, | |
# you'll see this value in your prompt. The second element of each pair in | |
# POWERLEVEL9K_KUBECONTEXT_CLASSES defines the context class. Patterns are tried in order. The | |
# first match wins. | |
# | |
# For example, given these settings: | |
# | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( | |
# '*prod*' PROD | |
# '*test*' TEST | |
# '*' DEFAULT) | |
# | |
# If your current kubernetes context is "deathray-testing/default", its class is TEST | |
# because "deathray-testing/default" doesn't match the pattern '*prod*' but does match '*test*'. | |
# | |
# You can define different colors, icons and content expansions for different classes: | |
# | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_FOREGROUND=28 | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' | |
typeset -g POWERLEVEL9K_KUBECONTEXT_CLASSES=( | |
# '*prod*' PROD # These values are examples that are unlikely | |
# '*test*' TEST # to match your needs. Customize them as needed. | |
'*' DEFAULT) | |
typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_FOREGROUND=134 | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Use POWERLEVEL9K_KUBECONTEXT_CONTENT_EXPANSION to specify the content displayed by kubecontext | |
# segment. Parameter expansions are very flexible and fast, too. See reference: | |
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. | |
# | |
# Within the expansion the following parameters are always available: | |
# | |
# - P9K_CONTENT The content that would've been displayed if there was no content | |
# expansion defined. | |
# - P9K_KUBECONTEXT_NAME The current context's name. Corresponds to column NAME in the | |
# output of `kubectl config get-contexts`. | |
# - P9K_KUBECONTEXT_CLUSTER The current context's cluster. Corresponds to column CLUSTER in the | |
# output of `kubectl config get-contexts`. | |
# - P9K_KUBECONTEXT_NAMESPACE The current context's namespace. Corresponds to column NAMESPACE | |
# in the output of `kubectl config get-contexts`. If there is no | |
# namespace, the parameter is set to "default". | |
# | |
# If the context points to Google Kubernetes Engine (GKE) or Elastic Kubernetes Service (EKS), | |
# the following extra parameters are available: | |
# | |
# - P9K_KUBECONTEXT_CLOUD_NAME Either "gke" or "eks". | |
# - P9K_KUBECONTEXT_CLOUD_ACCOUNT Account/project ID. | |
# - P9K_KUBECONTEXT_CLOUD_ZONE Availability zone. | |
# - P9K_KUBECONTEXT_CLOUD_CLUSTER Cluster. | |
# | |
# P9K_KUBECONTEXT_CLOUD_* parameters are derived from P9K_KUBECONTEXT_CLUSTER. For example, | |
# if P9K_KUBECONTEXT_CLUSTER is "gke_my-account_us-east1-a_my-cluster-01": | |
# | |
# - P9K_KUBECONTEXT_CLOUD_NAME=gke | |
# - P9K_KUBECONTEXT_CLOUD_ACCOUNT=my-account | |
# - P9K_KUBECONTEXT_CLOUD_ZONE=us-east1-a | |
# - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 | |
# | |
# If P9K_KUBECONTEXT_CLUSTER is "arn:aws:eks:us-east-1:123456789012:cluster/my-cluster-01": | |
# | |
# - P9K_KUBECONTEXT_CLOUD_NAME=eks | |
# - P9K_KUBECONTEXT_CLOUD_ACCOUNT=123456789012 | |
# - P9K_KUBECONTEXT_CLOUD_ZONE=us-east-1 | |
# - P9K_KUBECONTEXT_CLOUD_CLUSTER=my-cluster-01 | |
typeset -g POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION= | |
# Show P9K_KUBECONTEXT_CLOUD_CLUSTER if it's not empty and fall back to P9K_KUBECONTEXT_NAME. | |
POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${P9K_KUBECONTEXT_CLOUD_CLUSTER:-${P9K_KUBECONTEXT_NAME}}' | |
# Append the current context's namespace if it's not "default". | |
POWERLEVEL9K_KUBECONTEXT_DEFAULT_CONTENT_EXPANSION+='${${:-/$P9K_KUBECONTEXT_NAMESPACE}:#/default}' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_KUBECONTEXT_PREFIX='%fat ' | |
################[ terraform: terraform workspace (https://www.terraform.io) ]################# | |
# Terraform color. | |
typeset -g POWERLEVEL9K_TERRAFORM_FOREGROUND=38 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_TERRAFORM_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#[ aws: aws profile (https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html) ]# | |
# AWS profile color. | |
typeset -g POWERLEVEL9K_AWS_DEFAULT_FOREGROUND=208 | |
# POWERLEVEL9K_AWS_CLASSES is an array with even number of elements. The first element | |
# in each pair defines a pattern against which the current AWS profile gets matched. | |
# More specifically, it's P9K_CONTENT prior to the application of context expansion (see below) | |
# that gets matched. If you unset all POWERLEVEL9K_AWS_*CONTENT_EXPANSION parameters, | |
# you'll see this value in your prompt. The second element of each pair in | |
# POWERLEVEL9K_AWS_CLASSES defines the context class. Patterns are tried in order. The | |
# first match wins. | |
# | |
# For example, given these settings: | |
# | |
# typeset -g POWERLEVEL9K_AWS_CLASSES=( | |
# '*prod*' PROD | |
# '*test*' TEST | |
# '*' DEFAULT) | |
# | |
# If your current AWS profile is "company_test", its class is TEST | |
# because "company_test" doesn't match the pattern '*prod*' but does match '*test*'. | |
# | |
# You can define different colors, icons and content expansions for different classes: | |
# | |
# typeset -g POWERLEVEL9K_AWS_TEST_FOREGROUND=28 | |
# typeset -g POWERLEVEL9K_AWS_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# typeset -g POWERLEVEL9K_AWS_TEST_CONTENT_EXPANSION='> ${P9K_CONTENT} <' | |
typeset -g POWERLEVEL9K_AWS_CLASSES=( | |
# '*prod*' PROD # These values are examples that are unlikely | |
# '*test*' TEST # to match your needs. Customize them as needed. | |
'*' DEFAULT) | |
# typeset -g POWERLEVEL9K_AWS_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#[ aws_eb_env: aws elastic beanstalk environment (https://aws.amazon.com/elasticbeanstalk/) ]# | |
# AWS Elastic Beanstalk environment color. | |
typeset -g POWERLEVEL9K_AWS_EB_ENV_FOREGROUND=70 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_AWS_EB_ENV_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##########[ azure: azure account name (https://docs.microsoft.com/en-us/cli/azure) ]########## | |
# Azure account name color. | |
typeset -g POWERLEVEL9K_AZURE_FOREGROUND=32 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_AZURE_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
##########[ gcloud: google cloud acccount and project (https://cloud.google.com/) ]########### | |
# Google cloud color. | |
typeset -g POWERLEVEL9K_GCLOUD_FOREGROUND=32 | |
# Google cloud format. Uncomment POWERLEVEL9K_GCLOUD_CONTENT_EXPANSION and edit its value if the | |
# default is too verbose. | |
# | |
# P9K_GCLOUD_ACCOUNT: the output of `gcloud config get-value account` | |
# P9K_GCLOUD_PROJECT: the output of `gcloud config get-value project` | |
# ${VARIABLE//\%/%%}: ${VARIABLE} with all occurences of '%' replaced with '%%'. | |
# | |
# typeset -g POWERLEVEL9K_GCLOUD_CONTENT_EXPANSION='${P9K_GCLOUD_ACCOUNT//\%/%%}:${P9K_GCLOUD_PROJECT//\%/%%}' | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_GCLOUD_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
#[ google_app_cred: google application credentials (https://cloud.google.com/docs/authentication/production) ]# | |
# Google application credentials classes for the purpose of using different colors, icons and | |
# expansions with different credentials. | |
# | |
# POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES is an array with even number of elements. The first | |
# element in each pair defines a pattern against which the current kubernetes context gets | |
# matched. More specifically, it's P9K_CONTENT prior to the application of context expansion | |
# (see below) that gets matched. If you unset all POWERLEVEL9K_GOOGLE_APP_CRED_*CONTENT_EXPANSION | |
# parameters, you'll see this value in your prompt. The second element of each pair in | |
# POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES defines the context class. Patterns are tried in order. | |
# The first match wins. | |
# | |
# For example, given these settings: | |
# | |
# typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( | |
# '*:*prod*:*' PROD | |
# '*:*test*:*' TEST | |
# '*' DEFAULT) | |
# | |
# If your current Google application credentials is "service_account deathray-testing x@y.com", | |
# its class is TEST because it doesn't match the pattern '* *prod* *' but does match '* *test* *'. | |
# | |
# You can define different colors, icons and content expansions for different classes: | |
# | |
# typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_FOREGROUND=28 | |
# typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_TEST_CONTENT_EXPANSION='$P9K_GOOGLE_APP_CRED_PROJECT_ID' | |
typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_CLASSES=( | |
# '*:*prod*:*' PROD # These values are examples that are unlikely | |
# '*:*test*:*' TEST # to match your needs. Customize them as needed. | |
'*' DEFAULT) | |
typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_FOREGROUND=32 | |
# typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Use POWERLEVEL9K_GOOGLE_APP_CRED_CONTENT_EXPANSION to specify the content displayed by | |
# google_app_cred segment. Parameter expansions are very flexible and fast, too. See reference: | |
# http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion. | |
# | |
# You can use the following parameters in the expansion. Each of them corresponds to one of the | |
# fields in the JSON file pointed to by GOOGLE_APPLICATION_CREDENTIALS. | |
# | |
# Parameter | JSON key file field | |
# ---------------------------------+--------------- | |
# P9K_GOOGLE_APP_CRED_TYPE | type | |
# P9K_GOOGLE_APP_CRED_PROJECT_ID | project_id | |
# P9K_GOOGLE_APP_CRED_CLIENT_EMAIL | client_email | |
# | |
# Note: ${VARIABLE//\%/%%} expands to ${VARIABLE} with all occurences of '%' replaced by '%%'. | |
typeset -g POWERLEVEL9K_GOOGLE_APP_CRED_DEFAULT_CONTENT_EXPANSION='${P9K_GOOGLE_APP_CRED_PROJECT_ID//\%/%%}' | |
###############################[ public_ip: public IP address ]############################### | |
# Public IP color. | |
typeset -g POWERLEVEL9K_PUBLIC_IP_FOREGROUND=94 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_PUBLIC_IP_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
########################[ vpn_ip: virtual private network indicator ]######################### | |
# VPN IP color. | |
typeset -g POWERLEVEL9K_VPN_IP_FOREGROUND=81 | |
# When on VPN, show just an icon without the IP address. | |
typeset -g POWERLEVEL9K_VPN_IP_CONTENT_EXPANSION= | |
# Regular expression for the VPN network interface. Run ifconfig while on VPN to see the | |
# name of the interface. | |
typeset -g POWERLEVEL9K_VPN_IP_INTERFACE='(wg|(.*tun))[0-9]*' | |
# Icon to show when on VPN. | |
typeset -g POWERLEVEL9K_VPN_IP_VISUAL_IDENTIFIER_EXPANSION='${P9K_VISUAL_IDENTIFIER}' | |
#########################[ proxy: system-wide http/https/ftp proxy ]########################## | |
# Proxy color. | |
typeset -g POWERLEVEL9K_PROXY_FOREGROUND=68 | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_PROXY_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
################################[ battery: internal battery ]################################# | |
# Show battery in red when it's below this level and not connected to power supply. | |
typeset -g POWERLEVEL9K_BATTERY_LOW_THRESHOLD=20 | |
typeset -g POWERLEVEL9K_BATTERY_LOW_FOREGROUND=160 | |
# Show battery in green when it's charging or fully charged. | |
typeset -g POWERLEVEL9K_BATTERY_{CHARGING,CHARGED}_FOREGROUND=70 | |
# Show battery in yellow when it's discharging. | |
typeset -g POWERLEVEL9K_BATTERY_DISCONNECTED_FOREGROUND=178 | |
# Battery pictograms going from low to high level of charge. | |
typeset -g POWERLEVEL9K_BATTERY_STAGES=$'\uf58d\uf579\uf57a\uf57b\uf57c\uf57d\uf57e\uf57f\uf580\uf581\uf578' | |
# Don't show the remaining time to charge/discharge. | |
typeset -g POWERLEVEL9K_BATTERY_VERBOSE=false | |
####################################[ time: current time ]#################################### | |
# Current time color. | |
typeset -g POWERLEVEL9K_TIME_FOREGROUND=66 | |
# Format for the current time: 09:51:02. See `man 3 strftime`. | |
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}' | |
# If set to true, time will update when you hit enter. This way prompts for the past | |
# commands will contain the start times of their commands as opposed to the default | |
# behavior where they contain the end times of their preceding commands. | |
typeset -g POWERLEVEL9K_TIME_UPDATE_ON_COMMAND=false | |
# Custom icon. | |
# typeset -g POWERLEVEL9K_TIME_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Custom prefix. | |
# typeset -g POWERLEVEL9K_TIME_PREFIX='%fat ' | |
# Example of a user-defined prompt segment. Function prompt_example will be called on every | |
# prompt if `example` prompt segment is added to POWERLEVEL9K_LEFT_PROMPT_ELEMENTS or | |
# POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. It displays an icon and orange text greeting the user. | |
# | |
# Type `p10k help segment` for documentation and a more sophisticated example. | |
function prompt_example() { | |
p10k segment -f 208 -i '⭐' -t 'hello, %n' | |
} | |
# User-defined prompt segments may optionally provide an instant_prompt_* function. Its job | |
# is to generate the prompt segment for display in instant prompt. See | |
# https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. | |
# | |
# Powerlevel10k will call instant_prompt_* at the same time as the regular prompt_* function | |
# and will record all `p10k segment` calls it makes. When displaying instant prompt, Powerlevel10k | |
# will replay these calls without actually calling instant_prompt_*. It is imperative that | |
# instant_prompt_* always makes the same `p10k segment` calls regardless of environment. If this | |
# rule is not observed, the content of instant prompt will be incorrect. | |
# | |
# Usually, you should either not define instant_prompt_* or simply call prompt_* from it. If | |
# instant_prompt_* is not defined for a segment, the segment won't be shown in instant prompt. | |
function instant_prompt_example() { | |
# Since prompt_example always makes the same `p10k segment` calls, we can call it from | |
# instant_prompt_example. This will give us the same `example` prompt segment in the instant | |
# and regular prompts. | |
prompt_example | |
} | |
# User-defined prompt segments can be customized the same way as built-in segments. | |
# typeset -g POWERLEVEL9K_EXAMPLE_FOREGROUND=208 | |
# typeset -g POWERLEVEL9K_EXAMPLE_VISUAL_IDENTIFIER_EXPANSION='⭐' | |
# Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt | |
# when accepting a command line. Supported values: | |
# | |
# - off: Don't change prompt when accepting a command line. | |
# - always: Trim down prompt when accepting a command line. | |
# - same-dir: Trim down prompt when accepting a command line unless this is the first command | |
# typed after changing current working directory. | |
typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off | |
# Instant prompt mode. | |
# | |
# - off: Disable instant prompt. Choose this if you've tried instant prompt and found | |
# it incompatible with your zsh configuration files. | |
# - quiet: Enable instant prompt and don't print warnings when detecting console output | |
# during zsh initialization. Choose this if you've read and understood | |
# https://github.com/romkatv/powerlevel10k/blob/master/README.md#instant-prompt. | |
# - verbose: Enable instant prompt and print a warning when detecting console output during | |
# zsh initialization. Choose this if you've never tried instant prompt, haven't | |
# seen the warning, or if you are unsure what this all means. | |
typeset -g POWERLEVEL9K_INSTANT_PROMPT=off | |
# Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized. | |
# For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload | |
# can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you | |
# really need it. | |
typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true | |
# If p10k is already loaded, reload configuration. | |
# This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true. | |
(( ! $+functions[p10k] )) || p10k reload | |
} | |
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]} | |
'builtin' 'unset' 'p10k_config_opts' |
Currently, the configuration file is quite big but I'm pretty sure not everything in this file is really required. It is more or less based on the generated configuration file using the lean set up. I haven't checked the default values for the configuration content yet but I could imagine a lot of configurations are default and as such, could be removed from the configuration file.
For those who want to know what this part in the .zshrc configuration file is about:
# Local custom plugins
for item in $(ls -1 ${HOME}/.profile.d/*.plugin.zsh); do
[ -e "${item}" ] && source "${item}"
done
This includes my personal zsh plugins that are currently not available in other frameworks like oh-my-zsh. It seems to be a little challenge to get additional plugins included there. You can see them here:
# Custom plugin for zsh | |
# | |
# Common aliases | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Command enhancements aliases ### | |
alias ls='ls -GFh' # Preferred 'ls' implementation | |
alias l.='ls -d .*' # Preferred 'l.' implementation | |
alias cp='cp -v' # Preferred 'cp' implementation | |
alias mv='mv -v' # Preferred 'mv' implementation | |
alias rm='rm -v' # Preferred 'rm' implementation | |
alias mkdir='mkdir -pv' # Preferred 'mkdir' implementation | |
alias less='less -FSRXc' # Preferred 'less' implementation | |
alias ssh='ssh -A' # Preferred 'ssh' implementation | |
alias ping='ping -c 5' # Preferred 'ping' implementation | |
alias wget='wget -c' # Preferred 'wget' implementation | |
alias edit='atom' # Preferred 'edit' implementation | |
alias lc='colorls' | |
alias lca='colorls -al' |
# Custom plugin for zsh | |
# | |
# Docker functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Docker enhancement functions ### | |
do-upg() { | |
docker-machine upgrade default | |
} | |
do-c() { | |
docker-compose $@ | |
} | |
do-ip() { | |
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@" | |
} | |
do-cl-img() { | |
for item in $(docker images | grep "<none>" | sed -e 's/ */ /g' | cut -d ' ' -f3); do | |
docker rmi $item | |
done | |
} |
# Custom plugin for zsh | |
# | |
# Common functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Command enhancement functions ### | |
.1() { cd ../ ; } # Go back 1 directory level | |
.2() { cd ../../ ; } # Go back 2 directory levels | |
.3() { cd ../../../ ; } # Go back 3 directory levels | |
.4() { cd ../../../../ ; } # Go back 4 directory levels | |
.5() { cd ../../../../../ ; } # Go back 5 directory levels | |
.6() { cd ../../../../../../ ; } # Go back 6 directory levels | |
root() { sudo su - ; } # root: Switch to root user using sudo | |
f() { open -a Finder ./ ; } # f: Opens current directory in MacOS Finder | |
c() { clear ; } # c: Clear terminal display | |
path() { echo -e ${PATH//:/\\n} ; } # path: Echo all executable Paths | |
show_options() { shopt ; } # Show_options: display bash options settings | |
fix_stty() { stty sane ; } # fix_stty: Restore terminal settings when screwed up | |
mount() { sudo mount | column -t ; } # mount: Human readable mount | |
fastping() { \ping -c 100 -s 1 "$@" ; } # fastping: Send 100 one byte packages plus header | |
j() { jobs -l ; } # j: List jobs | |
hibernate() { sudo pmset -a hibernatemode 25 ; } # hibernate: Set hibernate mode | |
sleep() { sudo pmset -a hibernatemode 0 ; } # sleep: Set sleep mode | |
safesleep() { sudo pmset -a hibernatemode 3 ; } # safesleep: Set safe sleep mode | |
smartsleep() { sudo pmset -a hibernatemode 2 ; } # smartsleep: Set smart sleep mode | |
cowdate() { LANG=C date | cowsay ; } # cowdate: Show date announced by cow | |
### Tools ### | |
rbrew_upgrade() { | |
brew update && brew upgrade | |
} | |
rbrew_doctor() { | |
brew update && brew upgrade && brew cleanup; brew doctor | |
} | |
### Functions (network) ### | |
myip() { curl ip.appspot.com ; } # myip: Public facing IP Address | |
netCons() { lsof -i ; } # netCons: Show all open TCP/IP sockets | |
flushDNS() { dscacheutil -flushcache ; } # flushDNS: Flush out the DNS Cache | |
lsock() { sudo /usr/sbin/lsof -i -P ; } # lsock: Display open sockets | |
lsockU() { sudo /usr/sbin/lsof -nP | grep UDP ; } # lsockU: Display only open UDP sockets | |
lsockT() { sudo /usr/sbin/lsof -nP | grep TCP ; } # lsockT: Display only open TCP sockets | |
ipInfo0() { ipconfig getpacket en0 ; } # ipInfo0: Get info on connections for en0 | |
ipInfo1() { ipconfig getpacket en1 ; } # ipInfo1: Get info on connections for en1 | |
openPorts() { sudo lsof -i | grep LISTEN ; } # openPorts: All listening connections | |
showBlocked() { sudo ipfw list ; } # showBlocked: All ipfw rules inc/ blocked IPs | |
httpHeaders() { /usr/bin/curl -I -L $@ ; } # httpHeaders: Grabs headers from web page | |
httpDebug() { /usr/bin/curl $@ -o /dev/null -w "dns: %{time_namelookup} connect: %{time_connect} pretransfer: %{time_pretransfer} starttransfer: %{time_starttransfer} total: %{time_total}\n" ; } | |
ipLocal() { | |
for i in $(ifconfig -l); do | |
case $i in | |
(lo0) ;; | |
(*) set -- $(ifconfig $i | grep "inet [1-9]") | |
if test $# -gt 1; then echo $i: $2; fi ;; | |
esac | |
done | |
} | |
### Functions (system) ### | |
mountReadWrite() { /sbin/mount -uw / ; } | |
findPid() { lsof -t -c "$@" ; } | |
memHogsTop() { top -l 1 -o rsize | head -20 ; } | |
memHogsPs() { ps wwaxm -o pid,stat,vsize,rss,time,command | head -10 ; } | |
topForever() { top -l 9999999 -s 10 -o cpu ; } | |
ttop() { top -R -F -s 10 -o rsize ; } | |
cpu_hogs() { ps wwaxr -o pid,stat,%cpu,time,command | head -10 ; } | |
my_ps() { ps $@ -u $USER -o pid,%cpu,%mem,start,time,bsdtime,command ; } | |
ii() { | |
echo -e "\nYou are logged on ${HOSTNAME}" | |
echo -e "\nAdditionnal information: " ; uname -a | |
echo -e "\nUsers logged on: " ; w -h | |
echo -e "\nCurrent date: " ; date | |
echo -e "\nMachine stats: " ; uptime | |
echo -e "\nPublic facing IP Address: " ; myip | |
echo | |
} | |
### Functions (filemanagement) ### | |
finderShowHidden() { defaults write com.apple.finder ShowAllFiles TRUE ; } | |
finderHideHidden() { defaults write com.apple.finder ShowAllFiles FALSE ; } | |
dush() { du -sm * | sort -n | tail ; } | |
numFiles() { echo $(ls -1 | wc -l) ; } # numFiles: Count of non-hidden files in current dir | |
cleanupDS() { find . -type f -name '*.DS_Store' -ls -delete ; } | |
mcd() { mkdir -p "$1" && cd "$1" ; } # mcd: Makes new Dir and jumps inside | |
ql() { qlmanage -p "$*" >& /dev/null ; } # ql: Opens any file in MacOS Quicklook Preview | |
zipf() { zip -r "$1".zip "$1" ; } # zipf: To create a ZIP archive of a folder | |
trash() { command mv "$@" ~/.Trash ; } # trash: Moves a file to the MacOS trash | |
spotlight() { mdfind "kMDItemDisplayName == '$@'wc" ; } | |
extract() { | |
if [ -f $1 ] ; then | |
case $1 in | |
*.tar.bz2) tar xvjf $1 ;; | |
*.tar.gz) tar xvzf $1 ;; | |
*.bz2) bunzip2 -v $1 ;; | |
*.rar) unrar x $1 ;; | |
*.gz) gunzip -v $1 ;; | |
*.tar) tar xvf $1 ;; | |
*.tbz2) tar xvjf $1 ;; | |
*.tgz) tar xvzf $1 ;; | |
*.zip) unzip -v $1 ;; | |
*.Z) uncompress -v $1 ;; | |
*.7z) 7z x $1 ;; | |
*) echo "'$1' cannot be extracted via extract()" ;; | |
esac | |
else | |
echo "'$1' is not a valid file" | |
fi | |
} | |
makefile_1mb() { mkfile 1m ./1MB.dat ; } # makefile_1mb: Creates a file of 1mb size (all zeros) | |
makefile_5mb() { mkfile 5m ./5MB.dat ; } # makefile_5mb: Creates a file of 5mb size (all zeros) | |
makefile_10mb() { mkfile 10m ./10MB.dat ; } # makefile_10mb: Creates a file of 10mb size (all zeros) |
# Custom plugin for zsh | |
# | |
# Git functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### GIT development functions ### | |
rev_git_config() { | |
for item in $(find . -type d | grep -E "\/\.git$" | sed -e "s/\/\.git$//"); do | |
CUR_DIR=$(pwd) | |
cd $item | |
echo "Repository: $item" | |
git config --local -l | |
cd $CUR_DIR | |
done | |
} | |
rev_git_status() { | |
clustergit --recursive | |
} | |
rev_git_cloc() { | |
for item in $(find . -type d | grep -E "\/\.git$" | sed -e "s/\/\.git$//"); do | |
CUR_DIR=$(pwd) | |
cd $item | |
echo "Repository: $item" | |
cloc --vcs=git . | |
cd $CUR_DIR | |
done | |
} | |
rev_git_pull() { | |
clustergit --recursive --pull | |
} | |
rev_git_push() { | |
clustergit --recursive --push | |
} |
# Custom plugin for zsh | |
# | |
# Jekyll functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Tweetsert API token ### | |
export JTP_ACCESS_TOKEN="XXX" | |
### Jekyll Functions ### | |
jdate() { date "+date: %Y-%m-%d %H:%M:%S %z" ; } |
# Custom plugin for zsh | |
# | |
# Nerd functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Nerd section ### | |
excuse() { echo $(telnet bofh.jeffballard.us 666 2>/dev/null) | grep --color -o "Your excuse is:.*$" ; } | |
starwars() { telnet towel.blinkenlights.nl ; } | |
weather() { curl wttr.in/$1 ; } |
# Custom plugin for zsh | |
# | |
# Puppet functions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Puppet development functions ### | |
rev_puppet_module_upgrade() { | |
for item in $(ls -1d ./* | grep -E "/$"); do | |
CUR_DIR=$(pwd) | |
cd $item | |
test -e metadata.json && echo Upgrade Puppet module in $item | |
test -e metadata.json && puppet module upgrade --modulepath $CUR_DIR $(grep name metadata.json | head -1 | cut -d '"' -f4) | |
cd .. | |
done | |
} | |
rev_puppet_build() { | |
for item in $(ls -1d ./* | grep -E "/$"); do | |
cd $item | |
echo Build Puppet module in $item | |
test -e metadata.json && puppet module build | |
cd .. | |
done | |
} | |
puppet_test() { | |
bundle exec rake validate | |
bundle exec rake lint | |
bundle exec rake spec | |
} | |
puppet_validate() { | |
bundle exec rake validate | |
bundle exec rake lint | |
COVERALLS_RUN_LOCALLY=true; bundle exec rake spec | |
} | |
rev_bundle_update() { | |
for item in $(ls -1d ./* | grep -E "/$"); do | |
cd $item | |
echo Updating repository $item | |
test -e Gemfile && bundle update | |
cd .. | |
done | |
} | |
validate_erb() { | |
erb -P -x -T '-' ${1} | ruby -c | |
} |
# Custom plugin for zsh | |
# | |
# Ruby funcktions | |
# | |
# Author: Thomas Bendler <code@thbe.org> | |
# Date: Wed Jan 1 23:54:03 CET 2020 | |
# | |
### Path for rbenv installed ruby version ### | |
if [ -x /usr/local/bin/rbenv ]; then | |
eval "$(rbenv init -)" | |
fi |
Top comments (0)