diff options
Diffstat (limited to 'plugins')
23 files changed, 521 insertions, 172 deletions
| diff --git a/plugins/colored-man/colored-man.plugin.zsh b/plugins/colored-man/colored-man.plugin.zsh index 56056284a..5c613f49d 100644 --- a/plugins/colored-man/colored-man.plugin.zsh +++ b/plugins/colored-man/colored-man.plugin.zsh @@ -1,3 +1,21 @@ +if [ "$OSTYPE[0,7]" = "solaris" ] +then +	if [ ! -x ${HOME}/bin/nroff ] +	then +		mkdir -p ${HOME}/bin +		cat > ${HOME}/bin/nroff <<EOF +#!/bin/sh +if [ -n "\$_NROFF_U" -a "\$1,\$2,\$3" = "-u0,-Tlp,-man" ]; then +	shift +	exec /usr/bin/nroff -u\${_NROFF_U} "\$@" +fi +#-- Some other invocation of nroff +exec /usr/bin/nroff "\$@" +EOF +	chmod +x ${HOME}/bin/nroff +	fi +fi +  man() {        env \        	  LESS_TERMCAP_mb=$(printf "\e[1;31m") \ @@ -7,5 +25,8 @@ man() {  	  LESS_TERMCAP_so=$(printf "\e[1;44;33m") \  	  LESS_TERMCAP_ue=$(printf "\e[0m") \  	  LESS_TERMCAP_us=$(printf "\e[1;32m") \ +	  PAGER=/usr/bin/less \ +	  _NROFF_U=1 \ +	  PATH=${HOME}/bin:${PATH} \  	  			   man "$@"  } diff --git a/plugins/common-aliases/common-aliases.plugin.zsh b/plugins/common-aliases/common-aliases.plugin.zsh index 228a39da0..90d59910c 100644 --- a/plugins/common-aliases/common-aliases.plugin.zsh +++ b/plugins/common-aliases/common-aliases.plugin.zsh @@ -46,7 +46,6 @@ alias ff='find . -type f -name'  alias h='history'  alias hgrep="fc -El 0 | grep"  alias help='man' -alias j='jobs'  alias p='ps -f'  alias sortnr='sort -n -r'  alias unexport='unset' diff --git a/plugins/dirhistory/dirhistory.plugin.zsh b/plugins/dirhistory/dirhistory.plugin.zsh index 504d7ec14..d101cfcae 100644 --- a/plugins/dirhistory/dirhistory.plugin.zsh +++ b/plugins/dirhistory/dirhistory.plugin.zsh @@ -3,7 +3,7 @@  #   that the user has changed to in the past, and ALT-RIGHT undoes ALT-LEFT.  #  -dirhistory_past=(`pwd`) +dirhistory_past=($PWD)  dirhistory_future=()  export dirhistory_past  export dirhistory_future @@ -50,7 +50,7 @@ function push_future() {  # Called by zsh when directory changes  function chpwd() { -  push_past `pwd` +  push_past $PWD    # If DIRHISTORY_CD is not set...    if [[ -z "${DIRHISTORY_CD+x}" ]]; then      # ... clear future. @@ -73,7 +73,7 @@ function dirhistory_back() {    pop_past cw     if [[ "" == "$cw" ]]; then      # Someone overwrote our variable. Recover it. -    dirhistory_past=(`pwd`) +    dirhistory_past=($PWD)      return    fi diff --git a/plugins/emoji-clock/emoji-clock.plugin.zsh b/plugins/emoji-clock/emoji-clock.plugin.zsh index a69446e3c..0a55528f0 100644 --- a/plugins/emoji-clock/emoji-clock.plugin.zsh +++ b/plugins/emoji-clock/emoji-clock.plugin.zsh @@ -8,21 +8,25 @@  # -----------------------------------------------------------------------------  function emoji-clock() { -  hour=$(date -v '+15M' '+%I') -  minutes=$(date -v '+15M' '+%M') +  # Add 15 minutes to the current time and save the value as $minutes. +  (( minutes = $(date '+%M') + 15 )) +  (( hour = $(date '+%I') + minutes / 60 )) +  # make sure minutes and hours don't exceed 60 nor 12 respectively +  (( minutes %= 60 )); (( hour %= 12 )) +    case $hour in -    01) clock="🕐"; [ $minutes -ge 30 ] && clock="🕜";; -    02) clock="🕑"; [ $minutes -ge 30 ] && clock="🕝";; -    03) clock="🕒"; [ $minutes -ge 30 ] && clock="🕞";; -    04) clock="🕓"; [ $minutes -ge 30 ] && clock="🕟";; -    05) clock="🕔"; [ $minutes -ge 30 ] && clock="🕠";; -    06) clock="🕕"; [ $minutes -ge 30 ] && clock="🕡";; -    07) clock="🕖"; [ $minutes -ge 30 ] && clock="🕢";; -    08) clock="🕗"; [ $minutes -ge 30 ] && clock="🕣";; -    09) clock="🕘"; [ $minutes -ge 30 ] && clock="🕤";; +     0) clock="🕛"; [ $minutes -ge 30 ] && clock="🕧";; +     1) clock="🕐"; [ $minutes -ge 30 ] && clock="🕜";; +     2) clock="🕑"; [ $minutes -ge 30 ] && clock="🕝";; +     3) clock="🕒"; [ $minutes -ge 30 ] && clock="🕞";; +     4) clock="🕓"; [ $minutes -ge 30 ] && clock="🕟";; +     5) clock="🕔"; [ $minutes -ge 30 ] && clock="🕠";; +     6) clock="🕕"; [ $minutes -ge 30 ] && clock="🕡";; +     7) clock="🕖"; [ $minutes -ge 30 ] && clock="🕢";; +     8) clock="🕗"; [ $minutes -ge 30 ] && clock="🕣";; +     9) clock="🕘"; [ $minutes -ge 30 ] && clock="🕤";;      10) clock="🕙"; [ $minutes -ge 30 ] && clock="🕥";;      11) clock="🕚"; [ $minutes -ge 30 ] && clock="🕦";; -    12) clock="🕛"; [ $minutes -ge 30 ] && clock="🕧";;       *) clock="⌛";;    esac    echo $clock diff --git a/plugins/forklift/forklift.plugin.zsh b/plugins/forklift/forklift.plugin.zsh index b0e60a434..692ca5790 100644 --- a/plugins/forklift/forklift.plugin.zsh +++ b/plugins/forklift/forklift.plugin.zsh @@ -1,4 +1,4 @@ -# Open folder in ForkLift.app of ForkLift2.app from console +# Open folder in ForkLift.app or ForkLift2.app from console  # Author: Adam Strzelecki nanoant.com, modified by Bodo Tasche bitboxer.de  #         Updated to support ForkLift2 by Johan Kaving  # diff --git a/plugins/frontend-search/frontend-search.plugin.zsh b/plugins/frontend-search/frontend-search.plugin.zsh index 38b1a80ea..f1d45b0d1 100644 --- a/plugins/frontend-search/frontend-search.plugin.zsh +++ b/plugins/frontend-search/frontend-search.plugin.zsh @@ -118,7 +118,7 @@ alias jquery='frontend jquery'  alias mdn='frontend mdn'  # pre processors frameworks -alias compass='frontend compass' +alias compassdoc='frontend compass'  # important links  alias html5please='frontend html5please' diff --git a/plugins/gitignore/gitignore.plugin.zsh b/plugins/gitignore/gitignore.plugin.zsh index be037d87a..481d487ba 100644 --- a/plugins/gitignore/gitignore.plugin.zsh +++ b/plugins/gitignore/gitignore.plugin.zsh @@ -1,12 +1,12 @@ -function gi() { curl http://www.gitignore.io/api/$@ ;} +function gi() { curl -sL https://www.gitignore.io/api/$@ ;} -_gitignireio_get_command_list() { -  curl -s http://www.gitignore.io/api/list | tr "," "\n" +_gitignoreio_get_command_list() { +  curl -sL https://www.gitignore.io/api/list | tr "," "\n"  } -_gitignireio () { +_gitignoreio () {    compset -P '*,' -  compadd -S '' `_gitignireio_get_command_list` +  compadd -S '' `_gitignoreio_get_command_list`  } -compdef _gitignireio gi +compdef _gitignoreio gi diff --git a/plugins/jump/jump.plugin.zsh b/plugins/jump/jump.plugin.zsh index 1b23b5d42..b16814fe4 100644 --- a/plugins/jump/jump.plugin.zsh +++ b/plugins/jump/jump.plugin.zsh @@ -14,12 +14,12 @@ jump() {  mark() {  	if (( $# == 0 )); then -		MARK=$(basename "$(pwd)") +		MARK=$(basename "$PWD")  	else  		MARK="$1"  	fi -	if read -q \?"Mark $(pwd) as ${MARK}? (y/n) "; then -		mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$MARK" +	if read -q \?"Mark $PWD as ${MARK}? (y/n) "; then +		mkdir -p "$MARKPATH"; ln -s "$PWD" "$MARKPATH/$MARK"  	fi  } diff --git a/plugins/osx/osx.plugin.zsh b/plugins/osx/osx.plugin.zsh index a63f0ee05..2eea0d8ef 100644 --- a/plugins/osx/osx.plugin.zsh +++ b/plugins/osx/osx.plugin.zsh @@ -139,7 +139,7 @@ function man-preview() {  function trash() {    local trash_dir="${HOME}/.Trash" -  local temp_ifs=$IFS +  local temp_ifs="$IFS"    IFS=$'\n'    for item in "$@"; do      if [[ -e "$item" ]]; then diff --git a/plugins/pj/pj.plugin.zsh b/plugins/pj/pj.plugin.zsh index ba3765b83..1572e9363 100644 --- a/plugins/pj/pj.plugin.zsh +++ b/plugins/pj/pj.plugin.zsh @@ -18,8 +18,11 @@ function pj() {      file=$1      if [[ "open" == "$file" ]] then -        file=$2 +        shift +        file=$*          cmd=(${(s: :)EDITOR}) +    else +        file=$*      fi      for project in $PROJECT_PATHS; do @@ -36,7 +39,11 @@ function pj() {  alias pjo="pj open"  function _pj () { -    compadd `/bin/ls -l $PROJECT_PATHS 2>/dev/null | awk '{ print $9 }'` +    # might be possible to improve this using glob, without the basename trick +    typeset -a projects +    projects=($PROJECT_PATHS/*) +    projects=$projects:t +    _arguments "*:file:($projects)"  }  compdef _pj pj diff --git a/plugins/pow/pow.plugin.zsh b/plugins/pow/pow.plugin.zsh index d85c88777..ded3336a7 100644 --- a/plugins/pow/pow.plugin.zsh +++ b/plugins/pow/pow.plugin.zsh @@ -21,13 +21,13 @@  rack_root(){    setopt chaselinks -  local orgdir="$(pwd)" -  local basedir="$(pwd)" +  local orgdir="$PWD" +  local basedir="$PWD"    while [[ $basedir != '/' ]]; do      test -e "$basedir/config.ru" && break      builtin cd ".." 2>/dev/null -    basedir="$(pwd)" +    basedir="$PWD"    done    builtin cd "$orgdir" 2>/dev/null @@ -56,7 +56,7 @@ kapow(){  compctl -W ~/.pow -/ kapow  powit(){ -  local basedir="$(pwd)" +  local basedir="$PWD"    local vhost=$1    [ ! -n "$vhost" ] && vhost=$(rack_root_detect)    if [ ! -h ~/.pow/$vhost ] diff --git a/plugins/profiles/profiles.plugin.zsh b/plugins/profiles/profiles.plugin.zsh index 8faae6b53..5bc56cea0 100644 --- a/plugins/profiles/profiles.plugin.zsh +++ b/plugins/profiles/profiles.plugin.zsh @@ -2,7 +2,7 @@  # This will look for a custom profile for the local machine and each domain or  # subdomain it belongs to. (e.g. com, example.com and foo.example.com) -parts=(${(s:.:)$(hostname)}) +parts=(${(s:.:)HOST})  for i in {${#parts}..1}; do    profile=${(j:.:)${parts[$i,${#parts}]}}    file=$ZSH_CUSTOM/profiles/$profile diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh index fb46cdcf0..824658e44 100644 --- a/plugins/rails/rails.plugin.zsh +++ b/plugins/rails/rails.plugin.zsh @@ -6,7 +6,7 @@ function _rails_command () {    elif [ -e "script/server" ]; then      ruby script/$@    else -    rails $@ +    command rails $@    fi  } @@ -14,7 +14,7 @@ function _rake_command () {    if [ -e "bin/rake" ]; then      bin/rake $@    else -    rake $@ +    command rake $@    fi  } diff --git a/plugins/scd/README.md b/plugins/scd/README.md index 197cea50a..86ab67203 100644 --- a/plugins/scd/README.md +++ b/plugins/scd/README.md @@ -11,12 +11,9 @@ the index.  A selection menu is displayed in case of several matches, with a  preference given to recently visited paths.  `scd` can create permanent  directory aliases, which appear as named directories in zsh session. -## INSTALLATION +## INSTALLATION NOTES -For oh-my-zsh, add `scd` to the `plugins` array in the ~/.zshrc file as in the -[template file](../../templates/zshrc.zsh-template#L45). - -Besides zsh, `scd` can be used with *bash*, *dash* or *tcsh* +Besides oh-my-zsh, `scd` can be used with *bash*, *dash* or *tcsh*  shells and is also available as [Vim](http://www.vim.org/) plugin and  [IPython](http://ipython.org/) extension.  For installation details, see  https://github.com/pavoljuhas/smart-change-directory. @@ -34,7 +31,7 @@ scd [options] [pattern1 pattern2 ...]    add specified directories to the directory index.</dd><dt>  --unindex</dt><dd> -  remove specified directories from the index.</dd><dt> +  remove current or specified directories from the index.</dd><dt>  -r, --recursive</dt><dd>    apply options <em>--add</em> or <em>--unindex</em> recursively.</dd><dt> @@ -47,6 +44,10 @@ scd [options] [pattern1 pattern2 ...]    remove ALIAS definition for the current or specified directory from    <em>~/.scdalias.zsh</em>.</dd><dt> +-A, --all</dt><dd> +  include all matching directories.  Disregard matching by directory +  alias and filtering of less likely paths.</dd><dt> +  --list</dt><dd>    show matching directories and exit.</dd><dt> @@ -70,7 +71,7 @@ scd doc  scd a b c  # Change to a directory path that ends with "ts" -scd "ts(#e)" +scd "ts$"  # Show selection menu and ranking of 20 most likely directories  scd -v diff --git a/plugins/scd/scd b/plugins/scd/scd index 1567d2736..39b28237d 100755 --- a/plugins/scd/scd +++ b/plugins/scd/scd @@ -11,20 +11,22 @@ fi  local DOC='scd -- smart change to a recently used directory  usage: scd [options] [pattern1 pattern2 ...]  Go to a directory path that contains all fixed string patterns.  Prefer -recently visited directories and directories with patterns in their tail -component.  Display a selection menu in case of multiple matches. +recent or frequently visited directories as found in the directory index. +Display a selection menu in case of multiple matches.  Options: -  -a, --add         add specified directories to the directory index -  --unindex         remove specified directories from the index -  -r, --recursive   apply options --add or --unindex recursively +  -a, --add         add specified directories to the directory index. +  --unindex         remove current or specified directories from the index. +  -r, --recursive   apply options --add or --unindex recursively.    --alias=ALIAS     create alias for the current or specified directory and -                    store it in ~/.scdalias.zsh +                    store it in ~/.scdalias.zsh.    --unalias         remove ALIAS definition for the current or specified -                    directory from ~/.scdalias.zsh -  --list            show matching directories and exit -  -v, --verbose     display directory rank in the selection menu -  -h, --help        display this message and exit +                    directory from ~/.scdalias.zsh. +  -A, --all         include all matching directories.  Disregard matching by +                    directory alias and filtering of less likely paths. +  --list            show matching directories and exit. +  -v, --verbose     display directory rank in the selection menu. +  -h, --help        display this message and exit.  '  local SCD_HISTFILE=${SCD_HISTFILE:-${HOME}/.scdhistory} @@ -35,9 +37,9 @@ local SCD_THRESHOLD=${SCD_THRESHOLD:-0.005}  local SCD_SCRIPT=${RUNNING_AS_COMMAND:+$SCD_SCRIPT}  local SCD_ALIAS=~/.scdalias.zsh -local ICASE a d m p i tdir maxrank threshold +local ICASE a d m p i maxrank threshold  local opt_help opt_add opt_unindex opt_recursive opt_verbose -local opt_alias opt_unalias opt_list +local opt_alias opt_unalias opt_all opt_list  local -A drank dalias  local dmatching  local last_directory @@ -56,7 +58,8 @@ zmodload -i zsh/zutil  zmodload -i zsh/datetime  zparseopts -D -- a=opt_add -add=opt_add -unindex=opt_unindex \      r=opt_recursive -recursive=opt_recursive \ -    -alias:=opt_alias -unalias=opt_unalias -list=opt_list \ +    -alias:=opt_alias -unalias=opt_unalias \ +    A=opt_all -all=opt_all -list=opt_list \      v=opt_verbose -verbose=opt_verbose h=opt_help -help=opt_help \      || $EXIT $? @@ -68,6 +71,11 @@ fi  # load directory aliases if they exist  [[ -r $SCD_ALIAS ]] && source $SCD_ALIAS +# Private internal functions are prefixed with _scd_Y19oug_. +# Clean them up when the scd function returns. +setopt localtraps +trap 'unfunction -m "_scd_Y19oug_*"' EXIT +  # works faster than the (:a) modifier and is compatible with zsh 4.2.6  _scd_Y19oug_abspath() {      set -A $1 ${(ps:\0:)"$( @@ -123,11 +131,52 @@ if [[ -n $opt_unalias ]]; then      $EXIT $?  fi +# The "compress" function collapses repeated directories to +# one entry with a time stamp that gives equivalent-probability. +_scd_Y19oug_compress() { +    awk -v epochseconds=$EPOCHSECONDS -v meanlife=$SCD_MEANLIFE ' +        BEGIN { FS = "[:;]"; } +        length($0) < 4096 && $2 > 0 { +            tau = 1.0 * ($2 - epochseconds) / meanlife; +            if (tau < -6.9078)  tau = -6.9078; +            prob = exp(tau); +            sub(/^[^;]*;/, ""); +            if (NF)  { +                dlist[last[$0]] = ""; +                dlist[NR] = $0; +                last[$0] = NR; +                ptot[$0] += prob; +            } +        } +        END { +            for (i = 1; i <= NR; ++i) { +                d = dlist[i]; +                if (d) { +                    ts = log(ptot[d]) * meanlife + epochseconds; +                    printf(": %.0f:0;%s\n", ts, d); +                } +            } +        } +    ' $* +} +  # Rewrite directory index if it is at least 20% oversized  if [[ -s $SCD_HISTFILE ]] && \  (( $(wc -l <$SCD_HISTFILE) > 1.2 * $SCD_HISTSIZE )); then -    m=( ${(f)"$(<$SCD_HISTFILE)"} ) -    print -lr -- ${m[-$SCD_HISTSIZE,-1]} >| ${SCD_HISTFILE} +    # compress repeated entries +    m=( ${(f)"$(_scd_Y19oug_compress $SCD_HISTFILE)"} ) +    # purge non-existent directories +    m=( ${(f)"$( +        for a in $m; do +            if [[ -d ${a#*;} ]]; then print -r -- $a; fi +        done +        )"} +    ) +    # cut old entries if still oversized +    if [[ $#m -gt $SCD_HISTSIZE ]]; then +        m=( ${m[-$SCD_HISTSIZE,-1]} ) +    fi +    print -lr -- $m >| ${SCD_HISTFILE}  fi  # Determine the last recorded directory @@ -135,7 +184,6 @@ if [[ -s ${SCD_HISTFILE} ]]; then      last_directory=${"$(tail -1 ${SCD_HISTFILE})"#*;}  fi -# Internal functions are prefixed with "_scd_Y19oug_".  # The "record" function adds its arguments to the directory index.  _scd_Y19oug_record() {      while [[ -n $last_directory && $1 == $last_directory ]]; do @@ -217,7 +265,7 @@ _scd_Y19oug_action() {  # set global arrays dmatching and drank  _scd_Y19oug_match() {      ## single argument that is an existing directory or directory alias -    if [[ $# == 1 ]] && \ +    if [[ -z $opt_all && $# == 1 ]] && \          [[ -d ${d::=$1} || -d ${d::=${nameddirs[$1]}} ]] && [[ -x $d ]];      then          _scd_Y19oug_abspath dmatching $d @@ -227,6 +275,8 @@ _scd_Y19oug_match() {      # ignore case unless there is an argument with an uppercase letter      [[ "$*" == *[[:upper:]]* ]] || ICASE='(#i)' +    # support "$" as an anchor for the directory name ending +    argv=( ${argv/(#m)?[$](#e)/${MATCH[1]}(#e)} )      # calculate rank of all directories in the SCD_HISTFILE and keep it as drank      # include a dummy entry for splitting of an empty string is buggy @@ -237,10 +287,10 @@ _scd_Y19oug_match() {              BEGIN { FS = "[:;]"; }              length($0) < 4096 && $2 > 0 {                  tau = 1.0 * ($2 - epochseconds) / meanlife; -                if (tau < -4.61)  tau = -4.61; -                prec = exp(tau); +                if (tau < -6.9078)  tau = -6.9078; +                prob = exp(tau);                  sub(/^[^;]*;/, ""); -                if (NF)  ptot[$0] += prec; +                if (NF)  ptot[$0] += prob;              }              END { for (di in ptot)  { print di; print ptot[di]; } }'          )"} @@ -249,9 +299,12 @@ _scd_Y19oug_match() {      # filter drank to the entries that match all arguments      for a; do -        p=${ICASE}"*${a}*" +        p=${ICASE}"*(${a})*"          drank=( ${(kv)drank[(I)${~p}]} )      done +    # require at least one argument matches the directory name +    p=${ICASE}"*(${(j:|:)argv})[^/]#" +    drank=( ${(kv)drank[(I)${~p}]} )      # build a list of matching directories reverse-sorted by their probabilities      dmatching=( ${(f)"$( @@ -261,26 +314,6 @@ _scd_Y19oug_match() {          )"}      ) -    # if some directory paths match all patterns in order, discard all others -    p=${ICASE}"*${(j:*:)argv}*" -    m=( ${(M)dmatching:#${~p}} ) -    [[ -d ${m[1]} ]] && dmatching=( $m ) -    # if some directory names match last pattern, discard all others -    p=${ICASE}"*${(j:*:)argv}[^/]#" -    m=( ${(M)dmatching:#${~p}} ) -    [[ -d ${m[1]} ]] && dmatching=( $m ) -    # if some directory names match all patterns, discard all others -    m=( $dmatching ) -    for a; do -        p=${ICASE}"*/[^/]#${a}[^/]#" -        m=( ${(M)m:#${~p}} ) -    done -    [[ -d ${m[1]} ]] && dmatching=( $m ) -    # if some directory names match all patterns in order, discard all others -    p=${ICASE}"/*${(j:[^/]#:)argv}[^/]#" -    m=( ${(M)dmatching:#${~p}} ) -    [[ -d ${m[1]} ]] && dmatching=( $m ) -      # do not match $HOME or $PWD when run without arguments      if [[ $# == 0 ]]; then          dmatching=( ${dmatching:#(${HOME}|${PWD})} ) @@ -302,6 +335,9 @@ _scd_Y19oug_match() {      # discard all directories below the rank threshold      threshold=$(( maxrank * SCD_THRESHOLD )) +    if [[ -n ${opt_all} ]]; then +        threshold=0 +    fi      dmatching=( ${^dmatching}(Ne:'(( ${drank[$REPLY]} >= threshold ))':) )  } @@ -339,6 +375,7 @@ fi  ## here we have multiple matches - display selection menu  a=( {a-z} {A-Z} ) +a=( ${a[1,${#dmatching}]} )  p=( )  for i in {1..${#dmatching}}; do      [[ -n ${a[i]} ]] || break diff --git a/plugins/svn/svn.plugin.zsh b/plugins/svn/svn.plugin.zsh index ef6da5bd3..ba281d790 100644 --- a/plugins/svn/svn.plugin.zsh +++ b/plugins/svn/svn.plugin.zsh @@ -77,7 +77,7 @@ function svn_dirty() {  function svn_dirty_choose_pwd () {    if in_svn; then -    root=`pwd` +    root=$PWD      if $(svn status $root 2> /dev/null | grep -Eq '^\s*[ACDIM!?L]'); then        # Grep exits with 0 when "One or more lines were selected", return "dirty".        echo $1 diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh index f5e44c66f..4ae70dfa7 100644 --- a/plugins/systemadmin/systemadmin.plugin.zsh +++ b/plugins/systemadmin/systemadmin.plugin.zsh @@ -30,7 +30,7 @@ function retlog() {  }  alias ping='ping -c 5' -alias clr='clear;echo "Currently logged in on $(tty), as $(whoami) in directory $(pwd)."' +alias clr='clear;echo "Currently logged in on $(tty), as $USER in directory $PWD."'  alias path='echo -e ${PATH//:/\\n}'  alias mkdir='mkdir -pv'  # get top process eating memory diff --git a/plugins/vim-interaction/vim-interaction.plugin.zsh b/plugins/vim-interaction/vim-interaction.plugin.zsh index 5142f1f9b..b0b9414cd 100644 --- a/plugins/vim-interaction/vim-interaction.plugin.zsh +++ b/plugins/vim-interaction/vim-interaction.plugin.zsh @@ -9,7 +9,7 @@ function resolveFile    if [ -f "$1" ]; then      echo $(readlink -f "$1")    elif [[ "${1#/}" == "$1" ]]; then -    echo "$(pwd)/$1" +    echo "$PWD/$1"    else      echo $1    fi diff --git a/plugins/virtualenv/virtualenv.plugin.zsh b/plugins/virtualenv/virtualenv.plugin.zsh index 8e06450b1..e250eb63e 100644 --- a/plugins/virtualenv/virtualenv.plugin.zsh +++ b/plugins/virtualenv/virtualenv.plugin.zsh @@ -1,7 +1,6 @@  function virtualenv_prompt_info(){ -  if [[ -n $VIRTUAL_ENV ]]; then -    printf "%s[%s] " "%{${fg[yellow]}%}" ${${VIRTUAL_ENV}:t} -  fi +  [[ -n ${VIRTUAL_ENV} ]] || return +  echo "${ZSH_THEME_VIRTUALENV_PREFIX:=[}${VIRTUAL_ENV:t}${ZSH_THEME_VIRTUALENV_SUFFIX:=]}"  }  # disables prompt mangling in virtual_env/bin/activate diff --git a/plugins/wd/README.md b/plugins/wd/README.md index bc0ebe334..bcfeab684 100644 --- a/plugins/wd/README.md +++ b/plugins/wd/README.md @@ -1,8 +1,60 @@ -## wd +wd +== + +[](https://travis-ci.org/mfaerevaag/wd) + +`wd` (*warp directory*) lets you jump to custom directories in zsh, without using `cd`. Why? Because `cd` seems ineffecient when the folder is frequently visited or has a long path. + + +### Setup + +### oh-my-zsh + +`wd` comes bundles with [oh-my-zshell](https://github.com/robbyrussell/oh-my-zsh)! + +Just add the plugin in your `~/.zshrc` file: + +    plugins=(... wd) + + +#### Automatic + +Run either in terminal: + + * `curl -L https://github.com/mfaerevaag/wd/raw/master/install.sh | sh` + + * `wget --no-check-certificate https://github.com/mfaerevaag/wd/raw/master/install.sh -O - | sh` + + +#### Manual + + * Clone this repo to your liking + + * Add `wd` function to `.zshrc` (or `.profile` etc.): + +        wd() { +            . ~/paht/to/wd/wd.sh +        } + + * Install manpage. From `wd`'s base directory (requires root permissions): + +        # cp wd.1 /usr/share/man/man1/wd.1 +        # chmod 644 /usr/share/man/man1/wd.1 + +    Note, when pulling and updating `wd`, you'll need to do this again in case of changes to the manpage. + + +#### Completion + +If you're NOT using [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh) and you want to utelize the zsh-completion feature, you will also need to add the path to your `wd` installation (`~/bin/wd` if you used the automatic installer) to your `fpath`. E.g. in your `~/.zshrc`: + +    fpath=(~/path/to/wd $fpath) + +Also, you may have to force a rebuild of `zcompdump` by running: + +    $ rm -f ~/.zcompdump; compinit -**Maintainer:** [mfaerevaag](https://github.com/mfaerevaag) -`wd` (*warp directory*) lets you jump to custom directories in zsh, without using `cd`. Why? Because `cd` seems ineffecient when the folder is frequently visited or has a long path. [Source](https://github.com/mfaerevaag/wd)  ### Usage @@ -24,6 +76,7 @@          $ wd ...      This is a wrapper for the zsh `dirs` function. +    (You might need `setopt AUTO_PUSHD` in your `.zshrc` if you hare not using [oh-my-zshell](https://github.com/robbyrussell/oh-my-zsh)).   * Remove warp point test point: @@ -33,8 +86,55 @@          $ wd ls - * List warp points to current directory + * List warp points to current directory, or optionally, path to given warp point:          $ wd show - * Print usage with no opts or the `help` argument. + * Remove warp points to non-existent directories. + +        $ wd clean + +    Use `clean!` to not be prompted with confirmation (force). + + * Print usage with no opts or the `help` argument: + +        $ wd help + + * Print the running version of `wd`: + +        $ wd --version + + * Specifically set the config file (default `~/.warprc`), which is useful when testing: + +        $ wd --config ./file <action> + + * Force `exit` with return code after running. This is not default, as it will *exit your terminal*, though required when testing/debugging. + +        $ wd --debug <action> + + * Silence all output: + +        $ wd --quiet <action> + + +### Testing + +`wd` comes with a small test suite, run with [shunit2](https://code.google.com/p/shunit2/). This can be used to confirm that things are working as it should on your setup, or to demonstrate an issue. + +To run, simply `cd` into the `test` directory and run the `tests.sh`. + +    $ ./tests.sh + + +### License + +The project is licensed under the [MIT-license](https://github.com/mfaerevaag/wd/blob/master/LICENSE). + + +### Finally + +If you have issues, feedback or improvements, don't hesitate to report it or submit a pull-request. In the case of an issue, we would much appreciate if you would include a failing test in `test/tests.sh`. Explanation on how to run the tests, read the section "Testing" in this README. + +Credit to [altschuler](https://github.com/altschuler) for awesome idea. + +Hope you enjoy! diff --git a/plugins/wd/_wd.sh b/plugins/wd/_wd.sh index 0b03d8fff..2bb58dd31 100644 --- a/plugins/wd/_wd.sh +++ b/plugins/wd/_wd.sh @@ -21,7 +21,8 @@ function _wd() {      'add!:Overwrites existing warp point'      'rm:Removes the given warp point'      'ls:Outputs all stored warp points' -    'show:Outputs all warp points that point to the current directory' +    'show:Outputs all warp points that point to the current directory or shows a specific target directory for a point' +    'show:Outputs all warp points that point to the current directory or shows a specific target directory for a point'      'help:Show this extremely helpful text'      '..:Go back to last directory'    ) @@ -43,6 +44,9 @@ function _wd() {          add)            _message 'Write the name of your warp point' && ret=0            ;; +        show) +          _describe -t points "Warp points" warp_points && ret=0 +          ;;        esac        ;;    esac diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh index dfb9ad89a..5ecbdc503 100755 --- a/plugins/wd/wd.sh +++ b/plugins/wd/wd.sh @@ -7,40 +7,108 @@  #  # @github.com/mfaerevaag/wd - -## variables -readonly CONFIG=$HOME/.warprc +# version +readonly WD_VERSION=0.4  # colors -readonly BLUE="\033[96m" -readonly GREEN="\033[92m" -readonly YELLOW="\033[93m" -readonly RED="\033[91m" -readonly NOC="\033[m" +readonly WD_BLUE="\033[96m" +readonly WD_GREEN="\033[92m" +readonly WD_YELLOW="\033[93m" +readonly WD_RED="\033[91m" +readonly WD_NOC="\033[m" +## functions -## init +# helpers +wd_yesorno() +{ +    # variables +    local question="${1}" +    local prompt="${question} " +    local yes_RETVAL="0" +    local no_RETVAL="3" +    local RETVAL="" +    local answer="" + +    # read-eval loop +    while true ; do +        printf $prompt +        read -r answer + +        case ${answer:=${default}} in +            Y|y|YES|yes|Yes ) +                RETVAL=${yes_RETVAL} && \ +                    break +                ;; +            N|n|NO|no|No ) +                RETVAL=${no_RETVAL} && \ +                    break +                ;; +            * ) +                echo "Please provide a valid answer (y or n)" +                ;; +        esac +    done -# check if config file exists -if [ ! -e $CONFIG ] -then -    # if not, create config file -    touch $CONFIG -fi +    return ${RETVAL} +} -# load warp points -typeset -A points -while read -r line -do -    arr=(${(s,:,)line}) -    key=${arr[1]} -    val=${arr[2]} +wd_print_msg() +{ +    if [[ -z $wd_quiet_mode ]] +    then +        local color=$1 +        local msg=$2 -    points[$key]=$val -done < $CONFIG +        if [[ $color == "" || $msg == "" ]] +        then +            print " ${WD_RED}*${WD_NOC} Could not print message. Sorry!" +        else +            print " ${color}*${WD_NOC} ${msg}" +        fi +    fi +} +wd_print_usage() +{ +    cat <<- EOF +Usage: wd [command] <point> -## functions +Commands: +	add <point>	Adds the current working directory to your warp points +	add! <point>	Overwrites existing warp point +	rm <point>	Removes the given warp point +	show		Print warp points to current directory +	show <point>	Print path to given warp point +	ls		Print all stored warp points +	clean!		Remove points warping to nonexistent directories + +	-v | --version	Print version +	-d | --debug	Exit after execution with exit codes (for testing) +	-c | --config	Specify config file (default ~/.warprc) +	-q | --quiet	Suppress all output + +	help		Show this extremely helpful text +EOF +} + +wd_exit_fail() +{ +    local msg=$1 + +    wd_print_msg $WD_RED $1 +    WD_EXIT_CODE=1 +} + +wd_exit_warn() +{ +    local msg=$1 + +    wd_print_msg $WD_YELLOW $msg +    WD_EXIT_CODE=1 +} + +# core  wd_warp()  { @@ -50,7 +118,7 @@ wd_warp()      then          if [ $#1 < 2 ]          then -            wd_print_msg $YELLOW "Warping to current directory?" +            wd_exit_warn "Warping to current directory?"          else              (( n = $#1 - 1 ))              cd -$n > /dev/null @@ -59,7 +127,7 @@ wd_warp()      then          cd ${points[$point]}      else -        wd_print_msg $RED "Unknown warp point '${point}'" +        wd_exit_fail "Unknown warp point '${point}'"      fi  } @@ -70,24 +138,28 @@ wd_add()      if [[ $point =~ "^[\.]+$" ]]      then -        wd_print_msg $RED "Warp point cannot be just dots" -    elif [[ $point =~ "(\s|\ )+" ]] +        wd_exit_fail "Warp point cannot be just dots" +    elif [[ $point =~ "[[:space:]]+" ]]      then -        wd_print_msg $RED "Warp point should not contain whitespace" +        wd_exit_fail "Warp point should not contain whitespace"      elif [[ $point == *:* ]]      then -        wd_print_msg $RED "Warp point cannot contain colons" +        wd_exit_fail "Warp point cannot contain colons"      elif [[ $point == "" ]]      then -        wd_print_msg $RED "Warp point cannot be empty" +        wd_exit_fail "Warp point cannot be empty"      elif [[ ${points[$2]} == "" ]] || $force      then          wd_remove $point > /dev/null -        printf "%q:%q\n" "${point}" "${PWD}" >> $CONFIG +        printf "%q:%s\n" "${point}" "${PWD}" >> $WD_CONFIG + +        wd_print_msg $WD_GREEN "Warp point added" -        wd_print_msg $GREEN "Warp point added" +        # override exit code in case wd_remove did not remove any points +        # TODO: we should handle this kind of logic better +        WD_EXIT_CODE=0      else -        wd_print_msg $YELLOW "Warp point '${point}' already exists. Use 'add!' to overwrite." +        wd_exit_warn "Warp point '${point}' already exists. Use 'add!' to overwrite."      fi  } @@ -97,20 +169,21 @@ wd_remove()      if [[ ${points[$point]} != "" ]]      then -        if sed -i.bak "s,^${point}:.*$,,g" $CONFIG +        local config_tmp=$WD_CONFIG.tmp +        if sed -n "/^${point}:.*$/!p" $WD_CONFIG > $config_tmp && mv $config_tmp $WD_CONFIG          then -            wd_print_msg $GREEN "Warp point removed" +            wd_print_msg $WD_GREEN "Warp point removed"          else -            wd_print_msg $RED "Something bad happened! Sorry." +            wd_exit_fail "Something bad happened! Sorry."          fi      else -        wd_print_msg $RED "Warp point was not found" +        wd_exit_fail "Warp point was not found"      fi  }  wd_list_all()  { -    wd_print_msg $BLUE "All warp points:" +    wd_print_msg $WD_BLUE "All warp points:"      while IFS= read -r line      do @@ -120,66 +193,146 @@ wd_list_all()              key=${arr[1]}              val=${arr[2]} -            printf "%20s  ->  %s\n" $key $val +            if [[ -z $wd_quiet_mode ]] +            then +                printf "%20s  ->  %s\n" $key $val +            fi          fi -    done <<< $(sed "s:${HOME}:~:g" $CONFIG) +    done <<< $(sed "s:${HOME}:~:g" $WD_CONFIG)  }  wd_show()  { -    local cwd=$(print $PWD | sed "s:^${HOME}:~:") - -    wd_print_msg $BLUE "Warp points to current directory:" -    wd_list_all | grep -e "${cwd}$" +    local name_arg=$1 +    # if there's an argument we look up the value +    if [[ ! -z $name_arg ]] +    then +        if [[ -z $points[$name_arg] ]] +        then +            wd_print_msg $WD_BLUE "No warp point named $name_arg" +        else +            wd_print_msg $WD_GREEN "Warp point: ${WD_GREEN}$name_arg${WD_NOC} -> $points[$name_arg]" +        fi +    else +        # hax to create a local empty array +        local wd_matches +        wd_matches=() +        # do a reverse lookup to check whether PWD is in $points +        if [[ ${points[(r)$PWD]} == $PWD ]] +        then +            for name in ${(k)points} +            do +                if [[ $points[$name] == $PWD ]] +                then +                    wd_matches[$(($#wd_matches+1))]=$name +                fi +            done + +            wd_print_msg $WD_BLUE "$#wd_matches warp point(s) to current directory: ${WD_GREEN}$wd_matches${WD_NOC}" +        else +            wd_print_msg $WD_YELLOW "No warp point to $(echo $PWD | sed "s:$HOME:~:")" +        fi +    fi  } -wd_print_msg() -{ -    local color=$1 -    local msg=$2 +wd_clean() { +    local force=$1 +    local count=0 +    local wd_tmp="" + +    while read line +    do +        if [[ $line != "" ]] +        then +            arr=(${(s,:,)line}) +            key=${arr[1]} +            val=${arr[2]} -    if [[ $color == "" || $msg == "" ]] +            if [ -d "$val" ] +            then +                wd_tmp=$wd_tmp"\n"`echo $line` +            else +                wd_print_msg $WD_YELLOW "Nonexistent directory: ${key} -> ${val}" +                count=$((count+1)) +            fi +        fi +    done < $WD_CONFIG + +    if [[ $count -eq 0 ]]      then -        print " ${RED}*${NOC} Could not print message. Sorry!" +        wd_print_msg $WD_BLUE "No warp points to clean, carry on!"      else -        print " ${color}*${NOC} ${msg}" +        if $force || wd_yesorno "Removing ${count} warp points. Continue? (Y/n)" +        then +            echo $wd_tmp >! $WD_CONFIG +            wd_print_msg $WD_GREEN "Cleanup complete. ${count} warp point(s) removed" +        else +            wd_print_msg $WD_BLUE "Cleanup aborted" +        fi      fi  } -wd_print_usage() -{ -    cat <<- EOF -Usage: wd [add|-a|--add] [rm|-r|--remove] <point> +local WD_CONFIG=$HOME/.warprc +local WD_QUIET=0 +local WD_EXIT_CODE=0 +local WD_DEBUG=0 -Commands: -	add	Adds the current working directory to your warp points -	add!	Overwrites existing warp point -	rm	Removes the given warp point -	show	Outputs warp points to current directory -	ls	Outputs all stored warp points -	help	Show this extremely helpful text -EOF -} +# Parse 'meta' options first to avoid the need to have them before +# other commands. The `-D` flag consumes recognized options so that +# the actual command parsing won't be affected. +zparseopts -D -E \ +    c:=wd_alt_config -config:=wd_alt_config \ +    q=wd_quiet_mode -quiet=wd_quiet_mode \ +    v=wd_print_version -version=wd_print_version \ +    d=wd_debug_mode -debug=wd_debug_mode -## run +if [[ ! -z $wd_print_version ]] +then +    echo "wd version $WD_VERSION" +fi + +if [[ ! -z $wd_alt_config ]] +then +    WD_CONFIG=$wd_alt_config[2] +fi + +# check if config file exists +if [ ! -e $WD_CONFIG ] +then +    # if not, create config file +    touch $WD_CONFIG +fi + +# load warp points +typeset -A points +while read -r line +do +    arr=(${(s,:,)line}) +    key=${arr[1]} +    val=${arr[2]} + +    points[$key]=$val +done < $WD_CONFIG  # get opts -args=$(getopt -o a:r:lhs -l add:,rm:,ls,help,show -- $*) +args=$(getopt -o a:r:c:lhs -l add:,rm:,clean\!,ls,help,show -- $*) -# check if no arguments were given -if [[ $? -ne 0 || $#* -eq 0 ]] +# check if no arguments were given, and that version is not set +if [[ ($? -ne 0 || $#* -eq 0) && -z $wd_print_version ]]  then      wd_print_usage -# check if config file is writeable -elif [ ! -w $CONFIG ] +    # check if config file is writeable +elif [ ! -w $WD_CONFIG ]  then      # do nothing      # can't run `exit`, as this would exit the executing shell -    wd_print_msg $RED "\'$CONFIG\' is not writeable." +    wd_exit_fail "\'$WD_CONFIG\' is not writeable."  else + +    # parse rest of options      for o      do          case "$o" @@ -205,7 +358,15 @@ else                  break                  ;;              -s|--show|show) -                wd_show +                wd_show $2 +                break +                ;; +            -c|--clean|clean) +                wd_clean false +                break +                ;; +            -c!|--clean!|clean!) +                wd_clean true                  break                  ;;              *) @@ -229,8 +390,19 @@ unset wd_remove  unset wd_show  unset wd_list_all  unset wd_print_msg +unset wd_yesorno  unset wd_print_usage +unset wd_alt_config +unset wd_quiet_mode +unset wd_print_version  unset args  unset points  unset val &> /dev/null # fixes issue #1 + +if [[ ! -z $wd_debug_mode ]] +then +    exit $WD_EXIT_CODE +else +    unset wd_debug_mode +fi diff --git a/plugins/xcode/xcode.plugin.zsh b/plugins/xcode/xcode.plugin.zsh index e59bee8c7..b7b75cf93 100644 --- a/plugins/xcode/xcode.plugin.zsh +++ b/plugins/xcode/xcode.plugin.zsh @@ -16,4 +16,9 @@ function xcsel {  alias xcb='xcodebuild'  alias xcp='xcode-select --print-path' -alias simulator='open $(xcode-select  -p)/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app' + +if [[ -d $(xcode-select -p)/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app ]]; then +  alias simulator='open $(xcode-select -p)/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app' +else +  alias simulator='open $(xcode-select -p)/Applications/iOS\ Simulator.app' +fi | 
