1 47e99d0e 2020-11-07 op If you use the shell a lot, you may find this advice useful, in case you didn't already knew it. There's an environment variable called CDPATH, used by most shell I know and others cli tools, whose raison d'être is to simplify ‘cd’-ing around.
3 47e99d0e 2020-11-07 op As various environmental variables in UNIX, its value is a list of directories separated by colons, just like PATH. For instance, this is what I currently have in my ‘~/.kshrc’:
6 47e99d0e 2020-11-07 op export CDPATH=.:$HOME/w:/usr/ports
9 47e99d0e 2020-11-07 op With that in place, no matter where my current working directory is, I can ‘cd games/godot’ and jump to ‘/usr/ports/games/godot’!
11 47e99d0e 2020-11-07 op A note of warning: ‘.’ (the dot aka your current working directory) should be present in your $CDPATH, otherwise you won't be able to ‘cd’ into directories not found in your $CDPATH (you can still use ‘cd ./$somedir’, but isn't probably what you want).
13 47e99d0e 2020-11-07 op ## Programs that I know respect $CDPATH
15 47e99d0e 2020-11-07 op Since the entry would be too short otherwise, here's some programs that I know respect $CDPATH, and how they behave.
17 47e99d0e 2020-11-07 op ### ksh (OpenBSD pdksh)
19 47e99d0e 2020-11-07 op Just as I showed you up there. When you ‘cd’ into a directory inside your $CDPATH it will print your new current working directory:
22 47e99d0e 2020-11-07 op $ cd games/godot
23 47e99d0e 2020-11-07 op /usr/ports/games/godot
26 47e99d0e 2020-11-07 op It will not, however, autocomplete.
30 47e99d0e 2020-11-07 op It will behave just like ksh.
34 47e99d0e 2020-11-07 op zsh respects $CDPATH but it doesn’t seem to do completions :(
38 47e99d0e 2020-11-07 op 9ports’ rc does not seem to inherit $CDPATH, but you can set it (unsurprisingly) with
41 47e99d0e 2020-11-07 op cdpath=(. /usr/ports)
44 47e99d0e 2020-11-07 op in your ‘~/lib/profile’. Other versions of rc (I'm talking about the one you get with the rc package on FreeBSD) do inherit it, so double check!
46 47e99d0e 2020-11-07 op Additionally, rc prints the ‘pwd’ only if you're ‘cd’-ing into something that's not within the current directory. So:
51 47e99d0e 2020-11-07 op % echo $cdpath
53 47e99d0e 2020-11-07 op % cd bin # won't print /home/op/bin
55 47e99d0e 2020-11-07 op /usr/ports/games
59 47e99d0e 2020-11-07 op ### csh & tcsh
62 47e99d0e 2020-11-07 op set cdpath = (. /usr/ports)
65 47e99d0e 2020-11-07 op for the rest, behaves exactly like `rc`. I don't really use csh, nor tcsh, so I can't make further comments.
69 47e99d0e 2020-11-07 op I've installed fish just for this post. It does respect $CDPATH and, unlike other shells, is also able to do proper autocompletion out-of-the-box!
73 47e99d0e 2020-11-07 op vi will inherit your $CDPATH (but make sure you're exporting it in the environment!). You can also ‘:set cdpath=…’ if you wish. You cannot edit a file like ‘:e games/godot/Makefile’ and expect vi to open ‘/usr/ports/games/godot/Makefile‘ though, you need first to ‘:cd games/godot‘ and then ‘:e Makefile’!
75 47e99d0e 2020-11-07 op ### bonus: Emacs
77 47e99d0e 2020-11-07 op Emacs vanilla ‘M-x cd’ respects your $CDPATH, you just have to delete the default text in the minibuffer. It also does proper autocompletion! Additionally, eshell respects $CDPATH too! Not every other Emacs packages will, however. For instance, ivy doesn't seem to care about it.
79 47e99d0e 2020-11-07 op On the other hand, with Emacs you have other ways to quickly jump around.