Last active
May 9, 2017 15:18
-
-
Save madbence/a4adc398c6785c4ffc452e6d5e99f441 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Lines configured by zsh-newuser-install | |
HISTFILE=~/.histfile | |
HISTSIZE=100000 | |
SAVEHIST=100000 | |
setopt appendhistory autocd histignoredups | |
unsetopt beep | |
bindkey -e | |
# End of lines configured by zsh-newuser-install | |
# The following lines were added by compinstall | |
zstyle :compinstall filename '/home/vagrant/.zshrc' | |
autoload -Uz compinit | |
compinit | |
# End of lines added by compinstall | |
bindkey "^[[3~" delete-char | |
bindkey "^[[8~" end-of-line | |
bindkey "^[[7~" beginning-of-line | |
fpath=("$HOME/.zfunctions" $fpath) | |
source ~/.zsh/git.zsh | |
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh | |
autoload -U promptinit && promptinit | |
prompt pure | |
zstyle ':completion:*' menu select=2 | |
export EDITOR=vim | |
export VISUAL=vim | |
alias ag="ag $* -C --pager 'less -r'" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Outputs current branch info in prompt format | |
function git_prompt_info() { | |
local ref | |
if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ]]; then | |
ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ | |
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0 | |
echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX" | |
fi | |
} | |
# Checks if working tree is dirty | |
function parse_git_dirty() { | |
local STATUS='' | |
local FLAGS | |
FLAGS=('--porcelain') | |
if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then | |
if [[ $POST_1_7_2_GIT -gt 0 ]]; then | |
FLAGS+='--ignore-submodules=dirty' | |
fi | |
if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then | |
FLAGS+='--untracked-files=no' | |
fi | |
STATUS=$(command git status ${FLAGS} 2> /dev/null | tail -n1) | |
fi | |
if [[ -n $STATUS ]]; then | |
echo "$ZSH_THEME_GIT_PROMPT_DIRTY" | |
else | |
echo "$ZSH_THEME_GIT_PROMPT_CLEAN" | |
fi | |
} | |
# Gets the difference between the local and remote branches | |
function git_remote_status() { | |
local remote ahead behind git_remote_status git_remote_status_detailed | |
remote=${$(command git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} | |
if [[ -n ${remote} ]]; then | |
ahead=$(command git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l) | |
behind=$(command git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l) | |
if [[ $ahead -eq 0 ]] && [[ $behind -eq 0 ]]; then | |
git_remote_status="$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE" | |
elif [[ $ahead -gt 0 ]] && [[ $behind -eq 0 ]]; then | |
git_remote_status="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE" | |
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}" | |
elif [[ $behind -gt 0 ]] && [[ $ahead -eq 0 ]]; then | |
git_remote_status="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE" | |
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}" | |
elif [[ $ahead -gt 0 ]] && [[ $behind -gt 0 ]]; then | |
git_remote_status="$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE" | |
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}" | |
fi | |
if [[ -n $ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_DETAILED ]]; then | |
git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX$remote$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX" | |
fi | |
echo $git_remote_status | |
fi | |
} | |
# Outputs the name of the current branch | |
# Usage example: git pull origin $(git_current_branch) | |
# Using '--quiet' with 'symbolic-ref' will not cause a fatal error (128) if | |
# it's not a symbolic ref, but in a Git repo. | |
function git_current_branch() { | |
local ref | |
ref=$(command git symbolic-ref --quiet HEAD 2> /dev/null) | |
local ret=$? | |
if [[ $ret != 0 ]]; then | |
[[ $ret == 128 ]] && return # no git repo. | |
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return | |
fi | |
echo ${ref#refs/heads/} | |
} | |
# Gets the number of commits ahead from remote | |
function git_commits_ahead() { | |
if command git rev-parse --git-dir &>/dev/null; then | |
local commits="$(git rev-list --count @{upstream}..HEAD)" | |
if [[ "$commits" != 0 ]]; then | |
echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX" | |
fi | |
fi | |
} | |
# Gets the number of commits behind remote | |
function git_commits_behind() { | |
if command git rev-parse --git-dir &>/dev/null; then | |
local commits="$(git rev-list --count HEAD..@{upstream})" | |
if [[ "$commits" != 0 ]]; then | |
echo "$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX" | |
fi | |
fi | |
} | |
# Outputs if current branch is ahead of remote | |
function git_prompt_ahead() { | |
if [[ -n "$(command git rev-list origin/$(git_current_branch)..HEAD 2> /dev/null)" ]]; then | |
echo "$ZSH_THEME_GIT_PROMPT_AHEAD" | |
fi | |
} | |
# Outputs if current branch is behind remote | |
function git_prompt_behind() { | |
if [[ -n "$(command git rev-list HEAD..origin/$(git_current_branch) 2> /dev/null)" ]]; then | |
echo "$ZSH_THEME_GIT_PROMPT_BEHIND" | |
fi | |
} | |
# Outputs if current branch exists on remote or not | |
function git_prompt_remote() { | |
if [[ -n "$(command git show-ref origin/$(git_current_branch) 2> /dev/null)" ]]; then | |
echo "$ZSH_THEME_GIT_PROMPT_REMOTE_EXISTS" | |
else | |
echo "$ZSH_THEME_GIT_PROMPT_REMOTE_MISSING" | |
fi | |
} | |
# Formats prompt string for current git commit short SHA | |
function git_prompt_short_sha() { | |
local SHA | |
SHA=$(command git rev-parse --short HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
} | |
# Formats prompt string for current git commit long SHA | |
function git_prompt_long_sha() { | |
local SHA | |
SHA=$(command git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" | |
} | |
# Get the status of the working tree | |
function git_prompt_status() { | |
local INDEX STATUS | |
INDEX=$(command git status --porcelain -b 2> /dev/null) | |
STATUS="" | |
if $(echo "$INDEX" | command grep -E '^\?\? ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^A ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" | |
elif $(echo "$INDEX" | grep '^M ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^R ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
elif $(echo "$INDEX" | grep '^D ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" | |
fi | |
if $(command git rev-parse --verify refs/stash >/dev/null 2>&1); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## [^ ]\+ .*ahead' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## [^ ]\+ .*behind' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS" | |
fi | |
if $(echo "$INDEX" | grep '^## [^ ]\+ .*diverged' &> /dev/null); then | |
STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS" | |
fi | |
echo $STATUS | |
} | |
# Compares the provided version of git to the version installed and on path | |
# Outputs -1, 0, or 1 if the installed version is less than, equal to, or | |
# greater than the input version, respectively. | |
function git_compare_version() { | |
local INPUT_GIT_VERSION INSTALLED_GIT_VERSION | |
INPUT_GIT_VERSION=(${(s/./)1}) | |
INSTALLED_GIT_VERSION=($(command git --version 2>/dev/null)) | |
INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]}) | |
for i in {1..3}; do | |
if [[ $INSTALLED_GIT_VERSION[$i] -gt $INPUT_GIT_VERSION[$i] ]]; then | |
echo 1 | |
return 0 | |
fi | |
if [[ $INSTALLED_GIT_VERSION[$i] -lt $INPUT_GIT_VERSION[$i] ]]; then | |
echo -1 | |
return 0 | |
fi | |
done | |
echo 0 | |
} | |
# Outputs the name of the current user | |
# Usage example: $(git_current_user_name) | |
function git_current_user_name() { | |
command git config user.name 2>/dev/null | |
} | |
# Outputs the email of the current user | |
# Usage example: $(git_current_user_email) | |
function git_current_user_email() { | |
command git config user.email 2>/dev/null | |
} | |
# This is unlikely to change so make it all statically assigned | |
POST_1_7_2_GIT=$(git_compare_version "1.7.2") | |
# Clean up the namespace slightly by removing the checker function | |
unfunction git_compare_version |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# pure | |
# by Kevin Lanni | |
# https://github.com/therealklanni/pure | |
# MIT License | |
# For my own and others sanity | |
# git: | |
# %b => current branch | |
# %a => current action (rebase/merge) | |
# prompt: | |
# %F => color dict | |
# %f => reset color | |
# %~ => current path | |
# %* => time | |
# %n => username | |
# %m => shortname host | |
# %(?..) => prompt conditional - %(condition.true.false) | |
# turns seconds into human readable time | |
# 165392 => 1d 21h 56m 32s | |
prompt_pure_human_time() { | |
local tmp=$1 | |
local days=$(( tmp / 60 / 60 / 24 )) | |
local hours=$(( tmp / 60 / 60 % 24 )) | |
local minutes=$(( tmp / 60 % 60 )) | |
local seconds=$(( tmp % 60 )) | |
echo -n " " | |
(( $days > 0 )) && echo -n "${days}d " | |
(( $hours > 0 )) && echo -n "${hours}h " | |
(( $minutes > 0 )) && echo -n "${minutes}m " | |
echo "${seconds}s" | |
} | |
prompt_pure_preexec() { | |
cmd_timestamp=$EPOCHSECONDS | |
# shows the current dir and executed command in the title when a process is active | |
print -Pn "\e]0;" | |
echo -nE "$PWD:t: $2" | |
print -Pn "\a" | |
} | |
prompt_pure_precmd() { | |
# shows the full path in the title | |
print -Pn '\e]0;%~\a' | |
# show slow commands | |
local stop=$EPOCHSECONDS | |
local start=${cmd_timestamp:-$stop} | |
integer elapsed=$stop-$start | |
(($elapsed > 5)) && print -P '%F{yellow}$(prompt_pure_human_time $elapsed)%f' | |
# reset value since `preexec` isn't always triggered | |
unset cmd_timestamp | |
} | |
prompt_pure_setup() { | |
# prevent percentage showing up | |
# if output doesn't end with a newline | |
export PROMPT_EOL_MARK='' | |
prompt_opts=(cr subst percent) | |
zmodload zsh/datetime | |
autoload -Uz add-zsh-hook | |
autoload -Uz vcs_info | |
add-zsh-hook precmd prompt_pure_precmd | |
add-zsh-hook preexec prompt_pure_preexec | |
# show username@host if logged in through SSH | |
[[ "$SSH_CONNECTION" != '' ]] && prompt_pure_username='%F{white}(ssh: %n)%f ' | |
ZSH_THEME_GIT_PROMPT_PREFIX=" %F{cyan}git:%f%F{yellow}" | |
ZSH_THEME_GIT_PROMPT_SUFFIX="%b" | |
ZSH_THEME_GIT_PROMPT_DIRTY="" | |
ZSH_THEME_GIT_PROMPT_CLEAN="" | |
ZSH_THEME_GIT_PROMPT_ADDED="%F{green}(added)%f " | |
ZSH_THEME_GIT_PROMPT_MODIFIED="%F{blue}(modified)%f " | |
ZSH_THEME_GIT_PROMPT_DELETED="%F{red}(deleted)%f " | |
ZSH_THEME_GIT_PROMPT_RENAMED="%F{magenta}(renamed)%f " | |
ZSH_THEME_GIT_PROMPT_UNMERGED="%F{yellow}(unmerged)%f " | |
ZSH_THEME_GIT_PROMPT_UNTRACKED="%F{cyan}(untracked)%f " | |
# prompt turns red if the previous command didn't exit with 0 | |
PROMPT="${prompt_pure_username}%F{blue}%c %(?.%F{green}.%F{red})λ%f " | |
RPROMPT='$(git_prompt_info) $(git_prompt_status)%f' | |
} | |
prompt_pure_setup "$@" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment