一位名爲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將在現有項目窗口的編輯器中打開源文件。
有趣的問題。當項目最後打開時需要一段時間才能加載,如xib或故事板,這會帶來麻煩。如果是這樣的話,那麼當Xcode忙於加載xib時,如果要求它打開另一個項目文件,它會在新窗口中打開新文件。如果它不忙於在其現有窗口中加載,則會在現有窗口中打開新文件。我已經將這個添加到我在WWDC上提問的問題列表中。 –
@robmayoff您的描述更加準確 - 如果Xcode仍在加載第一個文件,而第二個「open」被執行,它將在新窗口中打開第二個文件。否則,它將在現有編輯器中打開第二個文件。如果您能在WWDC上找到答案,我將非常感激! 'man open'表明你可以在'--args'之後將參數傳遞給應用程序。我會問Xcode是否有指定活動文件路徑的啓動參數。 –