1. Scan an eternal history file for `cd` with absolute path except for /tmp/*
2. Sort and filter out duplicates
3. Call fzf and let user pick the desired result
4. Upon selection don't enter the directory but instead type `cd <selection>` into the prompt so that the user can navigate further using <Tab>.
What's nice about this approach is that it automatically builds your bookmarks, but only from `cd` commands where you deliberately used an absolute path.
Here's the code. It has some prerequisites (fzf[0] and ~/.eternal_bash_history[1]) and probably only works with my terminal (Xfce Terminal); it took a bit of tinkering to get it to work.
# ~/bashrc.d/aliases.sh
__b() { # bookmarks; props to fzf for providing examples of READLINE configuration
local selected="cd "$(cat ~/.bash_eternal_history | grep '^cd /' | egrep -v '\.\.|/tmp' | awk '{print $2}' | sort | uniq | fzf --exact)
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
}
bind -m vi-insert -x '"\eb": "__b"' 2>/dev/null
[0]: https://github.com/junegunn/fzf kd foo $PWD # stores as foo
kd f # jumps to foo
kd # in a Ruby project subdir, jumps up to where the Gemfile is
https://github.com/lloeki/dotfiles/blob/master/shell/kd kd f # => jumps to foo
echo $(kd f) # => outputs foo's path
# some creative, if nonsensical, examples:
cp some/file $(kd foo)/app/controllers/whatevs
cp $(kd bar)/Gemfile $(kd foo)/Gemfile
kd foo && cd app/controllers && cp $(kd)/config/whatever .
This is useful and possible because kd's output is stable and predictable: it always returns the last prefix match of the kdrc file (or, without argument, the project's top-level dir), and it returns non-zero rc on failure. Plus zsh will even gladly expand the result on <TAB> for double checking.It's one of those rare tools that interacts with my stream of consciousness which is one step away from mind reading.
I know this is OT but one of the reasons I've switched is history search that actually works.
Since I also love ranger as a file manager, I wrote my own integration of both: https://github.com/fdw/ranger-autojump . It remembers where I went in ranger, and I can also call autojump in ranger.
> autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line.