Readline + completion of "all files in current directory"

Hi,

I am having a hard time understanding readline. If i have a list of
possible matches for given files (and subdirectories) in a directory,
how can I make readline work with that, so that i can type something
like:

some_method r<TAB>

where some_method would be just a method, and "r" a file in current
directory (ie. rx.rb ry.rb rz.rb files)

Readline.completion_proc = proc do |word|
  Dir['*'].grep(/\A#{Regexp.quote(word)}/)
end
Readline.completion_case_fold = true
# hmm

···

--
Posted via http://www.ruby-forum.com/.

Marc Heiler wrote:

Hi,

I am having a hard time understanding readline. If i have a list of
possible matches for given files (and subdirectories) in a directory,
how can I make readline work with that, so that i can type something
like:

some_method r<TAB>

where some_method would be just a method, and "r" a file in current
directory (ie. rx.rb ry.rb rz.rb files)

Readline.completion_proc = proc do |word|
  Dir['*'].grep(/\A#{Regexp.quote(word)}/)
end
Readline.completion_case_fold = true

This actually already works on JRuby by mistake; something to do with the readline library we use. It's a bug, but it's rather amusing:

~/NetBeansProjects/jruby $ jirb
irb(main):001:0> puts build<tab>
build build-config.xml build.xml build_lib
irb(main):001:0> puts build

- Charlie

cfp:~ > cat a.rb
require 'readline'

class File
   def self.tab arg, prompt = 'directory > '
     candidates = Array === arg ? candidates : Dir[arg]
     Readline.completion_proc = lambda do |abbrev|
       list = candidates.select{|candidate| candidate.index(abbrev) == 0}
       list = list.empty? ? candidates : list
     end
     Readline.readline prompt
   end
end

p File.tab('*').strip

cfp:~ > ruby a.rb
directory > s<tab>
sane_transactions.rb sfctmp.rb site spadoc_watch src sudo
sciruby sif_nighttime_drop source sqlite.sh ss.png svn
directory > si<tab>
sif_nighttime_drop site
directory > site
"site"

a @ http://codeforpeople.com/

···

On Nov 17, 2007, at 8:50 AM, Marc Heiler wrote:

I am having a hard time understanding readline. If i have a list of
possible matches for given files (and subdirectories) in a directory,
how can I make readline work with that, so that i can type something
like:

some_method r<TAB>

where some_method would be just a method, and "r" a file in current
directory (ie. rx.rb ry.rb rz.rb files)

Readline.completion_proc = proc do |word|
  Dir['*'].grep(/\A#{Regexp.quote(word)}/)
end
Readline.completion_case_fold = true
# hmm

--
it is not enough to be compassionate. you must act.
h.h. the 14th dalai lama

~/NetBeansProjects/jruby $ jirb
irb(main):001:0> puts build<tab>
build build-config.xml build.xml build_lib
irb(main):001:0> puts build

Hmm but how does it work?
Guess i have to look at the source :confused:

···

--
Posted via http://www.ruby-forum.com/\.

Marc Heiler wrote:

~/NetBeansProjects/jruby $ jirb
irb(main):001:0> puts build<tab>
build build-config.xml build.xml build_lib
irb(main):001:0> puts build

Hmm but how does it work?
Guess i have to look at the source :confused:

Considering that it's a bug...I'm not really sure :slight_smile:

I believe it has something to do with our readline library (Jline) probably having some default mode where tab completion includes the current directory.

- Charlie