My lowtech solution was just a bunch of aliases for directories i use a lot. Like:
alias .a='cd ~/src/autosqueezer'
alias .g='cd ~/src/gcc-squeeze-plugin'
alias .u='cd ~/src/squeeze-utils'
etc. You have to manage them by hand, but that's easy, and makes the result much more predictable than anything based on history.I also have contextual companions to these, defined as functions, like:
.r() {
local project_root=$(somehow work out the root of the current project)
cd $project_root
}
.b() {
.r
cd build
}