Search code examples
ruby

How to write a Ruby command line app that supports tab completion?


I want to write a command line app, a shell if you will, in Ruby.

I want the user to be able to press Tab at certain points and offer completion of values.

How do I do this? What library must I use? Can you point me to some code examples?


Solution

  • Ah, it seems the standard library is my friend after all. What I was looking for is the Readline library.

    Doc and examples here.

    In particular, this is a good example from that page to show how completion works:

    require 'readline'
    
    LIST = [
      'search', 'download', 'open',
      'help', 'history', 'quit',
      'url', 'next', 'clear',
      'prev', 'past'
    ].sort
    
    comp = proc { |s| LIST.grep(/^#{Regexp.escape(s)}/) }
    
    Readline.completion_append_character = " "
    Readline.completion_proc = comp
    
    while line = Readline.readline('> ', true)
      p line
    end
    

    NOTE: The proc receives only the last word entered. If you want the whole line typed so far (because you want to do context-specific completion), add the following line to the above code:

    Readline.completer_word_break_characters = "" #Pass whole line to proc each time
    

    (This is by default set to a list of characters that represent word boundaries and causes only the last word to be passed into your proc).