In my home directory, I have several subdirectories that contain my software projects, for example:
/home/me
/src
/wp-plugin-x
/project-y
/config
/puppet
/nagios
/package-z
Some of these trees can get quite deep, and sometimes, when I’m working in one of the directories deep in the tree, I need to access a file somewhere else in the tree. Now, you can do that via ../../../path/to/file, or ~/src/project/path/to/file, but neither are very efficient. I wanted a way to efficiently refer to the root of the current project.
Finding the root is easy. In my case, $(pwd) | cut -d / -f 1-5 gives me what I need. Now I use some Zsh trickery to efficiently use that in commands. I want ‘~~‘ to expand to this directory. Enter the following code in my .zshrc:
my-expand-tilde() {
local MATCH
if [[ $LBUFFER = *~ ]]; then
p=$(pwd | cut -d / -f 1-5)
LBUFFER=${LBUFFER%~}
LBUFFER+="${p}/"
else
LBUFFER+=~
fi
}
zle -N my-expand-tilde
bindkey "~" my-expand-tilde
Every time you press ‘~’, the widget ‘my-expand-tilde’ is run. If this is the second ‘~’ in a row, it will strip of the previous ‘~’ and add the root of the current project to the command I am typing. So effectively, whenever I type ‘~~’, it is immediately substituted by the directory that I need.
Ideas for this code where borrowed from ZSH-LOVERS(1), look in that page for a widget named ‘rationalise-dot‘.
