Help with customising the IRB prompt

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.

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 :slight_smile:

Aur S.

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.

IRB.conf[:AUTO_INDENT]=true

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


Giles B.
http://www.gilesgoatboy.org

http://gilesgoatboy.blogspot.com