Rake task completion is awesome. A quick google search will hook you up … (here’s one)
Rake completion must invoke rake and that can be SLOW. I use completion to save time … What’s the point on having bash freeze on rake -T for longer than it would take me to type the whole thing?
I took it upon myself to cache the output of rake -T and to use that if it’s available.
function _check_rakefile() {
if [ ! -e Rakefile ]; then
return
fi
if [ -e ".rake_t_cache" ]; then
local tasks=`cat .rake_t_cache | awk ‘{print $2}‘`
else
local tasks=`rake –silent -T | awk ‘{print $2}‘`
fi
COMPREPLY=( $(compgen -W "${tasks}" – $2) )
}
complete -F _check_rakefile -o default rake
The magic is in the .rake_t_cache file. If it’s there, use it, if not … well … we haven’t gained/lost anything, the regular completion behavior is still in place.
Where does .rake_t_cache come from?
function rake_cache() {
rake -T > .rake_t_cache
}
function rake_cache_clear() {
if [ -e ".rake_t_cache" ]; then
rm .rake_t_cache
fi
}
I have been thinking about a way to detect when the cache file needs to be regenerated. However, I leave it in the capable hands of the user. All the time saved completing tasks with the cache will compensate for the inevitable time when the cache will be stale and swear words will be required.