Project

General

Profile

Bug #5057 » readline.c.diff

mfn (Markus Fischer), 07/20/2011 02:10 AM

View differences:

ext/readline/readline.c
*
* Set default if +proc+ is nil.
*
* The String that is passed to the Proc depends on the
* Readline.completer_word_break_characters property. The default settings are
* that “the word under the cursor” is passed to the Proc. This is the normal
* behavior you would expect. So if you had input foo bar⇥ then only 'bar' would
* get passed to the completion Proc.
*
* Its common functionality that on a successful completion you may want to
* append a space character so that the user can immediately start working on
* their next argument. Readline has you covered. Just set
* Readline.completion_append_character.
*
* = Examples
*
* == Completion for a Static List
* 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
* == Completion For Directory Contents
* require 'readline'
*
* Readline.completion_append_character = " "
* Readline.completion_proc = Proc.new do |str|
* Dir[str+'*'].grep( /^#{Regexp.escape(str)}/ )
* end
*
* while line = Readline.readline('> ', true)
* p line
* end
* = Autocompelte strategies
*
* When working with auto-complete there are some strategies that work well. To
* get some ideas you can take a look at the
* completion.rb[http://svn.ruby-lang.org/repos/ruby/trunk/lib/irb/completion.rb]
* file for irb. The common strategy is to take a list of possible strings, and
* filter it down to only those strings that start with a given substring. In
* the above examples I used Enumeration.grep and passed in a regular
* expression. Because the input comes from the user its smart to escape the
* special regular expression characters in the input using Regexp.quote or
* Regexp.escape. The source code looks like this:
* # Straightforward
* regex = Regexp.new( '^' + Regexp.escape(str) )
*
* # Shortcut using Interpolation
* regex = /^#{Regexp.escape(str)}/
* It may also be helpful to check out the abbrev library. Their description
* says it "Calculates the set of unique abbreviations for a given set of
* strings." Here is a quick example:
* require 'abbrev'
* %w[one two three].abbrev
*
* # Results in:
* # { "three"=>"three", "two"=>"two", "tw"=>"two",
* # "o"=>"one", "one"=>"one", "thre"=>"three",
* # "thr"=>"three", "th"=>"three", "on"=>"one" }
*
* Raises ArgumentError exception if +proc+ does not respond to call method.
*
* Raises SecurityError exception if $SAFE is 4.
    (1-1/1)