2017-06-03 595 views
3

打開來自終端的Xcode項目設置爲活動文件很容易:打開Xcode項目,並從終端

open Foo.xcodeproj/

但是,這只是打開項目,並恢復其先前使用UserInterfaceState.xcuserstate狀態 - 所以它只是打開您正在編輯的最後一個活動文件。

有沒有辦法打開Xcode項目指定打開哪個文件?

我已經試過:

  1. 編輯.xcuserstate - 噩夢,不這樣做。
  2. 運行open Foo/Foo.xcodeproj/然後open Foo/Sources/main.swift其中的一些工作,但並不總是。 (如果您剛生成項目並執行此操作,它將打開該項目,然後在另一個窗口中打開該文件。)

任何其他想法?

+0

有趣的問題。當項目最後打開時需要一段時間才能加載,如xib或故事板,這會帶來麻煩。如果是這樣的話,那麼當Xcode忙於加載xib時,如果要求它打開另一個項目文件,它會在新窗口中打開新文件。如果它不忙於在其現有窗口中加載,則會在現有窗口中打開新文件。我已經將這個添加到我在WWDC上提問的問題列表中。 –

+0

@robmayoff您的描述更加準確 - 如果Xcode仍在加載第一個文件,而第二個「open」被執行,它將在新窗口中打開第二個文件。否則,它將在現有編輯器中打開第二個文件。如果您能在WWDC上找到答案,我將非常感激! 'man open'表明你可以在'--args'之後將參數傳遞給應用程序。我會問Xcode是否有指定活動文件路徑的啓動參數。 –

回答

1

一位名爲Mike的Xcode工程師指出我在Xcode的workspace document腳本類的loaded屬性中。通過輪詢,我們可以等到Xcode完成加載項目(包括加載編輯器窗格),然後再請求它打開文件。這允許在其項目窗口中可靠地打開該文件。

這裏是xopen劇本我寫了:

#!/bin/bash 

shopt -s nullglob 

sourceFile="$1" 
case "$sourceFile" in 
    /*) ;; 
    *) sourceFile="$PWD"/"$sourceFile" ;; 
esac 

projectDir="$sourceFile" 
while [[ $projectDir = */* ]]; do 
    projectDir="${projectDir%/*}" 
    candidates=("$projectDir"/*.xcodeproj) 
    candidate="${candidates[0]}" 
    if [[ "$candidate" != "" ]]; then 
    jPath="$candidate" 
    fi 
done 

if [[ "$jPath" = "" ]]; then 
    echo 1>&2 "error: couldn't find .xcodeproj in any parent directory" 
    exit 1 
fi 

exec osascript - "$jPath" "$sourceFile" <<EOF 
on run argv 
    set jPath to item 1 of argv 
    set sourceFile to item 2 of argv 
    tell app "Xcode" 
    set wsDoc to (open jPath) 
    set waitCount to 0 
    repeat until wsDoc's loaded or waitCount ≥ 20 
     set waitCount to waitCount + 1 
     delay 1 
    end repeat 
    if wsDoc's loaded then 
     open sourceFile 
    end if 
    end tell 
end run 
EOF 

此腳本使用殼走了從源文件(假設爲一個命令行參數)目錄樹,直到找到包含Xcode項目目錄包。然後它將路徑傳遞給項目,並將源文件的路徑傳遞給AppleScript。 AppleScript要求Xcode打開該項目。如果Xcode已經打開了項目,它只會將現有的項目窗口放在前面。

接下來,該腳本輪詢Xcode,直到它報告工作空間文檔已加載,或直到20秒過去。

最後,如果加載了工作空間文檔,它會要求Xcode打開源文件。 Xcode將在現有項目窗口的編輯器中打開源文件。

+0

非常好!非常感謝您利用WWDC獲得此答案!對你表示感謝。 –