+bwm() {
+ s bwm-ng -T avg -d
+}
+
+b() {
+ local topb
+ if (( ${#_iankdirb[@]} == 0 )); then
+ echo "nothing left to go back to" >&2
+ return 0
+ fi
+ topb="${_iankdirb[-1]}"
+
+ if [[ $topb == "$PWD" ]] && (( ${#_iankdirb[@]} == 1 )); then
+ echo "already on last back entry" >&2
+ return 0
+ fi
+
+
+ if [[ $topb == "$PWD" ]]; then
+ # add to dirf if not already there
+ if (( ${#_iankdirf[@]} == 0 )) || [[ ${_iankdirf[-1]} != "$topb" ]]; then
+ _iankdirf+=("$topb")
+ fi
+ unset "_iankdirb[-1]"
+ cd "${_iankdirb[-1]}"
+ else
+ if (( ${#_iankdirf[@]} == 0 )) || [[ ${_iankdirf[-1]} != "$PWD" ]]; then
+ _iankdirf+=("$PWD")
+ fi
+ cd "$topb"
+ fi
+
+ # give us a peek at what is next in the list
+ # if (( ${#_iankdirb[@]} >= 2 )); then
+ # printf "%s\n" "${_iankdirb[-2]}"
+ # fi
+}
+
+f() {
+ local topf
+ if (( ${#_iankdirf[@]} == 0 )); then
+ echo "no forward dir left" >&2
+ return 0
+ fi
+ topf="${_iankdirf[-1]}"
+ unset "_iankdirf[-1]"
+ c "$topf"
+
+ # give us a peek at what is next in the list
+ # if (( ${#_iankdirf[@]} )); then
+ # printf "%s\n" "${_iankdirf[-1]}"
+ # fi
+}
+
+# a b c (d)
+## back
+# a b (c)
+# d
+#back
+#a (b)
+#d c
+#back
+#(a)
+#d c b
+#forward
+#a (b)
+#d c
+#
+# a b c
+## back
+# a b
+# (c)
+## forward
+
+cl() {
+ local i line input start tmpfile
+ local -A buttondirs alines
+ local -a buttons dirs lines
+ buttons=( {a..z} {2..9} )
+ if [[ ! -s ~/.iankdirs ]]; then
+ echo nothing in ~/.iankdirs
+ return 0
+ fi
+
+ i=0
+
+ # note, alternate approach like this, made the following read fail
+ # done < <(tac ~/.iankdirs | awk '!seen[$0]++')
+ # bash: read: read error: 0: Input/output error
+ # which went away by adding a sleep 1 after it.
+
+ mapfile -t lines <~/.iankdirs
+ start=$(( ${#lines[@]} - 1 ))
+
+ # we have ~33 buttons as of this writing, so lets
+ # prune down the history every once in a while.
+ if (( start > 500 )); then
+ tmpfile=$(mktemp)
+ tac ~/.iankdirs | awk '!seen[$0]++' | head -n 200 >$tmpfile
+ cat $tmpfile > ~/.iankdirs
+ fi
+
+ for (( j=$start; j >= 0; j-- )); do
+ line="${lines[$j]}"
+ if [[ ! $line || ${alines[$line]} || ! -d "$line" || $line == "$PWD" || line == "$HOME" ]]; then
+ continue
+ fi
+ alines[$line]=t
+ buttondirs[${buttons[i]}]="$line"
+ printf "%s %s\n" ${buttons[i]} "$line"
+ if (( i == ${#buttons[@]} - 1 )); then
+ break
+ fi
+ i=$(( i + 1 ))
+ done
+
+ if (( i == 0 )); then
+ echo "no dirs in ~/.iankdirs"
+ return 0
+ fi
+ read -r -N 1 input
+ if [[ $input != $'\n' ]]; then
+ c ${buttondirs[$input]}
+ fi
+}
+bl() {
+ local start i j max
+ max=10
+ start=$(( ${#_iankdirb[@]} - 1 ))
+
+ # cleanup possible repeating of pwd
+ if (( start >= 0 )) && [[ ${_iankdirb[$start]} == "$PWD" ]]; then
+ start=$(( start - 1 ))
+ fi
+ j=1
+ if (( start >= 0 )); then
+ for (( i=$start; i >= 0 ; i-- )); do
+ printf "%s %s\n" $j ${_iankdirb[i]}
+ j=$(( j + 1 ))
+ if (( j >= max )); then
+ break
+ fi
+ done
+ fi
+
+ max=10
+
+ start=$(( ${#_iankdirf[@]} - 1 ))
+
+ # cleanup possible repeating of pwd
+ if (( start >= 0 )) && [[ ${_iankdirf[$start]} == "$PWD" ]]; then
+ start=$(( start - 1 ))
+ fi
+ if (( start < 0 )); then
+ return 0
+ fi
+ echo --
+ j=1
+ for (( i=$start; i >= 0 ; i-- )); do
+ printf "%s %s\n" $j ${_iankdirf[i]}
+ j=$(( j + 1 ))
+ if (( j >= max )); then
+ break
+ fi
+ done
+}
+
+
+