从XCode 4.2外部跳转到文件和行

时间:2011-10-31 17:04:34

标签: xcode xcode4 applescript xcode4.2 developer-tools

对于NSLogger项目,我们希望实现该功能,直接跳回XCode到发出日志条目的文件中的行。人们可以期望使用命令行工具这样很容易:

xed --line 100 ~/work/xyz/MainWindowController.m

但这会导致意外错误:

  

2011-10-31 17:37:36.159 xed [53507:707]错误:错误   Domain = NSOSStatusErrorDomain Code = -1728“操作不能   完成。 (OSStatus错误-1728。)“(例如:说明符要求的   3,但只有2.基本上,这表示运行时   分辨率错误。 )UserInfo = 0x40043dc20 {ErrorNumber = -1728,   ErrorOffendingObject =}

另一个想法是使用AppleScript告诉XCode执行所需的步骤,但我找不到可行的解决方案。

所以任何能达到预期效果的解决方案都将非常受欢迎。

参考GitHub上的NSLogger问题:https://github.com/fpillet/NSLogger/issues/30

1 个答案:

答案 0 :(得分:0)

xed工具似乎运行良好:

xed --line 100 /Users/Anne/Desktop/Test/TestAppDelegate.m

错误

  例如,:说明者要求第3个,但只有2个

上述错误只表示请求的行超出范围。

解决方案

在执行xed之前检查实际存在的行号。

快速编写的示例

// Define file and line number
NSString *filePath = @"/Users/Anne/Desktop/Test/TestAppDelegate.m"; 
int theLine = 100;

// Count lines in file
NSString *fileContent = [[NSString alloc] initWithContentsOfFile: filePath];
unsigned numberOfLines, index, stringLength = [fileContent length];
for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
    index = NSMaxRange([fileContent lineRangeForRange:NSMakeRange(index, 0)]);

// The requested line does not exist
if (theLine > numberOfLines) {
    NSLog(@"Error: The requested line is out of range.");

// The requested line exists
} else {

    // Run xed through AppleScript or NSTask
    NSString *theSource = [NSString stringWithFormat: @"do shell script \"xed --line %d \" & quoted form of \"%@\"", theLine, filePath];        
    NSAppleScript *theScript = [[NSAppleScript alloc] initWithSource:theSource];
    [theScript executeAndReturnError:nil];

}

注意

确保正确计算行数: Counting Lines of Text