# Readline + completion of "all files in current directory"

**URL:** <https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497>\
**Category:** Ruby\
**Created:** [November 17, 2007, 4:50pm UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497 "2007-11-17T16:50:03Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![quik77](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/q/dec6dc/32.png) [@quik77](https://www.ruby-forum.com/u/quik77)\
**Post date:** [November 17, 2007, 4:50pm UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497/1 "2007-11-17T16:50:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![quik77](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/q/dec6dc/32.png) [@quik77](https://www.ruby-forum.com/u/quik77)\
**Post date:** [November 17, 2007, 5:01pm UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497/2 "2007-11-17T17:01:22Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![quik77](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/q/dec6dc/32.png) [@quik77](https://www.ruby-forum.com/u/quik77)\
**Post date:** [November 17, 2007, 7:00pm UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497/3 "2007-11-17T19:00:42Z")

</div>

> ~/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 😕

---

<div class="post-metadata">

**Author:** ![quik77](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/q/dec6dc/32.png) [@quik77](https://www.ruby-forum.com/u/quik77)\
**Post date:** [November 18, 2007, 2:09am UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497/4 "2007-11-18T02:09:43Z")

</div>

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 😕

Considering that it’s a bug…I’m not really sure 🙂

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

---

<div class="post-metadata">

**Author:** ![quik77](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/q/dec6dc/32.png) [@quik77](https://www.ruby-forum.com/u/quik77)\
**Post date:** [November 18, 2007, 4:18am UTC](https://www.ruby-forum.com/t/readline-completion-of-all-files-in-current-directory/120497/5 "2007-11-18T04:18:18Z")

</div>

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/](http://codeforpeople.com/)
