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 Saraf

···

On 2/17/07, Peter B. <peter.bunyan@googlemail.com> wrote:

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.

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 Saraf

···

On 2/17/07, SonOfLilit <sonoflilit@gmail.com> wrote:

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 Saraf

On 2/17/07, Peter B. <peter.bunyan@googlemail.com> wrote:
> 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.
>

IRB.conf[:AUTO_INDENT]=true

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

···

--
Giles Bowkett
http://www.gilesgoatboy.org

http://gilesgoatboy.blogspot.com

On 2/17/07, SonOfLilit <sonoflilit@gmail.com> wrote:

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 Saraf

On 2/17/07, SonOfLilit <sonoflilit@gmail.com> wrote:
> 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 Saraf
>
> On 2/17/07, Peter B. <peter.bunyan@googlemail.com> wrote:
> > 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.
> >
>