# Help with customising the IRB prompt

**URL:** <https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933>\
**Category:** Ruby\
**Created:** [February 17, 2007, 8:26pm UTC](https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933 "2007-02-17T20:26:12Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![bodikp](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e79b87/32.png) [@bodikp](https://www.ruby-forum.com/u/bodikp)\
**Post date:** [February 17, 2007, 8:26pm UTC](https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933/1 "2007-02-17T20:26:12Z")

</div>

Hi, I’m new to this newsgroup, so I’m not sure if this is the right  
place to ask.

Ok, so what I’m trying to do is customise the IRB prompt in a rather  
complicated way: I want to print %i\*2 (or even just %i) spaces at the  
beginning of each line of prompt. Here was my best attempt (not sure  
if there’s a better way to format this for Usenet):

IRB.conf[:PROMPT][:INDENTS] = {  
:PROMPT\_I =\> "#{%i.times {print ’ '}} \>\> ",  
:PROMPT\_S =\> "#{%i.times {print ’ '}} \>\> ",  
:PROMPT\_C =\> "#{%i.times {print ’ '}} \>\> ",  
:RETURN =\> “=\> %s\n”  
}

So, what I want it do is like this:

> > if “Jim” == “Fred”  
> > print “Ruby Sucks!”  
> > else  
> > print “Ruby is cool!”  
> > end  
> > print “And you know it!”

But obviously, It tries to work out the value of the #{ } as soon as  
it’s set, not when it’s displayed, after the %i has been gsub’d for  
displaying. So, I get an error thrown at me.

Does anybody know how to do this? Maybe some printf() trickery?

Thanks in advance.

---

<div class="post-metadata">

**Author:** ![bodikp](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e79b87/32.png) [@bodikp](https://www.ruby-forum.com/u/bodikp)\
**Post date:** [February 17, 2007, 8:38pm UTC](https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933/2 "2007-02-17T20:38:13Z")

</div>

This is a constant so you cannot just assign it a dynamic value.

If you really want, you can assign it an instance of a class that  
exposes an interface similar to that of a Hash but acts dynamically.

You’d still need to somehow get the value of “%i”, whatever that is  
(I’m not familiar with IRB configuration but I know it’s very hard to  
achieve this with Ruby so I just guess you meant @i or something (if  
I’m wrong, sorry)).

You might as well just modify a few lines of IRB code, I guess.

By the way, printf() like formatitng in Ruby has a great syntax:

“%f” % 0.1  
“%d %d” % [1, 2]

(String could be dynamic, Numerics could be dynamic, Array could be  
dynamic).

Have a look at the Adopt-a-newbie thread here in the mailing list 🙂

Aur S.

---

<div class="post-metadata">

**Author:** ![bodikp](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e79b87/32.png) [@bodikp](https://www.ruby-forum.com/u/bodikp)\
**Post date:** [February 17, 2007, 8:43pm UTC](https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933/3 "2007-02-17T20:43:13Z")

</div>

I was a bit unclear, so let me give an example:

class Hashlike \< Hash  
def [] (key)  
return " " \* $indentation\_level if key == :PROMPT\_I  
super  
end  
end

IRB.conf[:PROMPT][:INDENTS] = Hashlike.new( # can I pass a Hash to  
Hash.new ?  
:PROMPT\_I =\> "#{%i.times {print ’ '}} \>\> ",  
:PROMPT\_S =\> "#{%i.times {print ’ '}} \>\> ",  
:PROMPT\_C =\> "#{%i.times {print ’ '}} \>\> ",  
:RETURN =\> “=\> %s\n”

You might be able to achieve a similar effect with a Hash and a  
default block, I don’t remember it’s syntax.

Aur S.

---

<div class="post-metadata">

**Author:** ![bodikp](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/e79b87/32.png) [@bodikp](https://www.ruby-forum.com/u/bodikp)\
**Post date:** [February 18, 2007, 4:43pm UTC](https://www.ruby-forum.com/t/help-with-customising-the-irb-prompt/85933/4 "2007-02-18T16:43:42Z")

</div>

IRB.conf[:AUTO\_INDENT]=true

It’s not actually what you want, but it’s pretty good.

–  
Giles B.  
[http://www.gilesgoatboy.org](http://www.gilesgoatboy.org)

> **[Giles Bowkett](http://gilesbowkett.blogspot.com)**
>
> half-disavowed old blog. new blog at gilesbowkett.com

[http://gilesgoatboy.blogspot.com](http://gilesgoatboy.blogspot.com)
