initial commit

This commit is contained in:
Matt Hamilton 2015-12-15 00:12:17 -05:00
commit 3a62391e0e
39 changed files with 1552 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.swp
*.zwc

9
.gitmodules vendored Normal file
View File

@ -0,0 +1,9 @@
[submodule "modules/history-substring-search/external"]
path = modules/history-substring-search/external
url = git@github.com:zsh-users/zsh-history-substring-search.git
[submodule "modules/completion/external"]
path = modules/completion/external
url = git@github.com:zsh-users/zsh-completions.git
[submodule "modules/syntax-highlighting/external"]
path = modules/syntax-highlighting/external
url = git@github.com:zsh-users/zsh-syntax-highlighting.git

57
README.md Normal file
View File

@ -0,0 +1,57 @@
ZIM - Zsh IMproved
==================
Moving to Zsh because you heard it was cool? Tried other frameworks but found them slow?
Want something that works without spending hours configuring sane settings? Want to be the conqueror of shells?
Meet Zim.
What is Zim?
------------
Zim is a Zsh configuration fromework that prides itself on speed and modularity.
Zim is very easy to customize and add your own functionality. But worry not! You don't *have* to if that's not your cup of tea!
Zim comes with a rich set of default modules and features without comprimising on speed or functionality!
What does Zim offer?
-----------------
If you're here, it means you want to see the cool shit Zim has to offer.
#### Themes
> Images of cascading themes
#### Fish-shell History Navigation
> GIF OF history-substring-search
#### Syntax Highlighting
> GIF of syntax highlighting
#### Speed
> possible side-by-side comparison of oh-my-zsh/zprezto/zim
#### And much more!
Zim has many modules! Enable as many or as few as you'd like.
Installation
------------
Installing Zim is easy. If you have a different shell framework installed (like oh-my-zsh or prezto),
uninstall those first to prevent conflicts.
1. In Zsh, clone the repository:
```
git clone --recursive https://github.com/Eriner/zim.git ${ZDOTDIR:-$HOME}/.zim
```
2. Copy the template configuration files (or append to existing configs):
```
setopt EXTENDED_GLOB
for template_file ( ${ZDOTDIR:-$HOME}/.zim/templates/* ); do
cat ${template_file} | tee -a ${ZDOTDIR:-$HOME}/.$(basename ${template_file}) > /dev/null
done
```
3. Set Zsh as the default shell:
```
chsh -s $(which zsh)
```
4. Open a new terminal and admire your work!

47
init.zsh Executable file
View File

@ -0,0 +1,47 @@
#
# Zim initializition
#
# Define zim location
ZIM="${ZDOTDIR:-$HOME}/.zim"
# Source user configuration
if [[ -s "${ZDOTDIR:-$HOME}/.zimrc" ]]; then
source "${ZDOTDIR:-$HOME}/.zimrc"
fi
load_zim_module() {
local wanted_module
for wanted_module ($zmodules); do
if [[ -s "${ZIM}/modules/$wanted_module/init.zsh" ]]; then
source "${ZIM}/modules/$wanted_module/init.zsh"
elif [[ ! -d "${ZIM}/modules/$wanted_module" ]]; then
print "No such module \"$wanted_module\"." >&2
fi
done
}
load_zim_function() {
local function_glob='^([_.]*|prompt_*_setup|README*)(-.N:t)'
local mod_function
# autoload searches fpath for function locations; add enabled module function paths
fpath+=(${argv:+${ZIM}/modules/${^zmodules}/functions(/FN)})
function {
setopt LOCAL_OPTIONS EXTENDED_GLOB
for mod_function in ${ZIM}/modules/${^zmodules}/functions/$~function_glob; do
autoload -Uz ${mod_function}
done
}
}
# Load zim functions
load_zim_function ${zmodules[@]}
# Load zim modules
load_zim_module ${zmodules[@]}
unset zmodules

@ -0,0 +1 @@
Subproject commit c2dde89fb34e2734106e50689bf4127f6b0a288d

108
modules/completion/init.zsh Normal file
View File

@ -0,0 +1,108 @@
#
# Completion enhancements
#
#
# initialization
#
# if it's a dumb terminal, return.
if [[ ${TERM} == 'dumb' ]]; then
return 1
fi
# add the completions to the fpath
fpath+=(${0:h}/external/src)
# load and initialize the completion system
autoload -Uz compinit && compinit -C -d ${ZDOTDIR:-$HOME}/.zcompdump
{
# zcomple the .zcompdump in the background
local zcompdump=${ZDOTDIR:-$HOME}/.zcompdump
if [[ -s ${zcompdump} && ( ! -s ${zcompdump}.zwc || ${zcompdump} -nt ${zcompdump}.zwc) ]]; then
zcompile ${zcompdump}
fi
unset zcompdump
} &!
#
# zsh options
#
# If a completion is performed with the cursor within a word, and a full completion is inserted,
# the cursor is moved to the end of the word
setopt ALWAYS_TO_END
# Automatically use menu completion after the second consecutive request for completion
setopt AUTO_MENU
# Automatically list choices on an ambiguous completion.
setopt AUTO_LIST
# Perform a path search even on command names with slashes in them.
setopt PATH_DIRS
# Make globbing (filename generation) sensitive to case.
unsetopt CASE_GLOB
# On an ambiguous completion, instead of listing possibilities or beeping, insert the first match immediately.
# Then when completion is requested again, remove the first match and insert the second match, etc.
unsetopt MENU_COMPLETE
#
# completion module options
#
# 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
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
# 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' 'expand'
zstyle ':completion:*' squeeze-slashes true
# enable caching
zstyle ':completion::complete:*' use-cache on
zstyle ':completion::complete:*' cache-path "${ZDOTDIR:-$HOME}/.zcompcache"
# ignore useless commands and functions
zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec)|prompt_*)'
# completion sorting
zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
# Man
zstyle ':completion:*:manuals' separate-sections true
zstyle ':completion:*:manuals.(^1*)' insert-sections 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
# ignore multiple entries.
zstyle ':completion:*:(rm|kill|diff):*' ignore-line other
zstyle ':completion:*:rm:*' file-patterns '*:all-files'
# smart editor completion
zstyle ':completion:*:(nano|vim|nvim|vi|emacs|e):*' ignored-patterns '*.(wav|mp3|flac|ogg|mp4|avi|mkv|webm|iso|dmg|so|o|a|bin|exe|dll|pcap|7z|zip|tar|gz|bz2|rar|deb|pkg|gzip|pdf|mobi|epub|png|jpeg|jpg|gif)'

View File

@ -0,0 +1,38 @@
#
# Directory navigation options
#
#
# Navigation
#
# If a command is issued that cant be executed as a normal command,
# and the command is the name of a directory, perform the cd command to that directory.
setopt AUTO_CD
# Make cd push the old directory onto the directory stack.
setopt AUTO_PUSHD
# Dont push multiple copies of the same directory onto the directory stack.
setopt PUSHD_IGNORE_DUPS
# Do not print the directory stack after pushd or popd.
setopt PUSHD_SILENT
# Have pushd with no arguments act like pushd $HOME.
setopt PUSHD_TO_HOME
#
# Globbing and fds
#
# Treat the #, ~ and ^ characters as part of patterns for filename generation, etc.
# (An initial unquoted ~ always produces named directory expansion.)
setopt EXTENDED_GLOB
# Perform implicit tees or cats when multiple redirections are attempted.
setopt MULTIOS
# Allows > redirection to truncate existing files. Otherwise >! or >| must be used to truncate a file.
# If the option is not set, and the option APPEND_CREATE is also not set, >>! or >>| must be used to create a file.
unsetopt CLOBBER

View File

@ -0,0 +1,28 @@
#
# generic options and environment settings
#
# use smart URL pasting and escaping
autoload -Uz url-quote-magic bracketed-paste-magic
zle -N self-insert url-quote-magic
zle -N bracketed-paste bracketed-paste-magic
# Treat single word simple commands without redirection as candidates for resumption of an existing job.
setopt AUTO_RESUME
# List jobs in the long format by default.
setopt LONG_LIST_JOBS
# Report the status of background jobs immediately, rather than waiting until just before printing a prompt.
setopt NOTIFY
# Run all background jobs at a lower priority. This option is set by default.
unsetopt BG_NICE
# Send the HUP signal to running jobs when the shell exits.<Paste>
unsetopt HUP
# Report the status of background and suspended jobs before exiting a shell with job control;
# a second attempt to exit the shell will succeed.
# NO_CHECK_JOBS is best used only in combination with NO_HUP, else such jobs will be killed automatically
unsetopt CHECK_JOBS

184
modules/git/alias.zsh Normal file
View File

@ -0,0 +1,184 @@
#
# Git aliases.
#
#
# Settings
#
# Log
_git_log_medium_format='%C(bold)Commit:%C(reset) %C(green)%H%C(red)%d%n%C(bold)Author:%C(reset) %C(cyan)%an <%ae>%n%C(bold)Date:%C(reset) %C(blue)%ai (%ar)%C(reset)%n%+B'
_git_log_oneline_format='%C(green)%h%C(reset) %s%C(red)%d%C(reset)%n'
_git_log_brief_format='%C(green)%h%C(reset) %s%n%C(blue)(%ar by %an)%C(red)%d%C(reset)%n'
#
# Aliases
#
# Git
alias g='git'
# Branch (b)
alias gb='git branch'
alias gbc='git checkout -b'
alias gbl='git branch -v'
alias gbL='git branch -av'
alias gbx='git branch -d'
alias gbX='git branch -D'
alias gbm='git branch -m'
alias gbM='git branch -M'
alias gbs='git show-branch'
alias gbS='git show-branch -a'
# Commit (c)
alias gc='git commit --verbose'
alias gca='git commit --verbose --all'
alias gcm='git commit --message'
alias gco='git checkout'
alias gcO='git checkout --patch'
alias gcf='git commit --amend --reuse-message HEAD'
alias gcF='git commit --verbose --amend'
alias gcp='git cherry-pick --ff'
alias gcP='git cherry-pick --no-commit'
alias gcr='git revert'
alias gcR='git reset "HEAD^"'
alias gcs='git show'
alias gcl='git-commit-lost'
alias gcS='git commit -S'
alias gpS='git show --pretty=short --show-signature'
# Conflict (C)
alias gCl='git status | sed -n "s/^.*both [a-z]*ed: *//p"'
alias gCa='git add $(gCl)'
alias gCe='git mergetool $(gCl)'
alias gCo='git checkout --ours --'
alias gCO='gCo $(gCl)'
alias gCt='git checkout --theirs --'
alias gCT='gCt $(gCl)'
# Data (d)
alias gd='git ls-files'
alias gdc='git ls-files --cached'
alias gdx='git ls-files --deleted'
alias gdm='git ls-files --modified'
alias gdu='git ls-files --other --exclude-standard'
alias gdk='git ls-files --killed'
alias gdi='git status --porcelain --short --ignored | sed -n "s/^!! //p"'
# Fetch (f)
alias gf='git fetch'
alias gfc='git clone'
alias gfm='git pull'
alias gfr='git pull --rebase'
alias gfu='git remote update -p; git merge --ff-only @\{u\}'
# Grep (g)
alias gg='git grep'
alias ggi='git grep --ignore-case'
alias ggl='git grep --files-with-matches'
alias ggL='git grep --files-without-matches'
alias ggv='git grep --invert-match'
alias ggw='git grep --word-regexp'
# Index (i)
alias gia='git add'
alias giA='git add --patch'
alias giu='git add --update'
alias gid='git diff --no-ext-diff --cached'
alias giD='git diff --no-ext-diff --cached --word-diff'
alias gir='git reset'
alias giR='git reset --patch'
alias gix='git rm -r --cached'
alias giX='git rm -rf --cached'
# Log (l)
alias gl='git log --topo-order --pretty=format:"${_git_log_medium_format}"'
alias gls='git log --topo-order --stat --pretty=format:"${_git_log_medium_format}"'
alias gld='git log --topo-order --stat --patch --full-diff --pretty=format:"${_git_log_medium_format}"'
alias glo='git log --topo-order --pretty=format:"${_git_log_oneline_format}"'
alias glg='git log --topo-order --all --graph --pretty=format:"${_git_log_oneline_format}"'
alias glb='git log --topo-order --pretty=format:"${_git_log_brief_format}"'
alias glc='git shortlog --summary --numbered'
alias glS='git log --show-signature'
# Merge (m)
alias gm='git merge'
alias gmC='git merge --no-commit'
alias gmF='git merge --no-ff'
alias gma='git merge --abort'
alias gmt='git mergetool'
# Push (p)
alias gp='git push'
alias gpf='git push --force'
alias gpa='git push --all'
alias gpA='git push --all && git push --tags'
alias gpt='git push --tags'
alias gpc='git push --set-upstream origin "$(git-branch-current 2> /dev/null)"'
alias gpp='git pull origin "$(git-branch-current 2> /dev/null)" && git push origin "$(git-branch-current 2> /dev/null)"'
# Rebase (r)
alias gr='git rebase'
alias gra='git rebase --abort'
alias grr='git rebase --continue'
alias gri='git rebase --interactive'
alias grs='git rebase --skip'
# Remote (R)
alias gR='git remote'
alias gRl='git remote --verbose'
alias gRa='git remote add'
alias gRx='git remote rm'
alias gRm='git remote rename'
alias gRu='git remote update'
alias gRp='git remote prune'
alias gRs='git remote show'
alias gRb='git-hub-browse'
# Stash (s)
alias gs='git stash'
alias gsa='git stash apply'
alias gsx='git stash drop'
alias gsX='git-stash-clear-interactive'
alias gsl='git stash list'
alias gsL='git-stash-dropped'
alias gsd='git stash show --patch --stat'
alias gsp='git stash pop'
alias gsr='git-stash-recover'
alias gss='git stash save --include-untracked'
alias gsS='git stash save --patch --no-keep-index'
alias gsw='git stash save --include-untracked --keep-index'
# Submodule (S)
alias gS='git submodule'
alias gSa='git submodule add'
alias gSf='git submodule foreach'
alias gSi='git submodule init'
alias gSI='git submodule update --init --recursive'
alias gSl='git submodule status'
alias gSm='git-submodule-move'
alias gSs='git submodule sync'
alias gSu='git submodule foreach git pull origin master'
alias gSx='git-submodule-remove'
# Tag (t)
alias gts='git tag -s'
alias gtv='git verify-tag'
# Working Copy (w)
alias gws='git status --short'
alias gwS='git status'
alias gwd='git diff --no-ext-diff'
alias gwD='git diff --no-ext-diff --word-diff'
alias gwr='git reset --soft'
alias gwR='git reset --hard'
alias gwc='git clean -n'
alias gwC='git clean -df'
alias gwx='git rm -r'
alias gwX='git rm -rf'
# Misc
alias g..='cd $(git-root || echo ".")'
# Cleanup
unset _git_log{,}

View File

@ -0,0 +1,20 @@
#
# Displays the current Git branch.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! git rev-parse 2> /dev/null; then
print "$0: not a repository: $PWD" >&2
return 1
fi
local ref="$(git symbolic-ref HEAD 2> /dev/null)"
if [[ -n "$ref" ]]; then
print "${ref#refs/heads/}"
return 0
else
return 1
fi

View File

@ -0,0 +1,20 @@
#
# Lists lost Git commits.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
fi
git fsck 2> /dev/null \
| grep "^dangling commit" \
| awk '{print $3}' \
| git log \
--date-order \
--no-walk \
--stdin \
--pretty=format:${_git_log_oneline_format}

View File

@ -0,0 +1,16 @@
#
# Displays the path to the Git directory.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
local git_dir="${$(git rev-parse --git-dir):A}"
if [[ -n "$git_dir" ]]; then
print "$git_dir"
return 0
else
print "$0: not a repository: $PWD" >&2
return 1
fi

View File

@ -0,0 +1,58 @@
#
# Opens a GitHub repository in the default browser.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
fi
local remotes remote references reference file url
remote="${1:-origin}"
remotes=($(git config --get-regexp 'remote.*.url' | cut -d. -f2))
if (( $remotes[(i)$remote] == $#remotes + 1 )); then
print "$0: remote not found: $remote" >&2
return 1
fi
url=$(
git config --get "remote.${remote}.url" \
| sed -En "s/(git|https?)(@|:\/\/)github.com(:|\/)(.+)\/(.+).git/https:\/\/github.com\/\4\/\5/p"
)
reference="${${2:-$(git-branch-current)}:-HEAD}"
references=(
HEAD
${$(git ls-remote --heads --tags "$remote" | awk '{print $2}')##refs/(heads|tags)/}
)
if (( $references[(i)$reference] == $#references + 1 )); then
print "$0: branch or tag not found: $reference" >&2
return 1
fi
if [[ "$reference" == 'HEAD' ]]; then
reference="$(git rev-parse HEAD 2>/dev/null)"
fi
file="$3"
if [[ -n "$url" ]]; then
url="${url}/tree/${reference}/${file}"
if (( $+commands[$BROWSER] )); then
"$BROWSER" "$url"
return 0
else
print "$0: browser not set or set to a non-existent browser" >&2
return 1
fi
else
print "$0: not a Git repository or remote not set" >&2
return 1
fi

View File

@ -0,0 +1,22 @@
#
# Shortens GitHub URLs.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
local url="$1"
if [[ "$url" == '-' ]]; then
read url <&0
fi
if [[ -z "$url" ]]; then
print "usage: $0 [ url | - ]" >&2
fi
if (( $+commands[curl] )); then
curl -s -i 'http://git.io' -F "url=$url" | sed -n 's/^Location: //p'
else
print "$0: command not found: curl" >&2
fi

View File

@ -0,0 +1,17 @@
#
# Adds files passed as parameters to .gitignore in project root
#
# Authors:
# Matt Hamilton <m@tthamilton.com>
#
# make sure we have a git-root
if ! git-root &> /dev/null; then
print 'not in a git repository' >&2
return 1
fi
# we are in a git repository. add parameters to .gitignore
for file in "$@"; do
print "$file" >>! $(git-root)/.gitignore
done

View File

@ -0,0 +1,16 @@
#
# Displays the path to the working tree root.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
local root="$(git rev-parse --show-toplevel 2> /dev/null)"
if [[ -n "$root" ]]; then
print "$root"
return 0
else
print "$0: not a repository work tree: $PWD" >&2
return 1
fi

View File

@ -0,0 +1,22 @@
#
# Asks for confirmation before clearing the Git stash.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
fi
local stashed
if [[ -f "$(git-dir)/refs/stash" ]]; then
stashed="$(git stash list 2> /dev/null | wc -l | awk '{print $1}')"
if (( $stashed > 0 )); then
if read -q "?Clear $stashed stashed state(s) [y/N]? "; then
git stash clear
fi
fi
fi

View File

@ -0,0 +1,22 @@
#
# Lists dropped Git stashed states.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
fi
git fsck --unreachable 2> /dev/null \
| grep 'commit' \
| awk '{print $3}' \
| git log \
--pretty=format:${_git_log_oneline_format} \
--extended-regexp \
--grep="${1:-(WIP )?[Oo]n [^:]+:}" \
--merges \
--no-walk \
--stdin

View File

@ -0,0 +1,18 @@
#
# Recovers dropped Git stashed states.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
fi
local commit
for commit in "$@"; do
git update-ref \
-m "$(git log -1 --pretty="format:%s" "$commit")" refs/stash "$commit"
done

View File

@ -0,0 +1,32 @@
#
# Moves a Git submodule.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
elif [[ "$PWD" != "$(git-root)" ]]; then
print "$0: must be run from the root of the work tree" >&2
return 1
fi
local src="$1"
local dst="$2"
local url
url="$(git config --file "$(git-root)/.gitmodules" --get "submodule.${src}.url")"
if [[ -z "$url" ]]; then
print "$0: submodule not found: $src" >&2
return 1
fi
mkdir -p "${dst:h}"
git-submodule-remove "$src"
git submodule add "$url" "$dst"
return 0

View File

@ -0,0 +1,27 @@
#
# Removes a Git submodule.
#
# Authors:
# Sorin Ionescu <sorin.ionescu@gmail.com>
#
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
print "$0: not a repository work tree: $PWD" >&2
return 1
elif [[ "$PWD" != "$(git-root)" ]]; then
print "$0: must be run from the root of the work tree" >&2
return 1
elif ! git config --file .gitmodules --get "submodule.${1}.path" &>/dev/null; then
print "$0: submodule not found: $1" >&2
return 1
fi
git config --file "$(git-dir)/config" --remove-section "submodule.${1}" &>/dev/null
git config --file "$(git-root)/.gitmodules" --remove-section "submodule.${1}" &>/dev/null
git add .gitmodules
git rm --cached -rf "${1}"
rm -rf "${1}"
rm -rf "$(git-dir)/modules/${1}"
return 0

9
modules/git/init.zsh Normal file
View File

@ -0,0 +1,9 @@
#
# git aliases and functions
#
if (( ! $+commands[git] )); then
return 1
fi
source "${0:h}/alias.zsh"

@ -0,0 +1 @@
Subproject commit 2f8a5f8fe33d2f6165ac23336ed074296d65dec9

View File

@ -0,0 +1,20 @@
#
# enables searching history with substrings
#
# source script
source ${0:h}/external/zsh-history-substring-search.zsh || return 1
# set options
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND='bg=magenta,fg=white,bold'
HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND='bg=red,fg=white,bold'
HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'
# bind UP and DOWN 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)
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

46
modules/history/init.zsh Normal file
View File

@ -0,0 +1,46 @@
#
# Configures history options
#
# sets the location of the history file
HISTFILE="${ZDOTDIR:-$HOME}/.zhistory"
# limit of history entries
HISTSIZE=10000
SAVEHIST=10000
# Perform textual history expansion, csh-style, treating the character ! specially.
setopt BANG_HIST
# Save each commands beginning timestamp (in seconds since the epoch) and the duration (in seconds) to the history file.
# : <beginning time>:<elapsed seconds>;<command>.
setopt EXTENDED_HISTORY
# This options works like APPEND_HISTORY except that new history lines are added to the $HISTFILE incrementally
# (as soon as they are entered), rather than waiting until the shell exits.
setopt INC_APPEND_HISTORY
# Shares history across all sessions rather than waiting for a new shell invocation to read the history file.
setopt SHARE_HISTORY
# Do not enter command lines into the history list if they are duplicates of the previous event.
setopt HIST_IGNORE_DUPS
# If a new command line being added to the history list duplicates an older one,
# the older command is removed from the list (even if it is not the previous event).
setopt HIST_IGNORE_ALL_DUPS
# Remove command lines from the history list when the first character on the line is a space,
# or when one of the expanded aliases contains a leading space.
setopt HIST_IGNORE_SPACE
# When writing out the history file, older commands that duplicate newer ones are omitted.
setopt HIST_SAVE_NO_DUPS
# Whenever the user enters a line with history expansion, dont execute the line directly;
# instead, perform history expansion and reload the line into the editing buffer.
setopt HIST_VERIFY
# Lists the ten most used commands.
alias history-stat="history 0 | awk '{print \$2}' | sort | uniq -c | sort -n -r | head"

81
modules/pacman/alias.zsh Normal file
View File

@ -0,0 +1,81 @@
#
# Pacman aliases
#
# ${zpacman_frontend} is provided by either .zimrc or (if not set) init.zsh
# The zpacman_frontend is _only_ used for package installs.
#
# General
#
alias pacman=${zpacman_frontend}
alias pac=${zpacman_frontend}
#
# Build
#
# build package in current directory, cleanup, and install
alias pacb='makepkg -sci'
#
# Install
#
#NOTE: Installing/upgrading individual packages is NOT supported. Sync and upgrade ALL on install.
# install, sync, and upgrade packages
alias paci='sudo ${zpacman_frontend} -Syu'
# install, sync, and upgrade packages (forcibly refresh package lists)
alias pacu='sudo ${zpacman_frontend} -Syyu'
# install packages by filename
alias pacU='sudo ${zpacman_frontend} -U'
# install all packages in current directory
alias pacd='sudo ${zpacman_frontend} -U *.pkg.tar.xz'
#
# Remove
#
# remove package and unneeded dependencies
alias pacr='sudo pacman -R'
# remove package, unneeded dependencies, and configuration files
alias pacrm='sudo pacman -Rns'
#
# Query
#
# query package information from the remote repository
alias pacq='pacman -Si'
# query package information from the local repository
alias pacQ='pacman -Qi'
#
# Search
#
# search for package in the remote repository
alias pacs='pacman -Ss'
# search for the package in the local repository
alias pacS='pacman -Qs'
#
# Orphans
#
# list orphan packages
alias pacol='pacman -Qdt'
# remove orphan packages
alias pacrl='sudo pacman -Rns $(pacman -Qtdq)'

View File

@ -0,0 +1,20 @@
#
# AUR aliases
#
# download and build AUR package
aurb() {
git clone https://aur.archlinux.org/$1.git && cd $1 && makepkg -sci
}
# only download aur package; do not build
aurd() {
git clone https://aur.archlinux.org/$1.git
}
# remove old package, rebuild, and install.
#NOTE: this is will remove any unstashed/uncommitted changes.
# due to how makepkg will update the PKGBUILD, a git pull alone will not suffice.
auru() {
git reset HEAD --hard && git pull && rm -f *.pkg.tar.xz || true && makepkg -sci
}

37
modules/pacman/init.zsh Normal file
View File

@ -0,0 +1,37 @@
#
# Pacman aliases and functions
#
# ensure pacman is available
if (( ! $+commands[pacman] )); then
return 1
fi
# find if there is a pacman wrapper available (and not set in .zimrc)
if [[ ${zpacman_frontend} == 'auto' ]]; then
# no frontend set in config; test for common frontends.
if (( $+commands[powerpill] )); then
zpacman_frontend='powerpill'
elif (( $+commands[pacmatic] )); then
zpacman_frontend='pacmatic'
else
zpacman_frontend='pacman'
fi
elif (( ! $+commands[${zpacman_frontend}] )); then
print "pacman frontend \"${zpacman_frontend}\" is invalid or not installed. Reverting to \"pacman\"." >&2
print "you can fix this error by editing the 'zpacman_frontend' variable in your .zimrc" >&2
zpacman_frontend='pacman'
fi
# source helper functions/aliases
for helper ( ${zpacman_helper[@]} ); do
if [[ -s ${0:h}/helper_${helper}.zsh ]]; then
source ${0:h}/helper_${helper}.zsh
else
print "no such helper script \"helper_${helper}.zsh\"" >&2
fi
done
# source pacman aliases
source ${0:h}/alias.zsh

View File

@ -0,0 +1,153 @@
# vim:ft=zsh ts=2 sw=2 sts=2
#
# agnoster's Theme - https://gist.github.com/3712874
# A Powerline-inspired theme for ZSH
#
# # README
#
# In order for this theme to render correctly, you will need a
# [Powerline-patched font](https://gist.github.com/1595572).
#
# In addition, I recommend the
# [Solarized theme](https://github.com/altercation/solarized/) and, if you're
# using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app -
# it has significantly better color fidelity.
#
# # Goals
#
# The aim of this theme is to only show you *relevant* information. Like most
# prompts, it will only show git information when in a git working directory.
# However, it goes a step further: everything from the current user and
# hostname to whether the last call exited with an error to whether background
# jobs are running in this shell will all be displayed automatically when
# appropriate.
### Segment drawing
# A few utility functions to make it easy and re-usable to draw segmented prompts
CURRENT_BG='NONE'
PRIMARY_FG=black
# Characters
SEGMENT_SEPARATOR="\ue0b0"
PLUSMINUS="\u00b1"
BRANCH="\ue0a0"
DETACHED="\u27a6"
CROSS="\u2718"
LIGHTNING="\u26a1"
GEAR="\u2699"
# Begin a segment
# Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground.
prompt_segment() {
local bg fg
[[ -n $1 ]] && bg="%K{$1}" || bg="%k"
[[ -n $2 ]] && fg="%F{$2}" || fg="%f"
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
print -n "%{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%}"
else
print -n "%{$bg%}%{$fg%}"
fi
CURRENT_BG=$1
[[ -n $3 ]] && print -n $3
}
# End the prompt, closing any open segments
prompt_end() {
if [[ -n $CURRENT_BG ]]; then
print -n "%{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR"
else
print -n "%{%k%}"
fi
print -n "%{%f%}"
CURRENT_BG=''
}
### Prompt components
# Each component will draw itself, and hide itself if no information needs to be shown
# Context: user@hostname (who am I and where am I)
prompt_context() {
local user=`whoami`
if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CONNECTION" ]]; then
prompt_segment $PRIMARY_FG default " %(!.%{%F{yellow}%}.)$user@%m "
fi
}
# Git: branch/detached head, dirty status
prompt_git() {
local color ref
is_dirty() {
test -n "$(git status --porcelain --ignore-submodules)"
}
ref="$vcs_info_msg_0_"
if [[ -n "$ref" ]]; then
if is_dirty; then
color=yellow
ref="${ref} $PLUSMINUS"
else
color=green
ref="${ref} "
fi
if [[ "${ref/.../}" == "$ref" ]]; then
ref="$BRANCH $ref"
else
ref="$DETACHED ${ref/.../}"
fi
prompt_segment $color $PRIMARY_FG
print -Pn " $ref"
fi
}
# Dir: current working directory
prompt_dir() {
prompt_segment cyan $PRIMARY_FG ' %~ '
}
# Status:
# - was there an error
# - am I root
# - are there background jobs?
prompt_status() {
local symbols
symbols=()
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}$CROSS"
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}$LIGHTNING"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$GEAR"
[[ -n "$symbols" ]] && prompt_segment $PRIMARY_FG default " $symbols "
}
## Main prompt
prompt_agnoster_main() {
RETVAL=$?
CURRENT_BG='NONE'
prompt_status
prompt_context
prompt_dir
prompt_git
prompt_end
}
prompt_agnoster_precmd() {
vcs_info
PROMPT='%{%f%b%k%}$(prompt_agnoster_main) '
}
prompt_agnoster_setup() {
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
prompt_opts=(cr subst percent)
add-zsh-hook precmd prompt_agnoster_precmd
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes false
zstyle ':vcs_info:git*' formats '%b'
zstyle ':vcs_info:git*' actionformats '%b (%a)'
}
prompt_agnoster_setup "$@"

8
modules/prompt/init.zsh Normal file
View File

@ -0,0 +1,8 @@
#
# load user-defined prompt
#
if [[ ! ${TERM} == (linux|*bsd*|dumb) ]] && [[ ${zprompt_theme} ]]; then
autoload -Uz promptinit && promptinit
prompt ${zprompt_theme}
fi

View File

@ -0,0 +1,153 @@
# vim:ft=zsh ts=2 sw=2 sts=2
#
# agnoster's Theme - https://gist.github.com/3712874
# A Powerline-inspired theme for ZSH
#
# # README
#
# In order for this theme to render correctly, you will need a
# [Powerline-patched font](https://gist.github.com/1595572).
#
# In addition, I recommend the
# [Solarized theme](https://github.com/altercation/solarized/) and, if you're
# using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app -
# it has significantly better color fidelity.
#
# # Goals
#
# The aim of this theme is to only show you *relevant* information. Like most
# prompts, it will only show git information when in a git working directory.
# However, it goes a step further: everything from the current user and
# hostname to whether the last call exited with an error to whether background
# jobs are running in this shell will all be displayed automatically when
# appropriate.
### Segment drawing
# A few utility functions to make it easy and re-usable to draw segmented prompts
CURRENT_BG='NONE'
PRIMARY_FG=black
# Characters
SEGMENT_SEPARATOR="\ue0b0"
PLUSMINUS="\u00b1"
BRANCH="\ue0a0"
DETACHED="\u27a6"
CROSS="\u2718"
LIGHTNING="\u26a1"
GEAR="\u2699"
# Begin a segment
# Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground.
prompt_segment() {
local bg fg
[[ -n $1 ]] && bg="%K{$1}" || bg="%k"
[[ -n $2 ]] && fg="%F{$2}" || fg="%f"
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
print -n "%{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%}"
else
print -n "%{$bg%}%{$fg%}"
fi
CURRENT_BG=$1
[[ -n $3 ]] && print -n $3
}
# End the prompt, closing any open segments
prompt_end() {
if [[ -n $CURRENT_BG ]]; then
print -n "%{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR"
else
print -n "%{%k%}"
fi
print -n "%{%f%}"
CURRENT_BG=''
}
### Prompt components
# Each component will draw itself, and hide itself if no information needs to be shown
# Context: user@hostname (who am I and where am I)
prompt_context() {
local user=`whoami`
if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CONNECTION" ]]; then
prompt_segment $PRIMARY_FG default " %(!.%{%F{yellow}%}.)$user@%m "
fi
}
# Git: branch/detached head, dirty status
prompt_git() {
local color ref
is_dirty() {
test -n "$(git status --porcelain --ignore-submodules)"
}
ref="$vcs_info_msg_0_"
if [[ -n "$ref" ]]; then
if is_dirty; then
color=yellow
ref="${ref} $PLUSMINUS"
else
color=green
ref="${ref} "
fi
if [[ "${ref/.../}" == "$ref" ]]; then
ref="$BRANCH $ref"
else
ref="$DETACHED ${ref/.../}"
fi
prompt_segment $color $PRIMARY_FG
print -Pn " $ref"
fi
}
# Dir: current working directory
prompt_dir() {
prompt_segment cyan $PRIMARY_FG ' %~ '
}
# Status:
# - was there an error
# - am I root
# - are there background jobs?
prompt_status() {
local symbols
symbols=()
[[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}$CROSS"
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}$LIGHTNING"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$GEAR"
[[ -n "$symbols" ]] && prompt_segment $PRIMARY_FG default " $symbols "
}
## Main prompt
prompt_agnoster_main() {
RETVAL=$?
CURRENT_BG='NONE'
prompt_status
prompt_context
prompt_dir
prompt_git
prompt_end
}
prompt_agnoster_precmd() {
vcs_info
PROMPT='%{%f%b%k%}$(prompt_agnoster_main) '
}
prompt_agnoster_setup() {
autoload -Uz add-zsh-hook
autoload -Uz vcs_info
prompt_opts=(cr subst percent)
add-zsh-hook precmd prompt_agnoster_precmd
zstyle ':vcs_info:*' enable git
zstyle ':vcs_info:*' check-for-changes false
zstyle ':vcs_info:git*' formats '%b'
zstyle ':vcs_info:git*' actionformats '%b (%a)'
}
prompt_agnoster_setup "$@"

65
modules/spectrum/init.zsh Normal file
View File

@ -0,0 +1,65 @@
#
# Provides for easier use of 256 colors and effects.
#
# Return if requirements are not found.
if [[ "$TERM" == 'dumb' ]]; then
return 1
fi
typeset -gA FX FG BG
FX=(
none "\e[00m"
normal "\e[22m"
bold "\e[01m" no-bold "\e[22m"
faint "\e[02m" no-faint "\e[22m"
standout "\e[03m" no-standout "\e[23m"
underline "\e[04m" no-underline "\e[24m"
blink "\e[05m" no-blink "\e[25m"
fast-blink "\e[06m" no-fast-blink "\e[25m"
reverse "\e[07m" no-reverse "\e[27m"
conceal "\e[08m" no-conceal "\e[28m"
strikethrough "\e[09m" no-strikethrough "\e[29m"
gothic "\e[20m" no-gothic "\e[22m"
double-underline "\e[21m" no-double-underline "\e[22m"
proportional "\e[26m" no-proportional "\e[50m"
overline "\e[53m" no-overline "\e[55m"
no-border "\e[54m"
border-rectangle "\e[51m" no-border-rectangle "\e[54m"
border-circle "\e[52m" no-border-circle "\e[54m"
no-ideogram-marking "\e[65m"
underline-or-right "\e[60m" no-underline-or-right "\e[65m"
double-underline-or-right "\e[61m" no-double-underline-or-right "\e[65m"
overline-or-left "\e[62m" no-overline-or-left "\e[65m"
double-overline-or-left "\e[63m" no-double-overline-or-left "\e[65m"
stress "\e[64m" no-stress "\e[65m"
font-default "\e[10m"
font-first "\e[11m" no-font-first "\e[10m"
font-second "\e[12m" no-font-second "\e[10m"
font-third "\e[13m" no-font-third "\e[10m"
font-fourth "\e[14m" no-font-fourth "\e[10m"
font-fifth "\e[15m" no-font-fifth "\e[10m"
font-sixth "\e[16m" no-font-sixth "\e[10m"
font-seventh "\e[17m" no-font-seventh "\e[10m"
font-eigth "\e[18m" no-font-eigth "\e[10m"
font-ninth "\e[19m" no-font-ninth "\e[10m"
)
FG[none]="$FX[none]"
BG[none]="$FX[none]"
colors=(black red green yellow blue magenta cyan white)
for color in {0..255}; do
if (( $color >= 0 )) && (( $color < $#colors )); then
index=$(( $color + 1 ))
FG[$colors[$index]]="\e[38;5;${color}m"
BG[$colors[$index]]="\e[48;5;${color}m"
fi
FG[$color]="\e[38;5;${color}m"
BG[$color]="\e[48;5;${color}m"
done
unset color{s,} index

38
modules/ssh/init.zsh Normal file
View File

@ -0,0 +1,38 @@
#
# sets up ssh-agent
#
# don't do anything unless we can actually use ssh-agent
if (( ! $+commands[ssh-agent] )); then
return 1
fi
local ssh_env=${TMPDIR:-/tmp}/ssh-agent.env
local ssh_sock=${TMPDIR:-/tmp}/ssh-agent.sock
# start ssh-agent if not already running
if [[ ! -S ${SSH_AUTH_SOCK} ]]; then
# read environment if possible
source ssh_env 2> /dev/null
if ! ps -U ${LOGNAME} -o pid,ucomm | grep -q -- "${SSH_AGENT_PID:--1} ssh-agent"; then
eval "$(ssh-agent | sed '/^echo /d' | tee ${ssh_env})"
fi
fi
# create socket
if [[ -S ${SSH_AUTH_SOCKET} && ${SSH_AUTH_SOCKET} != ${ssh_sock} ]]; then
ln -sf ${SSH_AUTH_SOCKET} ${ssh_sock}
export SSH_AUTH_SOCK=${ssh_sock}
fi
# load ids
if ssh-add -l 2>&1 | grep -q 'no identities'; then
if (( ${#zssh_ids} > 0 )); then
ssh-add "${HOME}/.ssh/${^zssh_ids[@]}" 2> /dev/null
else
ssh-add 2> /dev/null
fi
fi
unset ssh_{sock,env}

@ -0,0 +1 @@
Subproject commit 82f5eb17ecee1f18b3ce3d8a93761a51235cab78

View File

@ -0,0 +1,8 @@
#
# enables fish-shell like syntax highlighting
#
source "${0:h}/external/zsh-syntax-highlighting.zsh" || return 1
# highlighters
ZSH_HIGHLIGHT_HIGHLIGHTERS=(${zhighlighters[@]})

30
modules/utility/init.zsh Normal file
View File

@ -0,0 +1,30 @@
#
# utility functions and options
#
# general aliases
alias chmod='chmod --preserve-root -v'
alias chown='chown --preserve-root -v'
# ls colors
if [[ dircolors ]]; then
if [[ -s ${HOME}/.dir_colors ]]; then
eval "$(dircolors --sh ${HOME}/.dir_colors)"
else
eval "$(dircolors --sh)"
fi
alias ls='ls --group-directories-first --color=auto'
else
export LSCOLORS='exfxcxdxbxGxDxabagacad'
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'
alias ls='ls --group-directories-first -G'
fi
alias l='ls -lAh' # one column, all files, human-readable sizes
# resource usage
alias df='df -kh'
alias du='du -kh'

50
templates/zimrc Normal file
View File

@ -0,0 +1,50 @@
#################
# CORE SETTINGS #
#################
#
# Zim settings
#
# select what modules you would like enabled
zmodules=(completion directory environment git history ssh utility \
syntax-highlighting history-substring-search prompt)
###################
# MODULE SETTINGS #
###################
#
# Prompt
#
# set your desired prompt here
zprompt_theme='agnoster'
#
# zsh-syntax-highlighting
#
# this determines what highlighters will be used with the completion module
zhighlighters=(main brackets cursor)
#
# SSH
#
# load these ssh identities with the ssh module
zssh_ids=(id_rsa)
#
# Pacman
#
# set (optional) pacman front-end. If not set, zim will attempt to use powerpill or pacmatic if available
#zpacman_frontend='powerpill'
# load any helper scripts as difined here
#zpacman_helper=(aur)

59
templates/zlogin Normal file
View File

@ -0,0 +1,59 @@
#
# startup file read in interactive login shell
# not run again in subsuquent shells
#
# The following code helps us by optimizing the existing framework.
# This includes zcompile, zcompdump, etc. Options can be adjusted in .zimrc
#
# Function to determine the need of a zcompile. If the .zwc file
# does not exist, or the base file is newer, we need to compile.
local zcompare() {
if [[ -s ${1} && ( ! -s ${1}.zwc || ${1} -nt ${1}.zwc) ]]; then
# needs zcomplie
zcompile ${1}
return 0
else
# no need to zcompile
return 1
fi
}
# These jobs are asynchronous, and will not impact the interactive shell
{
# First, we will zcompile the completion cache, if it exists. Siginificant speedup.
zcompare ${ZDOTDIR:-$HOME}/.zcompdump
# Next, we should zcomplie the 'heavy' modules where possible.
# This includes syntax-highlighting and completion.
# Other modules may be added to this list at a later date.
function {
# use of anonymous function for setopt extended_glob
local zim=${ZDOTDIR:-$HOME}/.zim
setopt EXTENDED_GLOB
#
# syntax-highlighting zcompile
#
if [[ -d ${zim}/modules/syntax-highlighting/external/highlighters ]]; then
# compile the highlighters
for file in ${zim}/modules/syntax-highlighting/external/highlighters/**/*.zsh; do
zcompare ${file}
done
# compile the main file
zcompare ${zim}/modules/syntax-highlighting/external/zsh-syntax-highlighting.zsh
fi
#
# zsh-histery-substring-search zcompile
#
if [[ -s ${zim}/modules/zsh-history-substring-search/external/zsh-history-substring-search.zsh ]]; then
zcompare ${zim}/modules/zsh-history-substring-search/external/zsh-history-substring-search.zsh
fi
}
} &!
unfunction zcompare

9
templates/zshrc Normal file
View File

@ -0,0 +1,9 @@
#
# user configuration sourced by interactive shells
#
# Source zim
if [[ -s ${ZDOTDIR:-$HOME}/.zim/init.zsh ]]; then
source ${ZDOTDIR:-$HOME}/.zim/init.zsh
fi