diff options
Diffstat (limited to 'sh/.config/sh/cdhist.sh')
-rw-r--r-- | sh/.config/sh/cdhist.sh | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/sh/.config/sh/cdhist.sh b/sh/.config/sh/cdhist.sh new file mode 100644 index 0000000..d67d2e9 --- /dev/null +++ b/sh/.config/sh/cdhist.sh @@ -0,0 +1,174 @@ +### cdhist.sh +### +### Copyright (c) 2001 Yusuke Shinyama <yusuke at cs . nyu . edu> +### +### Permission to use, copy, modify, distribute this software and +### its documentation for any purpose is hereby granted, provided +### that existing copyright notices are retained in all copies and +### that this notice is included verbatim in any distributions. +### This software is provided ``AS IS'' without any express or implied +### warranty. +### + +### WARNING: THIS SCRIPT IS FOR GNU BASH ONLY! + +### What is this? +### +### Cdhist adds 'web-browser like history' to your bash shell. +### Every time you change the current directory it records the directory +### you can go back by simply typing a short command such as '-' or '+', +### just like clicking web-browsers's 'back' button. +### It's more convenient than using directory stacks when +### you walk around two or three directories. +### + +### Usage +### +### Just call this file from your .bashrc script. +### The following commands are added. +### +### cd [pathname] +### Go to the given directory, or your home directory if +### pathname is omitted. This overrides the original command. +### You can use it by typing '\cd'. +### +### + [n] +### 'Forward' button. Go to the n'th posterior directory in the history. +### Go to the next directory if the number is omitted. +### +### - [n] +### 'Back' button. Go to the n'th prior directory in the history. +### Go to the previous directory if the number is omitted. +### +### = [n] +### Show histories with directory numbers. +### +### A directory number shows the index to the current directory +### in the history. The current directory always has directory number 0. +### For prior directories, a negative number is given. +### For posterior directories, a positive number is given. +### +### cdhist_reset +### Clear the cd history. +### + +### Example +### +### /home/yusuke:$ . cdhist.sh +### /home/yusuke:$ cd /tmp +### /tmp:$ cd /usr/bin +### /usr/bin:$ cd /etc +### /etc:$ - +### /usr/bin:$ - +### /tmp:$ + +### /usr/bin:$ = +### -2 ~ +### -1 /tmp +### 0:/usr/bin +### 1 /etc +### /usr/bin:$ - 2 +### /home/yusuke:$ +### + + +CDHIST_CDQMAX=10 +declare -a CDHIST_CDQ + +function cdhist_reset { + CDHIST_CDQ=("$PWD") +} + +function cdhist_disp { + echo "$*" | sed "s $HOME ~ g" +} + +function cdhist_add { + CDHIST_CDQ=("$1" "${CDHIST_CDQ[@]}") +} + +function cdhist_del { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + local i=${1-0} + if [ ${#CDHIST_CDQ[@]} -le 1 ]; then return; fi + for ((; i<${#CDHIST_CDQ[@]}-1; i++)); do + CDHIST_CDQ[$i]="${CDHIST_CDQ[$((i+1))]}" + done + unset CDHIST_CDQ[$i] +} + +function cdhist_rot { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + local i q + declare -a q + for ((i=0; i<$1; i++)); do + q[$i]="${CDHIST_CDQ[$(((i+$1+$2)%$1))]}" + done + for ((i=0; i<$1; i++)); do + CDHIST_CDQ[$i]="${q[$i]}" + done +} + +function cdhist_cd { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + local i f=0 + builtin cd "$@" || return 1 + for ((i=0; i<${#CDHIST_CDQ[@]}; i++)); do + if [ "${CDHIST_CDQ[$i]}" = "$PWD" ]; then f=1; break; fi + done + if [ $f -eq 1 ]; then + cdhist_rot $((i+1)) -1 + elif [ ${#CDHIST_CDQ[@]} -lt $CDHIST_CDQMAX ]; then + cdhist_add "$PWD" + else + cdhist_rot ${#CDHIST_CDQ[@]} -1 + CDHIST_CDQ[0]="$PWD" + fi +} + +function cdhist_history { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + local i d + if [ $# -eq 0 ]; then + for ((i=${#CDHIST_CDQ[@]}-1; 0<=i; i--)); do + cdhist_disp " $i ${CDHIST_CDQ[$i]}" + done + elif [ "$1" -lt ${#CDHIST_CDQ[@]} ]; then + d=${CDHIST_CDQ[$1]} + if builtin cd "$d"; then + cdhist_rot $(($1+1)) -1 + else + cdhist_del $1 + fi + cdhist_disp "${CDHIST_CDQ[@]}" + fi +} + +function cdhist_forward { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + cdhist_rot ${#CDHIST_CDQ[@]} -${1-1} + if ! builtin cd "${CDHIST_CDQ[0]}"; then + cdhist_del 0 + fi + cdhist_disp "${CDHIST_CDQ[@]}" +} + +function cdhist_back { + [[ -n $ZSH_VERSION ]] && setopt localoptions && setopt ksharrays + cdhist_rot ${#CDHIST_CDQ[@]} ${1-1} + if ! builtin cd "${CDHIST_CDQ[0]}"; then + cdhist_del 0 + fi + cdhist_disp "${CDHIST_CDQ[@]}" +} + + +if [ ${#CDHIST_CDQ[@]} = 0 ]; then cdhist_reset; fi + + +### Aliases +### + +function cd { cdhist_cd "$@"; } +function + { cdhist_forward "$@"; } +function - { cdhist_back "$@"; } +function = { cdhist_history "$@"; } |