mirror of https://github.com/bjeanes/dotfiles.git
40 lines
1.2 KiB
Ruby
40 lines
1.2 KiB
Ruby
|
#!/usr/bin/env ruby
|
||
|
|
||
|
# Save this somewhere, chmod 755 it, then add
|
||
|
# complete -C path/to/this/script -o default rake
|
||
|
# to your ~/.bashrc
|
||
|
#
|
||
|
# If you update your tasks, just $ rm ~/.raketabs*
|
||
|
#
|
||
|
# Adapted from
|
||
|
# http://onrails.org/articles/2006/08/30/namespaces-and-rake-command-completion
|
||
|
|
||
|
exit 0 unless File.file?(File.join(Dir.pwd, 'Rakefile'))
|
||
|
exit 0 unless /^rake\b/ =~ ENV["COMP_LINE"]
|
||
|
|
||
|
def rake_silent_tasks
|
||
|
if File.exists?(dotcache = File.join(File.expand_path('~'), ".raketabs-#{Dir.pwd.hash}"))
|
||
|
File.read(dotcache)
|
||
|
else
|
||
|
tasks = `rake --silent --tasks`
|
||
|
File.open(dotcache, 'w') { |f| f.puts tasks }
|
||
|
tasks
|
||
|
end
|
||
|
end
|
||
|
|
||
|
after_match = $'
|
||
|
task_match = (after_match.empty? || after_match =~ /\s$/) ? nil : after_match.split.last
|
||
|
puts "Run 'rm ~/.raketabs-*' to clean autocomplete cache, first" and exit if rake_silent_tasks.split("\n")[1..-1].nil?
|
||
|
tasks = (rake_silent_tasks.split("\n")[1..-1] || []).map { |line| line.split[1] }
|
||
|
tasks = tasks.select { |t| /^#{Regexp.escape task_match}/ =~ t } if task_match
|
||
|
|
||
|
# handle namespaces
|
||
|
if task_match =~ /^([-\w:]+:)/
|
||
|
upto_last_colon = $1
|
||
|
after_match = $'
|
||
|
tasks = tasks.map { |t| (t =~ /^#{Regexp.escape upto_last_colon}([-\w:]+)$/) ? "#{$1}" : t }
|
||
|
end
|
||
|
|
||
|
puts tasks
|
||
|
exit 0
|