Forum: Ruby Help with customising the IRB prompt

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F1cb8a9cfe501fe9a0dfa5b47cafb9c3?d=identicon&s=25 Peter B. (Guest)
on 2007-02-17 20:26
(Received via mailing list)
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.
7b4707f974af261f71943e1f2046c9ee?d=identicon&s=25 SonOfLilit (Guest)
on 2007-02-17 20:38
(Received via mailing list)
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 Saraf
7b4707f974af261f71943e1f2046c9ee?d=identicon&s=25 SonOfLilit (Guest)
on 2007-02-17 20:43
(Received via mailing list)
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
Ce8b03e5750097942c58e12b46724312?d=identicon&s=25 Giles Bowkett (Guest)
on 2007-02-18 16:43
(Received via mailing list)
IRB.conf[:AUTO_INDENT]=true

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

--
Giles Bowkett
http://www.gilesgoatboy.org
http://gilesbowkett.blogspot.com
http://gilesgoatboy.blogspot.com
This topic is locked and can not be replied to.