Перейти к файлу и строке из-за пределов XCode 4.2

Для проекта NSLogger мы хотели бы реализовать возможность прямого перехода обратно в XCode к строке в файле, которая создала запись в журнале. Можно было бы ожидать, что это будет легко сделать с помощью такого инструмента командной строки:

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

Но это приводит к неожиданной ошибке:

2011-10-31 17:37:36.159 xed[53507:707] Ошибка: Error Domain=NSOSStatusErrorDomain Code=-1728 "Операция не может быть завершена. (Ошибка OSStatus -1728.)" (например,: запрошен спецификатор 3-й, но их только 2. По сути, это указывает на ошибку разрешения во время выполнения.) UserInfo=0x40043dc20 {ErrorNumber=-1728, ErrorOffendingObject=}

Другая идея состоит в том, чтобы использовать AppleScript, чтобы указать XCode выполнить нужные шаги, но мне не удалось найти работающее решение.

Поэтому любое решение для достижения желаемого эффекта будет очень признательно.

Ссылка на проблему NSLogger на GitHub: https://github.com/fpillet/NSLogger/issues/30


person Holtwick    schedule 31.10.2011    source источник
comment
Та же проблема здесь. Я сообщил об ошибке в Apple: rdar://10626303 — см. ее копию на OpenRadar: openradar .appspot.com/radar?id=1480404   -  person Guillaume    schedule 26.12.2011
comment
Аналогичная проблема с исправленной версией в /usr/bin и в /Developer/usr/bin   -  person Guillaume    schedule 28.12.2011


Ответы (1)


Инструмент 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];

}

Примечание

Не забудьте правильно подсчитать количество строк: Подсчет строк текста

person Anne    schedule 01.11.2011
comment
Спасибо, это отличный пример, я многому научился на нем. Но, похоже, это не работает для Xcode 4 на моей машине. Он открывает файл, но не переходит к указанной строке. Моя установка Lion 10.7.2, Xcode 4.2. - person Holtwick; 02.11.2011