function limitStringToWidthByMidpoint
{
  local string="$1"
  local width=$2
  if (( ${#string} > $width )); then
    local splitnum=$((collimit/2))
    echo "$(echo $string | cut -c1-$splitnum) ... $(echo $string | cut -c$((${#string}-$splitnum))-)"
  else
    echo $string
  fi
}

function ss
{
  local c=1
  local collimit=$((${COLUMNS-80}-10))
  dirs -p | tail -n+2 | head -${SS_DISPLAY_LIMIT-1000} | \
  while read f
  do
    echo "$c) "$(limitStringToWidthByMidpoint $f $collimit)
    ((c=c+1))
  done
} 

function csd
{
  local num="${1-}"

  if ! echo "$num" | grep -q '^[0-9][0-9]*$'; then
    local re="$num"
    local num=$(dirs -p | tail -n+2 | grep -n $re | head | cut -f1 -d:)
    if [ -z $num ]; then
      echo "'$re' matched nothing" 1>&2
      return 1
    fi
  elif [ $num -lt 1 ]; then
    echo "usage: csd <number greater than 0 | regex>" 1>&2
    return 1
  fi
  cd -$num
  return $?
} 

function cdb
{
  local dir="$1"
  local old="$PWD"
  local new="$(echo $old | sed -e s%/$dir/.*$%/$dir%)"
  if [[ "$old" != "$new" ]]; then
    cd "$new"
  else
    echo "That evaluated to squat." 1>&2
  fi
}
