diff options
Diffstat (limited to 'zsh')
-rw-r--r-- | zsh/completion/_tmux_pane_words | 10 | ||||
-rw-r--r-- | zsh/fasd.zsh | 85 | ||||
-rw-r--r-- | zsh/fasdrc | 9 | ||||
-rw-r--r-- | zsh/functions/fasd/fasd | 624 | ||||
-rw-r--r-- | zsh/functions/runit/_sv | 7 | ||||
-rw-r--r-- | zsh/functions/runit/getservicedir | 2 | ||||
-rw-r--r-- | zsh/functions/runit/linksv | 16 | ||||
-rw-r--r-- | zsh/functions/runit/renamesv | 36 | ||||
-rwxr-xr-x | zsh/zshrc | 367 | ||||
-rwxr-xr-x | zsh/zshrc_freebsd | 8 | ||||
-rw-r--r-- | zsh/zshrc_gentoo | 4 | ||||
-rw-r--r-- | zsh/zshrc_prefect | 8 | ||||
-rw-r--r-- | zsh/zshrc_server | 20 | ||||
-rw-r--r-- | zsh/zshrc_sheldon | 5 | ||||
-rw-r--r-- | zsh/zshrc_st | 2 |
15 files changed, 1203 insertions, 0 deletions
diff --git a/zsh/completion/_tmux_pane_words b/zsh/completion/_tmux_pane_words new file mode 100644 index 00000000..6ff9ce18 --- /dev/null +++ b/zsh/completion/_tmux_pane_words @@ -0,0 +1,10 @@ +local expl +local -a w + +if [[ -z "$TMUX_PANE" ]]; then + _message "not running inside tmux!" + return 1 +fi + +w=( ${(u)=$(tmux capture-pane \; show-buffer \; delete-buffer)} ) +_wanted values expl 'words from current tmux pane' compadd -a w diff --git a/zsh/fasd.zsh b/zsh/fasd.zsh new file mode 100644 index 00000000..64dbf7b0 --- /dev/null +++ b/zsh/fasd.zsh @@ -0,0 +1,85 @@ +alias a='fasd -a' +alias s='fasd -si' +alias sd='fasd -sid' +alias sf='fasd -sif' +alias d='fasd -d' +alias f='fasd -f' +# function to execute built-in cd +fasd_cd() { + if [ $# -le 1 ]; then + fasd "$@" + else + local _fasd_ret="$(fasd -e 'printf %s' "$@")" + [ -z "$_fasd_ret" ] && return + [ -d "$_fasd_ret" ] && cd "$_fasd_ret" || printf %s\n "$_fasd_ret" + fi +} +alias z='fasd_cd -d' +alias zz='fasd_cd -d -i' + +# add zsh hook +_fasd_preexec() { + { eval "fasd --proc $(fasd --sanitize $1)"; } >> "/dev/null" 2>&1 +} +autoload -Uz add-zsh-hook +add-zsh-hook preexec _fasd_preexec + +# zsh command mode completion +_fasd_zsh_cmd_complete() { + local compl + read -c compl + (( $+compstate )) && compstate[insert]=menu # no expand if compsys loaded + reply=(${(f)"$(fasd --complete "$compl")"}) +} + +# enbale command mode completion +compctl -U -K _fasd_zsh_cmd_complete -V fasd -x 'C[-1,-*e],s[-]n[1,e]' -c - \ + 'c[-1,-A][-1,-D]' -f -- fasd fasd_cd + +(( $+functions[compdef] )) && { + # zsh word mode completion + _fasd_zsh_word_complete() { + [ "$2" ] && local _fasd_cur="$2" + [ -z "$_fasd_cur" ] && local _fasd_cur="${words[CURRENT]}" + local fnd="${_fasd_cur//,/ }" + local typ=${1:-e} + fasd --query $typ "$fnd" 2>> "/dev/null" | \ + sort -nr | sed 's/^[^ ]*[ ]*//' | while read -r line; do + compadd -U -V fasd "$line" + done + compstate[insert]=menu # no expand + } + _fasd_zsh_word_complete_f() { _fasd_zsh_word_complete f ; } + _fasd_zsh_word_complete_d() { _fasd_zsh_word_complete d ; } + _fasd_zsh_word_complete_trigger() { + local _fasd_cur="${words[CURRENT]}" + eval $(fasd --word-complete-trigger _fasd_zsh_word_complete $_fasd_cur) + } + # define zle widgets + zle -C fasd-complete complete-word _generic + zstyle ':completion:fasd-complete:*' completer _fasd_zsh_word_complete + zstyle ':completion:fasd-complete:*' menu-select + + zle -C fasd-complete-f complete-word _generic + zstyle ':completion:fasd-complete-f:*' completer _fasd_zsh_word_complete_f + zstyle ':completion:fasd-complete-f:*' menu-select + + zle -C fasd-complete-d complete-word _generic + zstyle ':completion:fasd-complete-d:*' completer _fasd_zsh_word_complete_d + zstyle ':completion:fasd-complete-d:*' menu-select +} + +(( $+functions[compdef] )) && { + # enable word mode completion + orig_comp="$(zstyle -L ':completion:\*' completer 2>> "/dev/null")" + if [ "$orig_comp" ]; then + case $orig_comp in + *_fasd_zsh_word_complete_trigger*);; + *) eval "$orig_comp _fasd_zsh_word_complete_trigger";; + esac + else + zstyle ':completion:*' completer _complete _fasd_zsh_word_complete_trigger + fi + unset orig_comp +} + diff --git a/zsh/fasdrc b/zsh/fasdrc new file mode 100644 index 00000000..efe6e0a3 --- /dev/null +++ b/zsh/fasdrc @@ -0,0 +1,9 @@ +# -*- mode: sh; -*- +current () { + for path in *; do + printf "./%s|1\\n" "$path" + done +} + +# If you want to have this behavior for all fasd queries +_FASD_BACKENDS="native current" diff --git a/zsh/functions/fasd/fasd b/zsh/functions/fasd/fasd new file mode 100644 index 00000000..b1e64f41 --- /dev/null +++ b/zsh/functions/fasd/fasd @@ -0,0 +1,624 @@ +#!/usr/bin/env sh + +# Fasd (this file) can be sourced or executed by any POSIX compatible shell. + +# Fasd is originally written based on code from z (https://github.com/rupa/z) +# by rupa deadwyler under the WTFPL license. Most if not all of the code has +# been rewritten. + +# Copyright (C) 2011, 2012 by Wei Dai. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +fasd() { + + # make zsh do word splitting inside this function + [ "$ZSH_VERSION" ] && emulate sh && setopt localoptions + + case $1 in + --init) shift + while [ "$1" ]; do + case $1 in + env) + { # source rc files if present + [ -s "/etc/fasdrc" ] && . "/etc/fasdrc" + [ -s "$HOME/.fasdrc" ] && . "$HOME/.fasdrc" + + # set default options + [ -z "$_FASD_DATA" ] && _FASD_DATA="$HOME/.fasd" + [ -z "$_FASD_BLACKLIST" ] && _FASD_BLACKLIST="--help" + [ -z "$_FASD_SHIFT" ] && _FASD_SHIFT="sudo busybox" + [ -z "$_FASD_IGNORE" ] && _FASD_IGNORE="fasd ls echo" + [ -z "$_FASD_SINK" ] && _FASD_SINK=/dev/null + [ -z "$_FASD_TRACK_PWD" ] && _FASD_TRACK_PWD=1 + [ -z "$_FASD_MAX" ] && _FASD_MAX=2000 + [ -z "$_FASD_BACKENDS" ] && _FASD_BACKENDS=native + [ -z "$_FASD_FUZZY" ] && _FASD_FUZZY=2 + [ -z "$_FASD_VIMINFO" ] && _FASD_VIMINFO="$HOME/.viminfo" + [ -z "$_FASD_RECENTLY_USED_XBEL" ] && \ + _FASD_RECENTLY_USED_XBEL="$HOME/.local/share/recently-used.xbel" + + if [ -z "$_FASD_AWK" ]; then + # awk preferences + local awk; for awk in mawk gawk original-awk nawk awk; do + $awk "" && _FASD_AWK=$awk && break + done + fi + } >> "${_FASD_SINK:-/dev/null}" 2>&1 + ;; + + auto) cat <<EOS +{ if [ "\$ZSH_VERSION" ] && compctl; then # zsh + eval "\$(fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install \\ + zsh-wcomp zsh-wcomp-install)" + elif [ "\$BASH_VERSION" ] && complete; then # bash + eval "\$(fasd --init posix-alias bash-hook bash-ccomp bash-ccomp-install)" + else # posix shell + eval "\$(fasd --init posix-alias posix-hook)" + fi +} >> "$_FASD_SINK" 2>&1 + +EOS + ;; + + posix-alias) cat <<EOS +alias a='fasd -a' +alias s='fasd -si' +alias sd='fasd -sid' +alias sf='fasd -sif' +alias d='fasd -d' +alias f='fasd -f' +# function to execute built-in cd +fasd_cd() { + if [ \$# -le 1 ]; then + fasd "\$@" + else + local _fasd_ret="\$(fasd -e 'printf %s' "\$@")" + [ -z "\$_fasd_ret" ] && return + [ -d "\$_fasd_ret" ] && cd "\$_fasd_ret" || printf %s\\n "\$_fasd_ret" + fi +} +alias z='fasd_cd -d' +alias zz='fasd_cd -d -i' + +EOS + ;; + + tcsh-alias) cat <<EOS +;alias a 'fasd -a'; +alias s 'fasd -si'; +alias sd 'fasd -sid'; +alias sf 'fasd -sif'; +alias d 'fasd -d'; +alias f 'fasd -f'; +alias z 'cd "\`fasd -d -e printf\\ %s \\!*\`" >& /dev/null || fasd -d'; +EOS + ;; + + zsh-hook) cat <<EOS +# add zsh hook +_fasd_preexec() { + { eval "fasd --proc \$(fasd --sanitize \$1)"; } >> "$_FASD_SINK" 2>&1 +} +autoload -Uz add-zsh-hook +add-zsh-hook preexec _fasd_preexec + +EOS + ;; + + bash-hook) cat <<EOS +_fasd_prompt_func() { + eval "fasd --proc \$(fasd --sanitize \$(history 1 | \\ + sed "s/^[ ]*[0-9]*[ ]*//"))" >> "$_FASD_SINK" 2>&1 +} + +# add bash hook +case \$PROMPT_COMMAND in + *_fasd_prompt_func*) ;; + *) PROMPT_COMMAND="_fasd_prompt_func;\$PROMPT_COMMAND";; +esac + +EOS + ;; + + posix-hook) cat <<EOS +_fasd_ps1_func() { + { eval "fasd --proc \$(fasd --sanitize \$(fc -nl -1))"; } \\ + >> "$_FASD_SINK" 2>&1 +} +case \$PS1 in + *_fasd_ps1_func*) ;; + *) export PS1="\\\$(_fasd_ps1_func)\$PS1";; +esac + +EOS + ;; + + tcsh-hook) cat <<EOS +;alias fasd-prev-cmd 'fasd --sanitize \`history -h 1\`'; +set pprecmd="\`alias precmd\`"; +alias precmd '\$pprecmd; eval "fasd --proc \`fasd-prev-cmd\`" >& /dev/null'; +EOS + + ;; + + zsh-ccomp) cat <<EOS +# zsh command mode completion +_fasd_zsh_cmd_complete() { + local compl + read -c compl + (( \$+compstate )) && compstate[insert]=menu # no expand if compsys loaded + reply=(\${(f)"\$(fasd --complete "\$compl")"}) +} + +EOS + ;; + + zsh-wcomp) cat <<EOS +(( \$+functions[compdef] )) && { + # zsh word mode completion + _fasd_zsh_word_complete() { + [ "\$2" ] && local _fasd_cur="\$2" + [ -z "\$_fasd_cur" ] && local _fasd_cur="\${words[CURRENT]}" + local fnd="\${_fasd_cur//,/ }" + local typ=\${1:-e} + fasd --query \$typ "\$fnd" 2>> "$_FASD_SINK" | \\ + sort -nr | sed 's/^[^ ]*[ ]*//' | while read -r line; do + compadd -U -V fasd "\$line" + done + compstate[insert]=menu # no expand + } + _fasd_zsh_word_complete_f() { _fasd_zsh_word_complete f ; } + _fasd_zsh_word_complete_d() { _fasd_zsh_word_complete d ; } + _fasd_zsh_word_complete_trigger() { + local _fasd_cur="\${words[CURRENT]}" + eval \$(fasd --word-complete-trigger _fasd_zsh_word_complete \$_fasd_cur) + } + # define zle widgets + zle -C fasd-complete complete-word _generic + zstyle ':completion:fasd-complete:*' completer _fasd_zsh_word_complete + zstyle ':completion:fasd-complete:*' menu-select + + zle -C fasd-complete-f complete-word _generic + zstyle ':completion:fasd-complete-f:*' completer _fasd_zsh_word_complete_f + zstyle ':completion:fasd-complete-f:*' menu-select + + zle -C fasd-complete-d complete-word _generic + zstyle ':completion:fasd-complete-d:*' completer _fasd_zsh_word_complete_d + zstyle ':completion:fasd-complete-d:*' menu-select +} + +EOS + ;; + + zsh-ccomp-install) cat <<EOS +# enbale command mode completion +compctl -U -K _fasd_zsh_cmd_complete -V fasd -x 'C[-1,-*e],s[-]n[1,e]' -c - \\ + 'c[-1,-A][-1,-D]' -f -- fasd fasd_cd + +EOS + ;; + + zsh-wcomp-install) cat <<EOS +(( \$+functions[compdef] )) && { + # enable word mode completion + orig_comp="\$(zstyle -L ':completion:\\*' completer 2>> "$_FASD_SINK")" + if [ "\$orig_comp" ]; then + case \$orig_comp in + *_fasd_zsh_word_complete_trigger*);; + *) eval "\$orig_comp _fasd_zsh_word_complete_trigger";; + esac + else + zstyle ':completion:*' completer _complete _fasd_zsh_word_complete_trigger + fi + unset orig_comp +} + +EOS + ;; + + bash-ccomp) cat <<EOS +# bash command mode completion +_fasd_bash_cmd_complete() { + # complete command after "-e" + local cur=\${COMP_WORDS[COMP_CWORD]} + [[ \${COMP_WORDS[COMP_CWORD-1]} == -*e ]] && \\ + COMPREPLY=( \$(compgen -A command \$cur) ) && return + # complete using default readline complete after "-A" or "-D" + case \${COMP_WORDS[COMP_CWORD-1]} in + -A|-D) COMPREPLY=( \$(compgen -o default \$cur) ) && return;; + esac + # get completion results using expanded aliases + local RESULT=\$( fasd --complete "\$(alias -p \$COMP_WORDS \\ + 2>> "$_FASD_SINK" | sed -n "\\\$s/^.*'\\\\(.*\\\\)'/\\\\1/p") + \${COMP_LINE#* }" | while read -r line; do + quote_readline "\$line" 2>/dev/null || \\ + printf %q "\$line" 2>/dev/null && \\ + printf \\\\n + done) + local IFS=\$'\\n'; COMPREPLY=( \$RESULT ) +} +_fasd_bash_hook_cmd_complete() { + for cmd in \$*; do + complete -F _fasd_bash_cmd_complete \$cmd + done +} + +EOS + ;; + + bash-ccomp-install) cat <<EOS +# enable bash command mode completion +_fasd_bash_hook_cmd_complete fasd a s d f sd sf z zz + +EOS + ;; + esac; shift + done + ;; + + # if "$_fasd_cur" or "$2" is a query, then output shell code to be eval'd + --word-complete-trigger) + shift; [ "$2" ] && local _fasd_cur="$2" || return + case $_fasd_cur in + ,*) printf %s\\n "$1 e $_fasd_cur";; + f,*) printf %s\\n "$1 f ${_fasd_cur#?}";; + d,*) printf %s\\n "$1 d ${_fasd_cur#?}";; + *,,) printf %s\\n "$1 e $_fasd_cur";; + *,,f) printf %s\\n "$1 f ${_fasd_cur%?}";; + *,,d) printf %s\\n "$1 d ${_fasd_cur%?}";; + esac + ;; + + --sanitize) shift; printf %s\\n "$*" | \ + sed 's/\([^\]\)$( *[^ ]* *\([^)]*\)))*/\1\2/g + s/\([^\]\)[|&;<>$`{}]\{1,\}/\1 /g' + ;; + + --proc) shift # process commands + # stop if we don't own $_FASD_DATA or $_FASD_RO is set + [ -f "$_FASD_DATA" -a ! -O "$_FASD_DATA" ] || [ "$_FASD_RO" ] && return + + # blacklists + local each; for each in $_FASD_BLACKLIST; do + case " $* " in *\ $each\ *) return;; esac + done + + # shifts + while true; do + case " $_FASD_SHIFT " in + *\ $1\ *) shift;; + *) break;; + esac + done + + # ignores + case " $_FASD_IGNORE " in + *\ $1\ *) return;; + esac + + shift; fasd --add "$@" # add all arguments except command + ;; + + --add|-A) shift # add entries + # stop if we don't own $_FASD_DATA or $_FASD_RO is set + [ -f "$_FASD_DATA" -a ! -O "$_FASD_DATA" ] || [ "$_FASD_RO" ] && return + + # find all valid path arguments, convert them to simplest absolute form + local paths="$(while [ "$1" ]; do + [ -e "$1" ] && printf %s\\n "$1"; shift + done | sed '/^[^/]/s@^@'"$PWD"'/@ + s@/\.\.$@/../@;s@/\(\./\)\{1,\}@/@g;:0 + s@[^/][^/]*//*\.\./@/@;t 0 + s@^/*\.\./@/@;s@//*@/@g;s@/\.\{0,1\}$@@;s@^$@/@' 2>> "$_FASD_SINK" \ + | tr '\n' '|')" + + # add current pwd if the option is set + [ "$_FASD_TRACK_PWD" = "1" -a "$PWD" != "$HOME" ] && paths="$paths|$PWD" + + [ -z "${paths##\|}" ] && return # stop if we have nothing to add + + # maintain the file + local tempfile + tempfile="$(mktemp "$_FASD_DATA".XXXXXX)" || return + $_FASD_AWK -v list="$paths" -v now="$(date +%s)" -v max="$_FASD_MAX" -F"|" ' + BEGIN { + split(list, files, "|") + for(i in files) { + path = files[i] + if(path == "") continue + paths[path] = path # array for checking + rank[path] = 1 + time[path] = now + } + } + $2 >= 1 { + if($1 in paths) { + rank[$1] = $2 + 1 / $2 + time[$1] = now + } else { + rank[$1] = $2 + time[$1] = $3 + } + count += $2 + } + END { + if(count > max) + for(i in rank) print i "|" 0.9*rank[i] "|" time[i] # aging + else + for(i in rank) print i "|" rank[i] "|" time[i] + }' "$_FASD_DATA" 2>> "$_FASD_SINK" >| "$tempfile" + if [ $? -ne 0 -a -f "$_FASD_DATA" ]; then + env rm -f "$tempfile" + else + env mv -f "$tempfile" "$_FASD_DATA" + fi + ;; + + --delete|-D) shift # delete entries + # stop if we don't own $_FASD_DATA or $_FASD_RO is set + [ -f "$_FASD_DATA" -a ! -O "$_FASD_DATA" ] || [ "$_FASD_RO" ] && return + + # turn valid arguments into entry-deleting sed commands + local sed_cmd="$(while [ "$1" ]; do printf %s\\n "$1"; shift; done | \ + sed '/^[^/]/s@^@'"$PWD"'/@;s@/\.\.$@/../@;s@/\(\./\)\{1,\}@/@g;:0 + s@[^/][^/]*//*\.\./@/@;t 0 + s@^/*\.\./@/@;s@//*@/@g;s@/\.\{0,1\}$@@ + s@^$@/@;s@\([.[\/*^$]\)@\\\1@g;s@^\(.*\)$@/^\1|/d@' 2>> "$_FASD_SINK")" + + # maintain the file + local tempfile + tempfile="$(mktemp "$_FASD_DATA".XXXXXX)" || return + + sed "$sed_cmd" "$_FASD_DATA" 2>> "$_FASD_SINK" >| "$tempfile" + + if [ $? -ne 0 -a -f "$_FASD_DATA" ]; then + env rm -f "$tempfile" + else + env mv -f "$tempfile" "$_FASD_DATA" + fi + ;; + + --query) shift # query the db, --query [$typ ["$fnd" [$mode]]] + [ -f "$_FASD_DATA" ] || return # no db yet + [ "$1" ] && local typ="$1" + [ "$2" ] && local fnd="$2" + [ "$3" ] && local mode="$3" + + # cat all backends + local each _fasd_data; for each in $_FASD_BACKENDS; do + _fasd_data="$_fasd_data +$(fasd --backend $each)" + done + [ "$_fasd_data" ] || _fasd_data="$(cat "$_FASD_DATA")" + + # set mode specific code for calculating the prior + case $mode in + rank) local prior='times[i]';; + recent) local prior='sqrt(100000/(1+t-la[i]))';; + *) local prior='times[i] * frecent(la[i])';; + esac + + if [ "$fnd" ]; then # dafault matching + local bre="$(printf %s\\n "$fnd" | sed 's/\([*\.\\\[]\)/\\\1/g + s@ @[^|]*@g;s/\$$/|/')" + bre='^[^|]*'"$bre"'[^|/]*|' + local _ret="$(printf %s\\n "$_fasd_data" | grep "$bre")" + [ "$_ret" ] && _ret="$(printf %s\\n "$_ret" | while read -r line; do + [ -${typ:-e} "${line%%\|*}" ] && printf %s\\n "$line" + done)" + if [ "$_ret" ]; then + _fasd_data="$_ret" + else # no case mathcing + _ret="$(printf %s\\n "$_fasd_data" | grep -i "$bre")" + [ "$_ret" ] && _ret="$(printf %s\\n "$_ret" | while read -r line; do + [ -${typ:-e} "${line%%\|*}" ] && printf %s\\n "$line" + done)" + if [ "$_ret" ]; then + _fasd_data="$_ret" + elif [ "${_FASD_FUZZY:-0}" -gt 0 ]; then # fuzzy matching + local fuzzy_bre="$(printf %s\\n "$fnd" | \ + sed 's/\([*\.\\\[]\)/\\\1/g;s/\$$/|/ + s@\(\\\{0,1\}[^ ]\)@\1[^|/]\\{0,'"$_FASD_FUZZY"'\\}@g + s@ @[^|]*@g')" + fuzzy_bre='^[^|]*'"$fuzzy_bre"'[^|/]*|' + _ret="$(printf %s\\n "$_fasd_data" | grep -i "$fuzzy_bre")" + [ "$_ret" ] && _ret="$(printf %s\\n "$_ret" | while read -r line; do + [ -${typ:-e} "${line%%\|*}" ] && printf %s\\n "$line" + done)" + [ "$_ret" ] && _fasd_data="$_ret" || _fasd_data= + fi + fi + else # no query arugments + _fasd_data="$(printf %s\\n "$_fasd_data" | while read -r line; do + [ -${typ:-e} "${line%%\|*}" ] && printf %s\\n "$line" + done)" + fi + + # query the database + [ "$_fasd_data" ] && printf %s\\n "$_fasd_data" | \ + $_FASD_AWK -v t="$(date +%s)" -F"|" ' + function frecent(time) { + dx = t-time + if( dx < 3600 ) return 6 + if( dx < 86400 ) return 4 + if( dx < 604800 ) return 2 + return 1 + } + { + if(!paths[$1]) { + times[$1] = $2 + la[$1] = $3 + paths[$1] = 1 + } else { + times[$1] += $2 + if($3 > la[$1]) la[$1] = $3 + } + } + END { + for(i in paths) printf "%-10s %s\n", '"$prior"', i + }' - 2>> "$_FASD_SINK" + ;; + + --backend) + case $2 in + native) cat "$_FASD_DATA";; + viminfo) + < "$_FASD_VIMINFO" sed -n '/^>/{s@~@'"$HOME"'@ + s/^..// + p + }' | $_FASD_AWK -v t="$(date +%s)" '{ + t -= 60 + print $0 "|1|" t + }' + ;; + recently-used) + local nl="$(printf '\\\nX')"; nl="${nl%X}" # slash newline for sed + tr -d '\n' < "$_FASD_RECENTLY_USED_XBEL" | \ + sed 's@file:/@'"$nl"'@g;s@count="@'"$nl"'@g' | sed '1d;s/".*$//' | \ + tr '\n' '|' | sed 's@|/@'"$nl"'@g' | $_FASD_AWK -F'|' '{ + sum = 0 + for( i=2; i<=NF; i++ ) sum += $i + print $1 "|" sum + }' + ;; + *) eval "$2";; + esac + ;; + + *) # parsing logic and processing + local fnd= last= _FASD_BACKENDS="$_FASD_BACKENDS" _fasd_data= comp= exec= + while [ "$1" ]; do case $1 in + --complete) [ "$2" = "--" ] && shift; set -- $2; local lst=1 r=r comp=1;; + --query|--add|--delete|-A|-D) fasd "$@"; return $?;; + --version) [ -z "$comp" ] && echo "1.0.1" && return;; + --) while [ "$2" ]; do shift; fnd="$fnd $1"; last="$1"; done;; + -*) local o="${1#-}"; while [ "$o" ]; do case $o in + s*) local show=1;; + l*) local lst=1;; + i*) [ -z "$comp" ] && local interactive=1 show=1;; + r*) local mode=rank;; + t*) local mode=recent;; + e*) o="${o#?}"; if [ "$o" ]; then # there are characters after "-e" + local exec="$o" # anything after "-e" + else # use the next argument + local exec="${2:?"-e: Argument needed "}" + shift + fi; break;; + b*) o="${o#?}"; if [ "$o" ]; then + _FASD_BACKENDS="$o" + else + _FASD_BACKENDS="${2:?"-b: Argument needed"}" + shift + fi; break;; + B*) o="${o#?}"; if [ "$o" ]; then + _FASD_BACKENDS="$_FASD_BACKENDS $o" + else + _FASD_BACKENDS="$_FASD_BACKENDS ${2:?"-B: Argument needed"}" + shift + fi; break;; + a*) local typ=e;; + d*) local typ=d;; + f*) local typ=f;; + R*) local r=r;; + [0-9]*) local _fasd_i="$o"; break;; + h*) [ -z "$comp" ] && echo "fasd [options] [query ...] +[f|a|s|d|z] [options] [query ...] + options: + -s list paths with scores + -l list paths without scores + -i interactive mode + -e <cmd> set command to execute on the result file + -b <name> only use <name> backend + -B <name> add additional backend <name> + -a match files and directories + -d match directories only + -f match files only + -r match by rank only + -t match by recent access only + -R reverse listing order + -h show a brief help message + -[0-9] select the nth entry + +fasd [-A|-D] [paths ...] + -A add paths + -D delete paths" >&2 && return;; + esac; o="${o#?}"; done;; + *) fnd="$fnd $1"; last="$1";; + esac; shift; done + + # guess whether the last query is selected from tab completion + case $last in + /?*) if [ -z "$show$lst" -a -${typ:-e} "$last" -a "$exec" ]; then + $exec "$last" + return + fi;; + esac + + local R; [ -z "$r" ] && R=r || R= # let $R be the opposite of $r + fnd="${fnd# }" + + local res + res="$(fasd --query 2>> "$_FASD_SINK")" # query the database + [ $? -gt 0 ] && return + if [ 0 -lt ${_fasd_i:-0} ] 2>> "$_FASD_SINK"; then + res="$(printf %s\\n "$res" | sort -n${R} | \ + sed -n "$_fasd_i"'s/^[^ ]*[ ]*//p')" + elif [ "$interactive" ] || [ "$exec" -a -z "$fnd$lst$show" -a -t 1 ]; then + if [ "$(printf %s "$res" | sed -n '$=')" -gt 1 ]; then + res="$(printf %s\\n "$res" | sort -n${R})" + printf %s\\n "$res" | sed = | sed 'N;s/\n/ /' | sort -nr >&2 + printf "> " >&2 + local i; read i; [ 0 -lt "${i:-0}" ] 2>> "$_FASD_SINK" || return 1 + fi + res="$(printf %s\\n "$res" | sed -n "${i:-1}"'s/^[^ ]*[ ]*//p')" + elif [ "$lst" ]; then + [ "$res" ] && printf %s\\n "$res" | sort -n${r} | sed 's/^[^ ]*[ ]*//' + return + elif [ "$show" ]; then + [ "$res" ] && printf %s\\n "$res" | sort -n${r} + return + elif [ "$fnd" ] && [ "$exec" -o ! -t 1 ]; then # exec or subshell + res="$(printf %s\\n "$res" | sort -n | sed -n '$s/^[^ ]*[ ]*//p')" + else # no args, show + [ "$res" ] && printf %s\\n "$res" | sort -n${r} + return + fi + if [ "$res" ]; then + fasd --add "$res" + [ -z "$exec" ] && exec='printf %s\n' + $exec "$res" + fi + ;; + esac +} + +fasd --init env + +case $- in + *i*) ;; # assume being sourced, do nothing + *) # assume being executed as an executable + if [ -x "$_FASD_SHELL" -a -z "$_FASD_SET" ]; then + _FASD_SET=1 exec $_FASD_SHELL "$0" "$@" + else + fasd "$@" + fi;; +esac + diff --git a/zsh/functions/runit/_sv b/zsh/functions/runit/_sv new file mode 100644 index 00000000..bf98b3ea --- /dev/null +++ b/zsh/functions/runit/_sv @@ -0,0 +1,7 @@ +#compdef sv + +_arguments -A -S -s \ + '-v[wait up to 7 seconds for the command to take effect. (up|down|term|once|cont|exit)]' \ + '-w+[wait for %n seconds]: :_guard "[0-9]#" "numeric value"' \ + '1:command:(status up down once pause cont hup alarm interrupt quit 1 2 term kill exit start stop restart shutdown force-stop force-reload force-restart force-shutdown check)' \ + '*:installed service:_files -W ${SVDIR:-/service}' diff --git a/zsh/functions/runit/getservicedir b/zsh/functions/runit/getservicedir new file mode 100644 index 00000000..2e5d961c --- /dev/null +++ b/zsh/functions/runit/getservicedir @@ -0,0 +1,2 @@ +#!/usr/bin/env zsh +print ${$(readlink ${SVDIR:-/service}/$1):h} \ No newline at end of file diff --git a/zsh/functions/runit/linksv b/zsh/functions/runit/linksv new file mode 100644 index 00000000..7ee71094 --- /dev/null +++ b/zsh/functions/runit/linksv @@ -0,0 +1,16 @@ +#!/usr/bin/env zsh + +if [[ -z $1 ]]; then + echo "No service specified" + return 64 +fi + + +if [[ ! -x $1 ]]; then + echo "Service does not exist in current directory" + return 1 +fi + +mv $1{,.old} +ln -s =sv $1 +chmod -h a-w $1 diff --git a/zsh/functions/runit/renamesv b/zsh/functions/runit/renamesv new file mode 100644 index 00000000..dba1098d --- /dev/null +++ b/zsh/functions/runit/renamesv @@ -0,0 +1,36 @@ +#!/usr/bin/env zsh +local svdir=${SVDIR:-/service} +if [[ -z $1 || -z $2 ]]; then + echo "Usage: $0 source target" + return 64 +fi + +if [[ ! -h $svdir/$1 ]]; then + echo $svdir/$1 does not exist + return 2 +fi + +if [[ -e $svdir/$2 ]]; then + echo $svdir/$2 already exists + return 3 +fi + +local servicedir=`getservicedir` + +if [[ ! ( -w $svdir && -w $servicedir ) ]]; then + echo $svdir or $servicedir is not writeable +fi + +# The service doesn't have to be stopped as removing the link will do that +# However, running the same service twice isn't a great idea, so wait here +sv stop $1 + +rm -f $svdir/$1 || return + +mv $servicedir/{$1,$2} || return + +ln -s {$servicedir,$svdir}/$2 || return + +sv start $2 + +return diff --git a/zsh/zshrc b/zsh/zshrc new file mode 100755 index 00000000..7d8915bb --- /dev/null +++ b/zsh/zshrc @@ -0,0 +1,367 @@ +#!/usr/bin/env zsh +# +# System variables +# + +if [[ $defpath == "" && -d ~/bin ]] +then + defpath=($path) + path=( + $defpath + ~/bin + ) +fi + +if [[ ! -d ~/.zsh/cache ]] +then + mkdir -p ~/.zsh/cache +fi + +myfuncs=( ~alan/dotfiles/zsh/functions/*(/) ) +fpath=( + $myfuncs + ~alan/dotfiles/zsh/completion/ + $fpath +) + +export PATH +export PAGER="less" +export CLICOLOR=true + +# +# zsh variables +# +HISTFILE=~/.zsh/history +HISTSIZE=4000 +SAVEHIST=3000 + +WORDCHARS='*?_-[]~=.&;!#$%^(){}<>' + +#If a command takes more than 5 seconds, give statistics +REPORTTIME=5 +TIMEFMT="%U user %S system %P cpu %*Es total" + +#Check for user logins +watch=notme +WATCHFMT="%n has %a %l from %M at %t" + +hosts=( + server + prefect + alanpearce.co.uk + home.alanpearce.co.uk + lethalrocks.uk.to + alphapulsar.uk.to + st.alphapulsar.uk.to + a.st.alphapulsar.uk.to + st +) + +users=(alan root toor) + +function linkAuthSock () { + local linkSock=~/.ssh/ssh_auth_sock + ln -sf $1 ~/.ssh/ssh_auth_sock + export SSH_AUTH_SOCK=$linkSock +} + +if [[ "$SSH_AUTH_SOCK" != "" ]] +then + if [[ -e ~/.ssh/ssh_auth_sock && ! -L ~/.ssh/ssh_auth_sock ]] + then + linkAuthSock $SSH_AUTH_SOCK + fi +fi + +if [[ "$OSTYPE" == *gnu* ]] +then + eval `dircolors -b` #exports LSCOLORS + ls_options="-v --group-directories-first --color=auto" + ls_isodate="--time-style=long-iso" +elif [[ "$OSTYPE" == freebsd* ]] +then + freebsd=1 + ls_options="-p" + ls_isodate="-D '%F %k:%M'" +fi + +#Ignore suffixes in completion +fignore=( + svbin +) + +# +# Modules +# +autoload -Uz compinit bashcompinit +autoload -U colors complist zrecompile zmv zargs zed +autoload -Uz vcs_info +autoload insert-files +zle -N insert-files +zmodload -i zsh/complist +colors +compinit -d .zsh/cache/compdump +bashcompinit + +zstyle :compinstall filename '/home/alan/.zshrc' + +autoload -Uz _tmux_pane_words +zle -C tmux-pane-words-prefix complete-word _generic +zle -C tmux-pane-words-anywhere complete-word _generic +zstyle ':completion:tmux-pane-words-(prefix|anywhere):*' completer _tmux_pane_words +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}' + +# Speed up completion by not going further than a full match +zstyle ':completion:*' accept-exact '*(N)' + +zstyle ':completion:*:default' use-cache on +zstyle ':completion:*:default' cache-path ~/.zsh/cache/compcache + +zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' '+m:{A-Z}={a-z}' +zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _match + +zstyle ':completion:*' verbose yes +zstyle ':completion:*:messages' format '%d' +zstyle ':completion:*:warnings' format 'No matches for: %d' +zstyle ':completion:*:descriptions' format '%U%B%d%b%u' +zstyle ':completion:*:corrections' format '%B%d (errors: %e)%b' +zstyle ':completion:*' group-name '' + +# Complete all user processes +zstyle ':completion:*:processes' command 'ps -au$USER' +# Add colour to process lists +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' +zstyle ':completion:*:*:kill:*' menu yes select +zstyle ':completion:*:kill:*' force-list always +zstyle ':completion:*:*:killall:*' menu yes select +zstyle ':completion:*:killall:*' force-list always + +# Complete unreadable log filenames +#zstyle ':completion::complete:(most|tail)::' fake-files '/var/log/*:current' + +# Group manpages by section +zstyle ':completion:*' separate-sections true + +# Users +#zstyle '*' users $users + +zstyle '*' hosts $hosts + +zstyle ':completion:*:functions' ignored-patterns '_*' +zstyle ':completion:*:cd:*' ignore-parents parent pwd + +#This works, but isn't the same as ls +#zstyle ':completion:*:default' list-colors '' +zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} + +zstyle ':vcs_info:*' enable git hg + +# Filename suffixes to ignore during completion (except after rm command) +zstyle ':completion:*:*:(^rm):*:*files' ignored-patterns '*?.o' '*?.c~' '*?.old' '*?.pro' + +## Prompt +if [[ $term = "putty" ]];then + prompt_char="›" +else + prompt_char=">" +fi + +PS1="%B%~%(!.%{$fg[red]%}.%{$fg[green]%})$prompt_char%f%b " + +# Options + +# Changing directories +setopt auto_cd + +# Completion +setopt auto_list # List multiple choices on first tab +unsetopt list_ambiguous # List ambiguous choices rather than completing common prefixes +unsetopt list_beep # Don't try to beep here +setopt list_types # Indicate file types + +# Expansion and globbing +setopt extended_glob # Use #~^ as part of filename patterns +unsetopt nomatch + +# History +unsetopt hist_beep +setopt hist_expire_dups_first +setopt hist_fcntl_lock # Use standard locking on histfile +setopt hist_find_no_dups +setopt hist_ignore_space +setopt hist_reduce_blanks +setopt hist_verify +setopt inc_append_history + +# Input/Output +unsetopt clobber +unsetopt flow_control +setopt path_dirs # Search PATH even with slashes +setopt print_exit_value + +# Job Control +setopt auto_continue +unsetopt nohup +setopt long_list_jobs +unsetopt notify + +# Scripts and functions +unsetopt multi_func_def +setopt multios + +# Zle +unsetopt beep + +############ +# Keybinds # +############ +#KiTTY +bindkey "OD" backward-word +bindkey "OC" forward-word + +#General +bindkey "[1~" beginning-of-line +bindkey "[4~" end-of-line +bindkey "[5~" beginning-of-history +bindkey "[6~" end-of-history +bindkey "[2~" quoted-insert +bindkey "[3~" delete-char + +bindkey '' backward-delete-char + +bindkey '^I' expand-or-complete-prefix +bindkey '[Z' reverse-menu-complete +bindkey '[A' up-line-or-search +bindkey '[B' down-line-or-search + +#urxvt +bindkey '[3;5~' delete-word +bindkey '[1;5D' backward-word +bindkey '[1;5C' forward-word + +bindkey 'f' insert-files +bindkey 'd' describe-key-briefly + +bindkey '\' tmux-pane-words-prefix +bindkey '|' tmux-pane-words-anywhere + +# Aliases before functions +alias getcflags='gcc -\#\#\# -march=native -E /usr/include/stdlib.h 2>&1 | grep "/usr/libexec/gcc/.*cc1"' +alias grep='grep --color=auto' +alias df='df -h' +alias du='du -h' +alias md='mkdir -p' +alias rd='rmdir' +alias .='source' + +alias l="\ls ${ls_options} -Bp" +alias l1="\ls ${ls_options} -1" +alias ls="\ls ${ls_options} -hF" +alias la="\ls ${ls_options} -hA" +alias ll="\ls ${ls_options} ${ls_isodate} -hl" +alias lal="ll -A" +alias lla="lal" +alias llr="ll -t" +alias gpp='g++' +alias lsr="ls -tld *(m-2)" # mtime < -2days + +alias trans="transmission-remote transmission.home" +alias bitcoin="bitcoind" +alias namecoin="~alan/applications/namecoin/src/namecoind" +alias e="$EDITOR" +alias E="SUDO_EDITOR=\emacsclient -c -a emacs\" sudoedit" +alias aticonfig="DISPLAY=:0 \aticonfig" +alias wprop="xprop | egrep WM_(CLASS|NAME|WINDOW_ROLE|TYPE)" + +alias -g ...='../..' + +#Suffix aliases +alias -s log=less + +if [[ -e =hub ]]; then + alias git="hub" +fi + +# Functions + +precmd () { + [[ -t 1 ]] || return + case $TERM in + *xterm*|rxvt|putty|(dt|k|E)term|screen*) print -Pn "\e]2;%~\a" + ;; + esac +} + +pid () { + local i + for i in /proc/<->/stat + [[ "$(< $i)" = *\((${(j:|:)~@})\)* ]] && echo $i:h:t + return 0 +} + +_force_rehash() { + (( CURRENT == 1 )) && rehash + return 1 # Because we didn't really complete anything +} + +portgrep() { + sudo lsof -i :$1 -nP | egrep '(LISTEN|UDP|COMMAND)' +} + +ipgrep() { + sudo lsof -i @$1 -nP +} + +smart_sudo () { + if [[ -n $1 ]]; then + \sudo $argv + else + #if no parameters were given, then assume we want a root shell + \sudo -i -u toor + fi +} + +compdef _sudo smart_sudo + +smart_compile () { + local zcompargs + if [[ $1 = *zshrc* ]]; then + zcompargs="-R" + fi + + if [[ $EUID -ne 0 || $1 != *alan* ]]; then + zrecompile -q -p $zcompargs $1 + fi + if [[ -n $2 ]]; then + . $1 + fi +} + +host=${HOST%%.*} +if [[ -e ~alan/dotfiles/zsh/zshrc_$host ]]; then + # Don't recompile as toor|root + smart_compile ~alan/dotfiles/zsh/zshrc_$host 1 +fi +if [[ -e /usr/bin/emerge ]]; then + smart_compile ~alan/dotfiles/zsh/zshrc_gentoo 1 +elif [[ $freebsd -eq 1 ]]; then + smart_compile ~alan/dotfiles/zsh/zshrc_freebsd 1 +fi + +for fp in $myfuncs; do + zrecompile -p $fp $fp/* +done + +_FASD_DATA="$HOME/.zsh/fasd-data" +fasd_cache="$HOME/.zsh/cache/fasd-init-zsh" +autoload -U fasd +if [[ ! -s "$fasd_cache" || ~alan/dotfiles/zsh/functions/fasd -nt "$fasd_cache" ]]; then + fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install >! "$fasd_cache" +fi +smart_compile "$fasd_cache" 1 +unset fasd_cache +alias e="f -e $EDITOR" + +smart_compile ~/.zshrc +alias s="smart_sudo " diff --git a/zsh/zshrc_freebsd b/zsh/zshrc_freebsd new file mode 100755 index 00000000..62612611 --- /dev/null +++ b/zsh/zshrc_freebsd @@ -0,0 +1,8 @@ +#!/usr/bin/env zsh +function update-check () { + sudo portsnap update + sudo portmaster -L --index-only | awk '/ [Nn]ew / { print substr($0,9,9999) }' + sudo portaudit -Fa -X 1 + pkg_updating -d $( ls -ltr -D '%Y%m%d' /var/db/pkg | awk 'END{print $6}' ) +} +alias iotop="top -m io -o total" diff --git a/zsh/zshrc_gentoo b/zsh/zshrc_gentoo new file mode 100644 index 00000000..7af53466 --- /dev/null +++ b/zsh/zshrc_gentoo @@ -0,0 +1,4 @@ +#Distributed merge +dmerge () { + MAKEOPTS='-j10' FEATURES='ccache distcc' emerge "$@" +} \ No newline at end of file diff --git a/zsh/zshrc_prefect b/zsh/zshrc_prefect new file mode 100644 index 00000000..e86b955b --- /dev/null +++ b/zsh/zshrc_prefect @@ -0,0 +1,8 @@ +EDITOR="emacs" +VISUAL="emacs" + +if [[ ! -S $SSH_AUTH_SOCK ]] +then + eval `ssh-agent | sed -e '/^echo/d'` + linkAuthSock $SSH_AUTH_SOCK +fi diff --git a/zsh/zshrc_server b/zsh/zshrc_server new file mode 100644 index 00000000..d9d74219 --- /dev/null +++ b/zsh/zshrc_server @@ -0,0 +1,20 @@ +# -*- shell-script -*- + +export SVDIR=/service +if [[ "$EUID" == "0" ]] || [[ "$USER" == "root" ]] +then + export EDITOR="emacs -nw" +else + export ALTERNATE_EDITOR="emacs" + export EDITOR="emacsclient" +fi + +mailpath= + +# Folder aliases +hash -d music=/tank/media/Music + +zstyle ':completion:*' local server /tank/www/internal '' +zstyle ':completion:*' local external /tank/www/external +zstyle ':completion:*' local alphapulsar.uk.to /tank/www/gaming +zstyle ':completion:*' local home.alanpearce.co.uk /tank/www/external diff --git a/zsh/zshrc_sheldon b/zsh/zshrc_sheldon new file mode 100644 index 00000000..6168baee --- /dev/null +++ b/zsh/zshrc_sheldon @@ -0,0 +1,5 @@ +if [[ ! -S $SSH_AUTH_SOCK ]] +then + eval `ssh-agent | sed -e '/^echo/d'` + linkAuthSock $SSH_AUTH_SOCK +fi diff --git a/zsh/zshrc_st b/zsh/zshrc_st new file mode 100644 index 00000000..a449ef92 --- /dev/null +++ b/zsh/zshrc_st @@ -0,0 +1,2 @@ +hash -d tf=/opt/steam/orangebox/tf +hash -d sv=/etc/sv/tf2 \ No newline at end of file |