Class: Cmd::Prompt
- Inherits:
-
Object
- Object
- Cmd::Prompt
- Defined in:
- lib/ruby/cmd.rb
Overview
This class contains auto complete functionality TODO: should be refactored to a new module
Instance Method Summary collapse
- #cmd_loop ⇒ Object
- #complete ⇒ Object
-
#initialize(class_name, prompt = '> ') ⇒ Prompt
constructor
A new instance of Prompt.
-
#update_complete_commands!(s) ⇒ Object
def complete_git %w(clone init commit status push) end.
Constructor Details
#initialize(class_name, prompt = '> ') ⇒ Prompt
Returns a new instance of Prompt.
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/ruby/cmd.rb', line 22 def initialize(class_name, prompt = '> ') @prompt = prompt @class_name = class_name @complete_commands = [] @initial_complete_commands = [] complete Readline.completion_append_character = ' ' Readline.basic_word_break_characters = '' Readline.completion_proc = proc do |s| s = update_complete_commands! s @complete_commands.grep(/^#{Regexp.escape(s)}/) end end |
Instance Method Details
#cmd_loop ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/ruby/cmd.rb', line 72 def cmd_loop while true line = Readline.readline(@prompt, false) params = line.split unless params.empty? method_names = @class_name.instance_methods.grep(/^do_#{Regexp.escape(params.shift)}$/) send(method_names[0], params.join(' ')) unless method_names.empty? end Readline::HISTORY.push << line if line.to_s.strip != '' end end |
#complete ⇒ Object
39 40 41 42 43 44 45 46 47 48 |
# File 'lib/ruby/cmd.rb', line 39 def complete @complete_commands = ( @class_name.instance_methods.grep(/^do_(.*?)$/).map do |s| s.to_s.sub('do_', '') end) @initial_complete_commands = ( @class_name.instance_methods.grep(/^do_(.*?)$/).map do |s| s.to_s.sub('do_', '') end) end |
#update_complete_commands!(s) ⇒ Object
def complete_git
%w(clone init commit status push)
end
58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/ruby/cmd.rb', line 58 def update_complete_commands! s args = s.split command = args.shift method_names = command.nil? ? [] : @class_name.instance_methods.grep(/^complete_#{Regexp.escape(command)}$/) @complete_commands = if command.nil? or method_names.empty? @initial_complete_commands.clone else send(method_names[0]).map {|s| "#{command} #{s}"} end s end |