一位名为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是否有指定活动文件路径的启动参数。 –