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に既にプロジェクトが開いている場合は、既存のプロジェクトウィンドウが前面に表示されます。
次に、ワークスペースドキュメントがロードされたことを報告するか、20秒が経過するまで、スクリプトはXcodeをポーリングします。
最後に、ワークスペースドキュメントがロードされている場合、ソースファイルを開くようにXcodeに依頼します。 Xcodeは、既存のプロジェクトウィンドウのエディタでソースファイルを開きます。
興味深い問題です。問題は、xibやストーリーボードのように、ロードに時間がかかるファイルでプロジェクトが最後に開いたときに発生します。その場合、Xcodeがxibを読み込んでいる間に、別のプロジェクトファイルを開くように要求すると、新しいファイルが新しいウィンドウで開きます。既存のウィンドウに読み込み中でなければ、既存のウィンドウに新しいファイルを開きます。私はこれをWWDCで質問する質問リストに追加しました。 –
@robmayoffあなたの説明はより正確です.Xcodeが2番目の 'open'が実行されている間に最初のファイルを読み込んでいる場合、2番目のファイルを新しいウィンドウで開きます。それ以外の場合は、既存のエディタで2番目のファイルが開きます。あなたがWWDCで答えを見つけることができたら、本当に感謝しています! 'man open'は' -args'の後にアプリケーションに引数を渡すことができることを示しています。 Xcodeにアクティブなファイルパスを指定するための起動引数があるかどうか尋ねます。 –