[TxMt] Interactive Shell for irb
Hans-Jörg Bibiko
bibiko at eva.mpg.de
Sat Dec 22 13:08:55 UTC 2007
> On 21.12.2007, at 20:18, Thomas Aylott - subtleGradient wrote:
>> On Dec 21, 2007, at 8:39 AM, Hans-Jörg Bibiko wrote:
>>> after fixing to run R inside of TM as interactive shell I tried
>>> to run irb and it also works. But one 'only' has to change the
>>> communication between irb and TM slightly. Is someone interested
>>> to do that? ;)
>> DO WHAT?!!!!1! :O
>> Please don't tease us here. You can run IRB interactively from
>> within TextMate? How?
>> What do we need to do to make that work?
> Give me a moment. I will try to modify a bit in order to show
> something basic.
Hi, here comes at least a screencast of an IRBdaemon. To be honest,
I've never used all of irb's possibilities but the basics seem to work.
http://www.bibiko.de/irbdaemon.mov (600kB)
My general approach – in very short terms:
If I have an application which runs in a normal Terminal without any
graphical environment (including such as Midnight Commander, vi,
etc.) **AND** I can find a definable return pattern coming from that
application then I can do the following.
Example for R but it's also applicable in modified form to irb, etc.
If I run R in a Terminal I will have a prompt '> ', I can type a
command '2+3',
press RETURN, and R writes into that Terminal '[1] 5\n> '.
Fine.
Now I run R in a pseudo terminal (meaning a terminal which is hidden
for the user) using Ruby's lib 'pty' (a spawned process).
The output of that pseudo terminal will be written into ~/Rdaemon/
r_out (together with stderr).
Then I created in beforehand a named pipe on ~/Rdaemon/r_in. Into
that pipe I send all commands coming from TM or elsewhere.
Here the daemon as simplified version:
cmd = "R 2&> ~/Rdaemon/r_out"
PTY.spawn(cmd) { |r,w,pid|
# write r into the nirvana
Thread.new {r.read}
fin = File.open('~/Rdaemon/r_in', "r+")
while TRUE
#wait for a new task and send it to R
task = fin.gets
w.puts task
end
}
That means the named pipe r_in is my keyboard and r_out is the
terminal content
Before I send a command to r_in I look for the end of r_out. Then,
after sending, the Rdaemon wrote something into r_out. I wait until R
wrote at the end the pattern '> ' (synchronization). Then I only take
the new piece of r_out and I insert it as snippet (fine-tuned for irb
because irb has a changeable prompt). That's it.
The daemon runs in a while TRUE loop. Caused by the line 'task =
fin.gets' this process needs no cpu while waiting.
If I send 'quit' to r_in it destroys itself.
--Hans
More information about the textmate
mailing list