2017-06-03 599 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获得此答案!对你表示感谢。 –