2016-08-03 54 views
0

我想從textteditor向我當前的ipython窗口發送一組選定的行(本例中爲TextMate,但這在很大程度上是無關緊要的)。腳本使用bash調用所以它可以接受變量,然後通過Applescript調用將代碼推送到窗口。在終端窗口中將多行引用文本發送到IPython

該當前腳本可以工作,但它一次只能發送一個非嵌套行。有沒有辦法解決這個問題,所以我可以一次發送多個非嵌套的代碼行?

#!/bin/bash 

QUOTED_TEXT=${TM_SELECTED_TEXT//\"/\\\"} 
echo "$QUOTED_TEXT" 

osascript <<- APPLESCRIPT 
    tell application "Terminal" 
     set currentTab to (selected tab of (get first window)) 
     set tabProcs to processes of currentTab 
     set theProc to (end of tabProcs) 
     if theProc is not "Python" then 
      set currentTab to (do script "ipython") 
     end if 

     do script "$QUOTED_TEXT \n" in currentTab 
    end tell 
APPLESCRIPT 

回答

1

我不使用任何商標或IPython的自己,所以不能提供即時解答您確切的問題,但這裏是從終端調用AppleScript的一些基本思路:

  1. 從來沒有過像這樣的論據:這是一個錯誤的引用意外,只是等待發生。將您的AS代碼包裝在on run argv ... end run處理程序中,然後在bash中調用osascript命令時將附加參數附加到該命令中。然後osascript將把這些參數直接傳遞給AppleScript,作爲分配給argv變量的字符串列表。安全和簡單。

  2. 而不是包裝您的AS代碼在bash腳本,只需在您的AS代碼的頂部添加#!/usr/bin/osascript,將其保存在適當的位置,一個純文本文件(如某處你的shell $PATH,如/usr/local/bin) ,然後執行chmod +x /path/to/script以使其可執行。這將允許你直接從終端運行它。

  3. 如果要直接在基於AppleScript的shell腳本中訪問STDIN或環境變量,請使用AppleScript-ObjC橋接分別調用NSFileHandle's fileHandleWithStandardInput()'s readDataToEndOfFile()NSProcessInfo's processInfo()'s environment()。要訪問ARGV,請使用上述的顯式run處理程序。

  4. 默認情況下,osascript自動將run處理程序返回的值寫入STDOUT;或者,您可以隨時通過NSFileHandler直接寫入STDOUT(您可以在run處理程序末尾添加普通的return語句,以確保它不會返回任何內容)。並且osascript自動將log命令的結果寫入STDERR,並在腳本引發未捕獲的異常(例如,使用error ERROR_STRING number ERROR_NUMBER語句直接在AS代碼中引發異常)時將返回碼設置爲非零。

(順便說一句,我寫了一個文件庫不久前,包括用於編寫基於AS shell腳本一堆非常好的處理的我不再開發或支持它自己;然而,各種人都有already forked it,所以如果你做了很多AS + shell工作,你可能會發現它是AS代碼的一個有用的源代碼,可以直接剪切和粘貼,甚至可以直接使用。)

+0

關於第2點,我知道你可以直接調用Applescript,但是據我所知,TextMate只能將它的環境變量傳遞給Bash,Perl,PHP,Python或Ruby。 – WildGunman

+0

環境變量不是特定於語言的。見#3。 – foo

+0

在這裏不要鈍,但Applescript中的Objective-C橋對於非開發人員來說是完全不透明的。是否有任何使用基於簡單工作流的Applescripts的好例子。 – WildGunman

相關問題