ZSH: Switch from zprezto to zgen

This commit is contained in:
Henrik Lissner 2015-06-18 22:16:54 +02:00
parent 39900faf2e
commit c7de2307a4
12 changed files with 348 additions and 480 deletions

1
.gitignore vendored
View file

@ -1,4 +1,5 @@
vim/bundle/
vimperator/info/
tmp/
zsh/cache
Gemfile.lock

View file

@ -13,7 +13,10 @@ alias bru='brew update && brew upgrade --all'
# Tools
alias codekit='open -a CodeKit'
alias ag='nocorrect noglob ag'
alias ln="${aliases[ln]:-ln} -v" # Verbose ln
alias ls="ls -G"
alias l="ls -l"
alias ll="ls -l"
alias ln="ln -v" # Verbose ln
alias wget='wget -c' # Resume dl if possible
alias rsyncd='rsync -va --delete' # Hard sync two directories
zman() { PAGER="less -g -s '+/^ "$1"'" man zshall; }
@ -40,7 +43,6 @@ if is-callable 'transmission-remote'; then
fi
# Editors
unalias e
v() { [ $# -eq 0 ] && vim . || vim $@ }
e() { # emacs
local input

117
zsh/completion.zsh Normal file
View file

@ -0,0 +1,117 @@
# Return if requirements are not found.
[[ "$TERM" == 'dumb' ]] && return 1
# Load and initialize the completion system ignoring insecure directories.
autoload -Uz compinit && compinit -i
## Options
setopt COMPLETE_IN_WORD # Complete from both ends of a word.
setopt ALWAYS_TO_END # Move cursor to the end of a completed word.
setopt PATH_DIRS # Perform path search even on command names with slashes.
setopt AUTO_MENU # Show completion menu on a successive tab press.
setopt AUTO_LIST # Automatically list choices on ambiguous completion.
setopt AUTO_PARAM_SLASH # If completed parameter is a directory, add a trailing slash.
unsetopt MENU_COMPLETE # Do not autoselect the first completion entry.
unsetopt FLOW_CONTROL # Disable start/stop characters in shell editor.
# Use caching to make completion for commands such as dpkg and apt usable.
zstyle ':completion::complete:*' use-cache on
zstyle ':completion::complete:*' cache-path "${ZDOTDIR:-$HOME}/.zcompcache"
# Case-insensitive (all), partial-word, and then substring completion.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
unsetopt CASE_GLOB
# Group matches and describe.
zstyle ':completion:*:*:*:*:*' menu select
zstyle ':completion:*:matches' group 'yes'
zstyle ':completion:*:options' description 'yes'
zstyle ':completion:*:options' auto-description '%d'
zstyle ':completion:*:corrections' format ' %F{green}-- %d (errors: %e) --%f'
zstyle ':completion:*:descriptions' format ' %F{yellow}-- %d --%f'
zstyle ':completion:*:messages' format ' %F{purple} -- %d --%f'
zstyle ':completion:*:warnings' format ' %F{red}-- no matches found --%f'
zstyle ':completion:*:default' list-prompt '%S%M matches%s'
zstyle ':completion:*' format ' %F{yellow}-- %d --%f'
zstyle ':completion:*' group-name ''
zstyle ':completion:*' verbose yes
# Fuzzy match mistyped completions.
zstyle ':completion:*' completer _complete _match _approximate
zstyle ':completion:*:match:*' original only
zstyle ':completion:*:approximate:*' max-errors 1 numeric
# Increase the number of errors based on the length of the typed word.
zstyle -e ':completion:*:approximate:*' max-errors 'reply=($((($#PREFIX+$#SUFFIX)/3))numeric)'
# Don't complete unavailable commands.
zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec))'
# Array completion element sorting.
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
# Directories
zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories
zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand'
zstyle ':completion:*' squeeze-slashes true
# History
zstyle ':completion:*:history-words' stop yes
zstyle ':completion:*:history-words' remove-all-dups yes
zstyle ':completion:*:history-words' list false
zstyle ':completion:*:history-words' menu yes
# Environmental Variables
zstyle ':completion::*:(-command-|export):*' fake-parameters ${${${_comps[(I)-value-*]#*,}%%,*}:#-*-}
# Populate hostname completion.
zstyle -e ':completion:*:hosts' hosts 'reply=(
${=${=${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) 2>/dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ }
${=${(f)"$(cat /etc/hosts(|)(N) <<(ypcat hosts 2>/dev/null))"}%%\#*}
${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2>/dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}}
)'
# Don't complete uninteresting users...
zstyle ':completion:*:*:*:users' ignored-patterns \
adm amanda apache avahi beaglidx bin cacti canna clamav daemon \
dbus distcache dovecot fax ftp games gdm gkrellmd gopher \
hacluster haldaemon halt hsqldb ident junkbust ldap lp mail \
mailman mailnull mldonkey mysql nagios \
named netdump news nfsnobody nobody nscd ntp nut nx openvpn \
operator pcap postfix postgres privoxy pulse pvm quagga radvd \
rpc rpcuser rpm shutdown squid sshd sync uucp vcsa xfs '_*'
# ... unless we really want to.
zstyle '*' single-ignored show
# Ignore multiple entries.
zstyle ':completion:*:(rm|kill|diff):*' ignore-line other
zstyle ':completion:*:rm:*' file-patterns '*:all-files'
# Kill
zstyle ':completion:*:*:*:*:processes' command 'ps -u $LOGNAME -o pid,user,command -w'
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;36=0=01'
zstyle ':completion:*:*:kill:*' menu yes select
zstyle ':completion:*:*:kill:*' force-list always
zstyle ':completion:*:*:kill:*' insert-ids single
# Man
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*:manuals.(^1*)' insert-sections true
# Media Players
zstyle ':completion:*:*:mpg123:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories'
zstyle ':completion:*:*:mpg321:*' file-patterns '*.(mp3|MP3):mp3\ files *(-/):directories'
zstyle ':completion:*:*:ogg123:*' file-patterns '*.(ogg|OGG|flac):ogg\ files *(-/):directories'
zstyle ':completion:*:*:mocp:*' file-patterns '*.(wav|WAV|mp3|MP3|ogg|OGG|flac):ogg\ files *(-/):directories'
# SSH/SCP/RSYNC
zstyle ':completion:*:(scp|rsync):*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *'
zstyle ':completion:*:(scp|rsync):*' group-order users files all-files hosts-domain hosts-host hosts-ipaddr
zstyle ':completion:*:ssh:*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *'
zstyle ':completion:*:ssh:*' group-order users hosts-domain hosts-host users hosts-ipaddr
zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost broadcasthost
zstyle ':completion:*:(ssh|scp|rsync):*:hosts-domain' ignored-patterns '<->.<->.<->.<->' '^[-[:alnum:]]##(.[-[:alnum:]]##)##' '*@*'
zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*'

View file

@ -1,151 +0,0 @@
#compdef doing
local ret=1 state
_arguments \
':subcommand:->subcommand' \
'*::options:->options' && ret=0
case $state in
subcommand)
local -a subcommands
subcommands=(
'help:Shows a list of commands or help for one command'
'now:Add an entry'
'note:Add a note to the last entry'
'meanwhile:Finish any running @meanwhile tasks and optionally create a new one'
'later:Add an item to the Later section'
'done:Add a completed item with @done(date). No argument finishes last entry.'
'finish:Mark last X entries as @done'
'tag:Tag last entry'
'mark:Mark last entry as highlighted'
'show:List all entries'
'grep:Search for entries'
'recent:List recent entries'
'today:List entries from today'
'yesterday:List entries from yesterday'
'last:Show the last entry'
'sections:List sections'
'choose:Select a section to display from a menu'
'add_section:Add a new section to the "doing" file'
'view:Display a user-created view'
'views:List available custom views'
'archive:Move entries in between sections'
'open:Open the "doing" file in an editor'
'config:Edit the configuration file'
'undo:Undo the last change to the doing_file'
)
_describe -t subcommands 'doing subcommand' subcommands && ret=0
;;
options)
age=({-a,--age=}"[Age (oldest/newest) (default: newest)]")
app=({-a,--app=}"[Edit entry with specified app (default: none)")
archive=({-a,--archive}"[Archive previous @meanwhile entry]")
back="--back=[Backdate start time (4pm|20m|2h|yesterday noon) (default: none)]"
boolean=({-b,--boolean=}"[Tag boolean (AND,OR,NONE) (default: OR)]")
bool=({-b,--bool=}"[Tag boolean (default: AND)]")
count=({-c,--count=}"[How many recent entries to tag (default: 1)]")
count=({-c,--count=}"[Max count to show (default: 0)]")
date=({-d,--date}"[Include date (default: enabled)]")
editor=( {-e,--editor}"[Edit entry with $EDITOR]")
finish=({-f,--finish_last}"[Timed entry, marks last entry in section as @done]")
file=({-f,--file=}"[Specify alternate doing file (default: none)]")
noarchive="--no-archive[Don't archive previous @meanwhile entry]"
nodate="--no-date[Don't include date]"
noeditor="--no-editor[Don't edit entry with $EDITOR]"
note=({-n,--note=}"[Note (default: none)]")
notimes="--no-times[Don't show time intervals on @done tasks.]"
nototals="--no-totals[Don't show intervals with totals at the end of output]"
output=({-o,--output=}"[Output to export format (csv|html) (default: none)]")
remove=({-r,--remove}"[Replace/Remove last entry's note]")
section=({-s,--section=}"[Section (default: Currently)]")
sort=({-s,--sort=}"[Sort order (asc/desc) (default: asc)]")
times=({-t,--times}"[Show time intervals on @done tasks (default: enabled)]")
took=({-t,--took=}"[Set completion date to start date plus XX(mhd) or (HH:MM) (default: none)]")
totals="--totals[Show intervals with totals at the end of output]"
case $words[1] in
now)
args=( $back $noeditor $editor $note $section $finish )
;;
note)
args=( $section $editor $remove )
;;
meanwhile)
args=( $back $noeditor $editor $note $section $archive $noarchive )
;;
later)
args=( $back $noeditor $editor $note $app )
;;
done)
args=( $back $took $section {-r,--remove}"[Remove @done tag]" $date $nodate $archive $editor $noeditor )
;;
finish)
args=( $back $took $section $date $nodate $archive $editor $noeditor )
;;
tag)
args=( $section $count $date $remove )
;;
mark)
args=( $section $remove )
;;
show)
args=( $boolean $count $age $sort $output $times $notimes $totals $nototals )
;;
grep)
args=( $section $output $times $notimes $totals $nototals )
;;
recent)
args=( $section $times $notimes $totals $nototals )
;;
today)
args=( $output $times $notimes $totals $nototals )
;;
yesterday)
args=( $output $times $notimes $totals $nototals )
;;
view)
args=( $section $count $output $times $notimes $totals $nototals )
;;
archive)
args=( $keep $to $bool )
;;
open)
args=(
"-a [open with app name (default:none)"
"-b [open with app bundle id (default: none)"
"-e [open with $EDITOR]"
)
;;
config)
args=( $editor )
;;
undo)
args=( $file )
;;
esac
_arguments $args && ret=0
;;
esac
return ret

25
zsh/config.zsh Normal file
View file

@ -0,0 +1,25 @@
# Allow command line editing in an external editor.
autoload -Uz edit-command-line
zle -N edit-command-line
export GIT_MERGE_AUTOEDIT=no
unsetopt CORRECT_ALL
setopt append_history share_history extended_history
setopt histignorealldups histignorespace
setopt extended_glob
setopt longlistjobs
setopt nonomatch
setopt notify
setopt hash_list_all
# Don't send SIGHUP to background processes when the shell exits.
setopt nohup
setopt auto_cd
setopt auto_pushd
setopt pushd_ignore_dups
setopt nobeep
setopt noglobdots
setopt noshwordsplit
setopt unset

View file

@ -1,26 +1,44 @@
export GIT_MERGE_AUTOEDIT=no
unsetopt CORRECT_ALL
#################
# Keybindings #
#################
bindkey -v
bindkey '^ ' edit-command-line
bindkey -M viins '^w' backward-kill-word
bindkey -M viins '^a' beginning-of-line
bindkey -M viins '^e' end-of-line
bindkey -M viins '^[w' forward-word
bindkey -M viins '^[b' backward-word
bindkey -M vicmd 'yy' vi-yank-whole-line
bindkey -M vicmd 'Y' vi-yank-eol
bindkey -M vicmd '^r' redo
bindkey -M viins ' ' magic-space
bindkey -M viins 'jk' vi-cmd-mode
bindkey -M viins '^x^f' fasd-complete-f # C-x C-f to do fasd-complete-f (only files)
bindkey -M viins '^x^d' fasd-complete-d # C-x C-d to do fasd-complete-d (only directories)
bindkey -M viins '^q' push-line-or-edit
bindkey -M vicmd "?" history-incremental-pattern-search-backward
bindkey -M vicmd "/" history-incremental-pattern-search-forward
# bind UP and DOWN arrow keys
zmodload zsh/terminfo
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
# bind UP and DOWN arrow keys (compatibility fallback
# for Ubuntu 12.04, Fedora 21, and MacOSX 10.9 users)
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down]]]]
# Edit command in an external editor.
bindkey -M vicmd "v" edit-command-line
# # Undo/Redo
bindkey -M vicmd "u" undo
bindkey -M vicmd "$key_info[Control]R" redo
bindkey -M viins "." expand-dot-to-parent-directory-path
# Completing words in buffer in tmux
if [ -n "$TMUX" ]; then
_tmux_pane_words() {
@ -44,3 +62,13 @@ if [ -n "$TMUX" ]; then
zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' ignore-line current
zstyle ':completion:tmux-pane-words-anywhere:*' matcher-list 'b:=* m:{A-Za-z}={a-zA-Z}'
fi
# Expands .... to ../..
function expand-dot-to-parent-directory-path {
if [[ $LBUFFER = *.. ]]; then
LBUFFER+='/..'
else
LBUFFER+='.'
fi
}
zle -N expand-dot-to-parent-directory-path

View file

@ -1,111 +0,0 @@
# Sets Prezto options.
[[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
# General
zstyle ':prezto:module:prompt' theme 'pure'
# Set case-sensitivity for completion, history lookup, etc.
# zstyle ':prezto:*:*' case-sensitive 'yes'
# Color output (auto set to 'no' on dumb terminals).
zstyle ':prezto:*:*' color 'yes'
# Set the Zsh modules to load (man zshmodules).
# zstyle ':prezto:load' zmodule 'attr' 'stat'
# Set the Zsh functions to load (man zshcontrib).
zstyle ':prezto:load' zfunction 'zmv'
# Set the Prezto modules to load (browse modules).
# The order matters.
if [[ -z "$EMACS" ]]; then
zstyle ':prezto:load' pmodule \
'environment' \
'terminal' \
'editor' \
'opp' \
'history' \
'history-substring-search' \
'directory' \
'spectrum' \
'utility' \
'completion' \
'prompt' \
'syntax-highlighting' \
'git' \
'osx'
else
zstyle ':prezto:load' pmodule \
'environment' \
'history' \
'directory' \
'spectrum' \
'utility' \
'git' \
'osx'
fi
# Editor
# Set the key mapping style to 'emacs' or 'vi'.
zstyle ':prezto:module:editor' key-bindings 'vi'
# Auto convert .... to ../..
zstyle ':prezto:module:editor' dot-expansion 'yes'
# Git
# Ignore submodules when they are 'dirty', 'untracked', 'all', or 'none'.
zstyle ':prezto:module:git:status:ignore' submodules 'all'
# GNU Utility
# Set the command prefix on non-GNU systems.
# zstyle ':prezto:module:gnu-utility' prefix 'g'
# History Substring Search
# Set the query found color.
# zstyle ':prezto:module:history-substring-search:color' found ''
# Set the query not found color.
# zstyle ':prezto:module:history-substring-search:color' not-found ''
# Set the search globbing flags.
# zstyle ':prezto:module:history-substring-search' globbing-flags ''
# SSH
# Set the SSH identities to load into the agent.
zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_rsa2' 'id_github'
# Syntax Highlighting
# Set syntax highlighters.
# By default, only the main highlighter is enabled.
zstyle ':prezto:module:syntax-highlighting' highlighters \
'main' \
'brackets' \
'pattern' \
'cursor' \
'root'
# Terminal
# Auto set the tab and window titles.
zstyle ':prezto:module:terminal' auto-title 'yes'
# Set the window title format.
# zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'
# Set the tab title format.
# zstyle ':prezto:module:terminal:tab-title' format '%m: %s'

132
zsh/prompt.zsh Normal file
View file

@ -0,0 +1,132 @@
# Based off Pure <https://github.com/sindresorhus/pure>
# 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() {
echo -n " "
local tmp=$1
local days=$(( tmp / 60 / 60 / 24 ))
local hours=$(( tmp / 60 / 60 % 24 ))
local minutes=$(( tmp / 60 % 60 ))
local seconds=$(( tmp % 60 ))
(( $days > 0 )) && echo -n "${days}d "
(( $hours > 0 )) && echo -n "${hours}h "
(( $minutes > 0 )) && echo -n "${minutes}m "
echo "${seconds}s"
}
# fastest possible way to check if repo is dirty
prompt_pure_git_dirty() {
# check if we're in a git repo
[[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] || return
# check if it's dirty
[[ "$PURE_GIT_UNTRACKED_DIRTY" == 0 ]] && local umode="-uno" || local umode="-unormal"
command test -n "$(git status --porcelain --ignore-submodules ${umode})"
(($? == 0)) && echo '*'
}
# displays the exec time of the last command if set threshold was exceeded
prompt_pure_cmd_exec_time() {
local stop=$EPOCHSECONDS
local start=${cmd_timestamp:-$stop}
integer elapsed=$stop-$start
(($elapsed > ${PURE_CMD_MAX_EXEC_TIME:=5})) && prompt_pure_human_time $elapsed
}
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"
}
# string length ignoring ansi escapes
prompt_pure_string_length() {
# Subtract one since newline is counted as two characters
echo $(( ${#${(S%%)1//(\%([KF1]|)\{*\}|\%[Bbkf])}} - 1 ))
}
prompt_pure_precmd() {
# shows the full path in the title
print -Pn '\e]0;%~\a'
# git info
vcs_info
local prompt_pure_preprompt="%F{blue}%~%F{242}$vcs_info_msg_0_`prompt_pure_git_dirty`$prompt_pure_username%f%F{yellow}`prompt_pure_cmd_exec_time`%f"'$(vi_mode_prompt_info)'
# print -P $prompt_pure_preprompt
RPROMPT=$prompt_pure_preprompt
# check async if there is anything to pull
(( ${PURE_GIT_PULL:-1} )) && {
# check if we're in a git repo
[[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] &&
# make sure working tree is not $HOME
[[ "$(command git rev-parse --show-toplevel)" != "$HOME" ]] &&
# check check if there is anything to pull
command git -c gc.auto=0 fetch &>/dev/null &&
# check if there is an upstream configured for this branch
command git rev-parse --abbrev-ref @'{u}' &>/dev/null && {
local arrows=''
(( $(command git rev-list --right-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows='⇣'
(( $(command git rev-list --left-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows+='⇡'
RPROMPT+="\e7\e[A\e[1G\e[`prompt_pure_string_length $prompt_pure_preprompt`C%F{cyan}${arrows}%f\e8"
}
} &!
# 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=''
# disable auth prompting on git 2.3+
export GIT_TERMINAL_PROMPT=0
prompt_opts=(cr subst percent)
setopt PROMPTSUBST
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
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' use-simple true
zstyle ':vcs_info:git*' formats ' %b'
zstyle ':vcs_info:git*' actionformats ' %b|%a'
# show username@host if logged in through SSH
[[ "$SSH_CONNECTION" != '' ]] && prompt_pure_username=' %n@%m'
# show username@host if root, with username in white
[[ $UID -eq 0 ]] && prompt_pure_username=' %F{white}%n%F{242}@%m'
# prompt turns red if the previous command didn't exit with 0
N_MODE=" --NORMAL--"
I_MODE=""
PROMPT='%(?.%F{green}.%F{red}%F{green}) %f'
}
prompt_pure_setup "$@"

View file

@ -1,133 +0,0 @@
# Based off Pure <https://github.com/sindresorhus/pure>
# 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() {
echo -n " "
local tmp=$1
local days=$(( tmp / 60 / 60 / 24 ))
local hours=$(( tmp / 60 / 60 % 24 ))
local minutes=$(( tmp / 60 % 60 ))
local seconds=$(( tmp % 60 ))
(( $days > 0 )) && echo -n "${days}d "
(( $hours > 0 )) && echo -n "${hours}h "
(( $minutes > 0 )) && echo -n "${minutes}m "
echo "${seconds}s"
}
# fastest possible way to check if repo is dirty
prompt_pure_git_dirty() {
# check if we're in a git repo
[[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] || return
# check if it's dirty
[[ "$PURE_GIT_UNTRACKED_DIRTY" == 0 ]] && local umode="-uno" || local umode="-unormal"
command test -n "$(git status --porcelain --ignore-submodules ${umode})"
(($? == 0)) && echo '*'
}
# displays the exec time of the last command if set threshold was exceeded
prompt_pure_cmd_exec_time() {
local stop=$EPOCHSECONDS
local start=${cmd_timestamp:-$stop}
integer elapsed=$stop-$start
(($elapsed > ${PURE_CMD_MAX_EXEC_TIME:=5})) && prompt_pure_human_time $elapsed
}
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"
}
# string length ignoring ansi escapes
prompt_pure_string_length() {
# Subtract one since newline is counted as two characters
echo $(( ${#${(S%%)1//(\%([KF1]|)\{*\}|\%[Bbkf])}} - 1 ))
}
prompt_pure_precmd() {
# shows the full path in the title
print -Pn '\e]0;%~\a'
# git info
vcs_info
local prompt_pure_preprompt="%F{blue}%~%F{242}$vcs_info_msg_0_`prompt_pure_git_dirty`$prompt_pure_username%f%F{yellow}`prompt_pure_cmd_exec_time`%f"
# print -P $prompt_pure_preprompt
RPROMPT=$prompt_pure_preprompt
# check async if there is anything to pull
(( ${PURE_GIT_PULL:-1} )) && {
# check if we're in a git repo
[[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]] &&
# make sure working tree is not $HOME
[[ "$(command git rev-parse --show-toplevel)" != "$HOME" ]] &&
# check check if there is anything to pull
command git -c gc.auto=0 fetch &>/dev/null &&
# check if there is an upstream configured for this branch
command git rev-parse --abbrev-ref @'{u}' &>/dev/null && {
local arrows=''
(( $(command git rev-list --right-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows='⇣'
(( $(command git rev-list --left-only --count HEAD...@'{u}' 2>/dev/null) > 0 )) && arrows+='⇡'
RPROMPT+="\e7\e[A\e[1G\e[`prompt_pure_string_length $prompt_pure_preprompt`C%F{cyan}${arrows}%f\e8"
}
} &!
# 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=''
# disable auth prompting on git 2.3+
export GIT_TERMINAL_PROMPT=0
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
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' use-simple true
zstyle ':vcs_info:git*' formats ' %b'
zstyle ':vcs_info:git*' actionformats ' %b|%a'
# show username@host if logged in through SSH
[[ "$SSH_CONNECTION" != '' ]] && prompt_pure_username=' %n@%m'
# show username@host if root, with username in white
[[ $UID -eq 0 ]] && prompt_pure_username=' %F{white}%n%F{242}@%m'
zstyle ':prezto:module:editor:info:keymap:primary' format "%f"
zstyle ':prezto:module:editor:info:keymap:alternate' format "#%f"
# prompt turns red if the previous command didn't exit with 0
PROMPT='
%(?.%F{green}.%F{red}%F{green})${editor_info[keymap]} '
}
prompt_pure_setup "$@"

View file

@ -1,61 +0,0 @@
#
# A simple theme based off sorin
#
# Load dependencies.
pmodload 'helper'
# Show the hostname if this is an SSH session
if [ ! -z "$SSH_CLIENT" ]; then
__prompt_host="%B%F{blue}[$(hostname | sed -e 's/\.local$//')]%f%b "
fi
function _prompt_pwd {
local pwd="${PWD/#$HOME/~}"
if [[ "$pwd" == (#m)[/~] ]]; then
__prompt_pwd="$MATCH"
unset MATCH
else
__prompt_pwd="${${${(@j:/:M)${(@s:/:)pwd}##.#?}:h}%/}/${pwd:t}"
fi
}
# Why not use prezto's git module? Because git-info seems like overkill.
function _prompt_git {
__prompt_git=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [[ -n "$__prompt_git" ]]; then
__prompt_git=" :%F{yellow}$__prompt_git"
if ! git -c diff.autorefreshindex=true diff --quiet -- .; then
__prompt_git+="%F{white}+"
fi
fi
}
function prompt_v0_setup {
setopt LOCAL_OPTIONS
unsetopt XTRACE KSH_ARRAYS
prompt_opts=(cr percent subst)
# Load required functions.
autoload -Uz add-zsh-hook
# Add hook for calling git-info before each command.
add-zsh-hook precmd _prompt_git
add-zsh-hook precmd _prompt_pwd
# Set editor-info parameters.
zstyle ':prezto:module:editor:info:completing' format '%B%F{red}...%f%b'
zstyle ':prezto:module:editor:info:keymap:primary' format '%B%F{red}%f%b'
zstyle ':prezto:module:editor:info:keymap:primary:overwrite' format '%F{red}♺%f'
zstyle ':prezto:module:editor:info:keymap:alternate' format '%B%F{green}%f%b'
# Add newline before prompt
precmd() { print "" }
# Define prompts.
PROMPT='${__prompt_host}%F{cyan}${__prompt_pwd} ${editor_info[keymap]} '
RPROMPT='%F{yellow}${__prompt_git:- }'
}
prompt_v0_setup "$@"

1
zsh/zgen Submodule

@ -0,0 +1 @@
Subproject commit 5517f92ae5658d05c555225490cc4bede12db00b

42
zshrc
View file

@ -1,20 +1,38 @@
# Source Prezto.
if [[ -s "${ZDOTDIR:-$HOME}/.zprezto/init.zsh" ]]; then
source ~/.zsh/preztorc
source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"
else
echo "Prezto isn't installed! Run ~/.dotfiles/install.sh"
exit 1
fi
source ~/.zsh/aliases
function is-callable {
(( $+commands[$1] )) || (( $+functions[$1] )) || (( $+aliases[$1] ))
}
# Source component rcfiles
if [[ -z "$EMACS" ]]; then
source ~/.zsh/config
is-callable 'fasd' && eval "$(fasd --init auto)"
source ~/.zsh/zgen/zgen.zsh
if ! zgen saved; then
echo "Creating zgen save"
zgen load zsh-users/zsh-syntax-highlighting
zgen load zsh-users/zsh-history-substring-search
zgen load zsh-users/zsh-completions src
zgen load clvv/fasd
zgen load hchbaw/opp.zsh
zgen load Tarrasch/zsh-bd
zgen load houjunchen/zsh-vim-mode
zgen save
fi
source ~/.zsh/aliases.zsh
source ~/.zsh/config.zsh
source ~/.zsh/keybinds.zsh
source ~/.zsh/prompt.zsh
fasd_cache="$HOME/.fasd-cache"
if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install >| "$fasd_cache"
fi
source "$fasd_cache"
unset fasd_cache
fi
## PATHS ###############################################
if [ -d ~/.rbenv ]; then
export PATH=~/.rbenv/bin:$PATH
eval "$(rbenv init - --no-rehash)"