Help with customising the IRB prompt

P

Peter B.

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:

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.
 
S

SonOfLilit

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

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:

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.
 
S

SonOfLilit

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


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

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.
 
G

Giles Bowkett

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


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


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

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top