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

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

Marc H. wrote:

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
build build-config.xml build.xml build_lib
irb(main):001:0> puts build

  • Charlie

~/NetBeansProjects/jruby $ jirb
irb(main):001:0> puts build
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:

Marc H. wrote:

~/NetBeansProjects/jruby $ jirb
irb(main):001:0> puts build
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

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

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

hmm

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
sane_transactions.rb sfctmp.rb site
spadoc_watch src sudo
sciruby sif_nighttime_drop source
sqlite.sh ss.png svn
directory > si
sif_nighttime_drop site
directory > site
“site”

a @ http://codeforpeople.com/