如何将TextMate中的一行发送到在终端窗口中运行的irb进程?

时间:2010-12-24 05:23:26

标签: ruby macos textmate irb

我经常使用TextMate窗口打开代码,并在与其相邻的终端窗口中进行irb处理。我希望能够在TextMate中按下一个键序列,它执行以下操作:

  1. 复制当前选择,如果没有,则复制当前行。
  2. 将其粘贴到运行irb。
  3. 的最顶层终端窗口中
  4. 按下输入,以便在irb窗口中执行代码行。
  5. 我在R中编码时使用了这种交互式开发方式,发现非常方便。我很确定emacs和SLIME也让你像这样工作。是否可以使用Ruby和TextMate?

2 个答案:

答案 0 :(得分:6)

您必须创建一个Bundle Command和一个键盘快捷键才能执行此操作。

  1. 在TextMate中转到Bundles - >捆绑编辑器
  2. 在我们自己的Bundle中创建一个新命令。称之为“在终端执行”
  3. 将“保存”设置为Nothing,将“Input”设置为Selected Text,将“或”设置为Line。
  4. 设置“输出放弃
  5. 在“激活”中选择您自己的快捷方式。我选择了Apple Shift U
  6. 将下面的命令粘贴到“命令”框中(格式化导致我遇到麻烦)
  7. 关闭Bundle Editor,然后选择Bundles - >捆绑编辑器 - > Reload Bundles
  8. 创建一个包含“puts”Hello World“'
  9. 行的新文档
  10. 在终端中打开IRB
  11. 选择刚在Textmate中编写的行,然后按键盘快捷键。
  12. 观看“Hello World”出现在IRB。
  13. 命令:

    #!/usr/bin/ruby
    
    input = STDIN.gets
    
    `osascript << EOF
    
    tell application "Terminal"
      activate
    end tell
    
    delay 1
    
    tell application "System Events"
      keystroke "#{input.gsub('"', '\"')}"
      keystroke return
    end tell
    
    EOF`
    

答案 1 :(得分:0)

假设您不想查看终端,而是希望结果显示在TextMate中,就像在Smalltalk工作区中一样。

本质上,您希望在文本配合中运行ruby,但是您希望在执行之间记住变量。你可以拥有它。

(感谢stef有关如何添加新命令的说明)

  1. 运行gem install daemons
  2. 运行irb服务器。该文件位于下方。
  3. 在TextMate中转到Bundles - &gt;捆绑编辑器
  4. 在我们自己的Bundle中创建一个新命令。称之为&#34;在终端&#34;
  5. 中执行
  6. 设置&#34;保存&#34;没什么,设置&#34;输入&#34;选择文本和&#34;或&#34;到线。
  7. 设置&#34;输出放弃
  8. In&#34;激活&#34;选择自己的快捷方式。我选择了Apple Shift U
  9. 将以下命令粘贴到&#34;命令&#34;框(格式化导致我麻烦)
  10. 关闭Bundle Editor,然后选择Bundles - &gt;捆绑编辑器 - &gt; Reload Bundles
  11. 创建包含第@@hi = "Hello World"行和@@hi + "ya"
  12. 行的新文档
  13. 选择刚刚在Textmate中编写的第一行,然后按键盘快捷键。
  14. 对第二行执行相同的操作
  15. 观看&#34; hiya&#34;出现在文本队友中。
  16. irb服务器:

    #!/usr/bin/env ruby -w
    
    require 'rubygems'
    require 'daemons'
    require 'socket'
    
    LARGE = 100000000
    PIPE = "/tmp/.irbservepipe"
    
    def kill_pipe
        `rm -f #{PIPE}`
    end
    
    def respond_to(pipe)
        inp = pipe.recv LARGE
        inp.nil? and return
        begin
            out = eval(inp)
        rescue Exception => e
            out = e
        end
        pipe.send out.inspect, 0
    end
    
    def ensure_server
        ["EXIT", "INT", "HUP", "TERM"].each {|ea| trap( ea ) { kill_pipe }}
    
        File.exists?(PIPE) and kill_pipe
        server = UNIXServer.new(PIPE)
        loop { 
            c = server.accept
            respond_to c
            c.close
        }
    end
    Daemons.daemonize
    ensure_server
    

    命令:

    #!/usr/bin/env macruby -w
    
    require 'socket'
    
    LARGE = 100000000
    PIPE = "/tmp/.irbservepipe"
    
    input = STDIN.read
    socket = UNIXSocket.new(PIPE)
    socket.send input, 0
    
    puts socket.recv LARGE