3

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

  1. 复制当前选择,如果没有,则复制当前行。
  2. 将其粘贴到运行 irb 的最顶层终端窗口中。
  3. 按下回车键以便在 irb 窗口中执行该行代码。

我在 R 中编码时使用了这种交互开发风格,发现它非常方便。我很确定 emacs 和 SLIME 也可以让你像这样工作。Ruby 和 TextMate 可以吗?

4

2 回答 2

6

您必须创建一个捆绑命令和一个键盘快捷键来执行此操作。

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

命令:

#!/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`
于 2010-12-28T20:16:24.160 回答
0

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

本质上,您希望在 text mate 中运行 ruby​​,但您希望在执行之间记住变量。你可以拥有它。

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

  1. gem install daemons
  2. 运行一个 irb 服务器。该文件如下。
  3. 在 TextMate 中转到 Bundles -> Bundle Editor
  4. 在我们自己的 Bundle 中创建一个新命令。称之为“在终端中执行”
  5. 将“Save”设置为Nothing,将“Input”设置为Selected Text,将“or”设置为Line。
  6. 设置“输出丢弃
  7. 在“激活”中选择您自己的快捷方式。我选择了 Apple Shift U
  8. 将下面的命令粘贴到“命令”框中(格式化给我带来了麻烦)
  9. 关闭 Bundle Editor,然后选择 Bundles -> Bundle Editor -> Reload Bundles
  10. 创建一个包含行的新文档@@hi = "Hello World"@@hi + "ya"
  11. 选择您刚刚在 Textmate 中编写的第一行,然后按键盘快捷键。
  12. 对第二行做同样的事情
  13. 看着“hiya”出现在文本伴侣中。

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
于 2011-12-17T12:10:41.770 回答