簡體   English   中英

如何將TextMate中的一行發送到在終端窗口中運行的irb進程?

[英]How can I send an line in TextMate to an irb process running in an Terminal window?

我經常使用TextMate窗口打開代碼,並在與其相鄰的終端窗口中進行irb處理。 我希望能夠在TextMate中按下一個鍵序列,它執行以下操作:

  1. 復制當前選擇,如果沒有,則復制當前行。
  2. 將其粘貼到運行irb的最頂層終端窗口中。
  3. 按下輸入,以便在irb窗口中執行代碼行。

我在R中編碼時使用了這種交互式開發方式,發現非常方便。 我很確定emacs和SLIME也讓你像這樣工作。 Ruby和TextMate有可能嗎?

您必須創建一個Bundle Command和一個鍵盤快捷鍵才能執行此操作。

  1. 在TextMate中,轉到Bundles - > Bundle Editor
  2. 在我們自己的Bundle中創建一個新命令。 稱之為“在終端執行”
  3. 將“保存”設置為“無”,將“輸入”設置為“選定文本”,將“或”設置為“線”。
  4. 將“輸出設置為丟棄”
  5. 在“激活”中選擇您自己的快捷方式。 我選擇了Apple Shift U.
  6. 將下面的命令粘貼到“命令”框中(格式化導致我的麻煩)
  7. 關閉Bundle Editor,然后選擇Bundles - > Bundle Editor - > Reload Bundles
  8. 創建一個包含'puts“Hello World”'行的新文檔
  9. 在終端中打開IRB
  10. 選擇剛剛在Textmate中編寫的行,然后按鍵盤快捷鍵。
  11. 觀看“Hello World”出現在IRB中。

命令:

#!/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`

假設您不想查看終端,而是希望結果顯示在TextMate中,就像在Smalltalk工作區中一樣。

實質上,您希望在文本配合中運行ruby,但是您希望在執行之間記住變量。 你可以擁有它。

(感謝stef獲取有關如何添加新命令的說明)

  1. 運行gem install daemons
  2. 運行irb服務器。 該文件如下。
  3. 在TextMate中,轉到Bundles - > Bundle Editor
  4. 在我們自己的Bundle中創建一個新命令。 稱之為“在終端執行”
  5. 將“保存”設置為“無”,將“輸入”設置為“選定文本”,將“或”設置為“線”。
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM