Skip to content
Snippets Groups Projects
Commit 1343029a authored by George Nachman's avatar George Nachman
Browse files

Adhoc build 1.0.0.20140109_220214

parent 57d12708
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -19,6 +19,7 @@
- (void)less;
- (void)_populateMore:(id)sender;
- (void)_doPopulateMore;
- (void)addCommandEntries:(NSArray *)entries context:(NSString *)context;
 
@end
 
Loading
Loading
@@ -8,6 +8,7 @@
#import "VT100Screen.h"
#import "iTermApplicationDelegate.h"
#import "iTermController.h"
#import "CommandHistory.h"
 
#define AcLog DLog
 
Loading
Loading
@@ -235,7 +236,11 @@ const int kMaxResultContextWords = 4;
return similarity;
}
 
- (double)scoreResultNumber:(int)resultNumber queryContext:(NSArray*)queryContext resultContext:(NSArray*)resultContext joiningPrefixLength:(int)joiningPrefixLength word:(NSString*)word
- (double)scoreResultNumber:(int)resultNumber
queryContext:(NSArray*)queryContext
resultContext:(NSArray*)resultContext
joiningPrefixLength:(int)joiningPrefixLength
word:(NSString*)word
{
AcLog(@"Score result #%d with queryContext:%@ and resultContext:%@", resultNumber, [self formatContext:queryContext], [self formatContext:resultContext]);
double similarity = [self contextSimilarityBetweenQuery:queryContext andResult:resultContext] * 2;
Loading
Loading
@@ -548,6 +553,7 @@ const int kMaxResultContextWords = 4;
resultContext:resultContext
joiningPrefixLength:joiningPrefixLength
word:word]];
NSLog(@"Add %@ with score %f", e.mainValue, e.score);
if (whitespaceBeforeCursor_) {
[e setPrefix:[NSString stringWithFormat:@"%@ ", prefix_]];
} else {
Loading
Loading
@@ -599,4 +605,31 @@ const int kMaxResultContextWords = 4;
[self reloadData:YES];
}
 
- (void)addCommandEntries:(NSArray *)entries context:(NSString *)context {
int i = 0;
NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
for (CommandHistoryEntry *entry in entries) {
double score = [self scoreResultNumber:i++
queryContext:context_
resultContext:context_ // Maximize similarity because the whole prompt is in our favor
joiningPrefixLength:[context length]
word:entry.command];
// Boost the score for more uses of the command
score *= sqrt(entry.uses);
// Divide the score by sqrt(the number of days since last use).
NSTimeInterval timeSinceLastUse = now - entry.lastUsed;
score /= MAX(1, sqrt(timeSinceLastUse / (24 * 60 * 60.0)));
score = MIN(5, score); // Limit score of commands so really relevant context has a chance.
NSLog(@"Add command %@ with score %f", entry.command, score);
PopupEntry* e = [PopupEntry entryWithString:[entry.command substringFromIndex:context.length]
score:score];
[e setPrefix:prefix_];
[[self unfilteredModel] addHit:e];
}
[self reloadData:YES];
}
@end
Loading
Loading
@@ -45,25 +45,27 @@ static const int kMaxResults = 20;
self.matchLocation];
}
 
// Used to sort from highest to lowest score. So Ascending means self's score is higher
// than other's.
- (NSComparisonResult)compare:(CommandHistoryEntry *)other {
if (_matchLocation == 0 && other.matchLocation > 0) {
return NSOrderedAscending;
return NSOrderedDescending;
}
if (other.matchLocation == 0 && _matchLocation > 0) {
return NSOrderedDescending;
return NSOrderedAscending;
}
int otherUses = other.uses;
if (_uses < otherUses) {
return NSOrderedAscending;
} else if (_uses > other.uses) {
return NSOrderedDescending;
} else if (_uses > other.uses) {
return NSOrderedAscending;
}
NSTimeInterval otherLastUsed = other.lastUsed;
if (_lastUsed < otherLastUsed) {
return NSOrderedAscending;
} else if (_lastUsed > otherLastUsed) {
return NSOrderedDescending;
} else if (_lastUsed > otherLastUsed) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
Loading
Loading
@@ -118,10 +120,16 @@ static const int kMaxResults = 20;
 
- (NSArray *)autocompleteSuggestionsWithPartialCommand:(NSString *)partialCommand
onHost:(VT100RemoteHost *)host {
if (!partialCommand) {
return nil;
}
NSMutableArray *result = [NSMutableArray array];
for (CommandHistoryEntry *entry in [self commandsForHost:host]) {
NSRange match = [entry.command rangeOfString:partialCommand];
if (match.location != NSNotFound) {
if (match.location == 0) {
// The FinalTerm algorithm doesn't require |partialCommand| to be a prefix of the
// history entry, but based on how our autocomplete works, it makes sense to only
// accept prefixes. Their scoring algorithm is implemented in case this should change.
entry.matchLocation = match.location;
[result addObject:entry];
}
Loading
Loading
@@ -129,14 +137,7 @@ static const int kMaxResults = 20;
// TODO: Cache this.
NSArray *sortedEntries = [result sortedArrayUsingSelector:@selector(compare:)];
NSMutableArray *strings = [NSMutableArray array];
for (CommandHistoryEntry *entry in sortedEntries) {
[strings addObject:entry.command];
if (strings.count == kMaxResults) {
break;
}
}
return strings;
return [sortedEntries subarrayWithRange:NSMakeRange(0, MIN(kMaxResults, sortedEntries.count))];
}
 
#pragma mark - Private
Loading
Loading
@@ -153,7 +154,7 @@ static const int kMaxResults = 20;
NSString *key = [self keyForHost:host];
NSMutableArray *result = _hosts[key];
if (!result) {
_hosts[key] = [NSMutableArray array];
_hosts[key] = result = [NSMutableArray array];
}
return result;
}
Loading
Loading
//
// CommandHistoryView.h
// iTerm
//
// Created by George Nachman on 1/6/14.
//
//
#import <Cocoa/Cocoa.h>
@protocol CommandHistoryViewDelegate <NSObject>
- (void)commandHistoryViewDidSelectCommand:(NSString *)command;
@end
@interface CommandHistoryView : NSView
@property(nonatomic, retain) NSArray *commands;
@property(nonatomic, assign) id<CommandHistoryViewDelegate> delegate;
- (NSSize)desiredSize;
- (BOOL)wantsKeyDown:(NSEvent *)event;
@end
//
// CommandHistoryView.m
// iTerm
//
// Created by George Nachman on 1/6/14.
//
//
#import "CommandHistoryView.h"
static const CGFloat kRowHeight = 16;
static const CGFloat kHorizontalMargin = 16;
@interface CommandHistoryView () <NSTableViewDataSource, NSTableViewDelegate>
@property(nonatomic, retain) NSScrollView *scrollView;
@property(nonatomic, retain) NSTableView *tableView;
@property(nonatomic, retain) NSTableColumn *column;
@end
@implementation CommandHistoryView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_scrollView = [[NSScrollView alloc] initWithFrame:self.bounds];
_scrollView.hasVerticalScroller = YES;
_scrollView.hasHorizontalScroller = NO;
[self addSubview:_scrollView];
NSSize tableViewSize =
[NSScrollView contentSizeForFrameSize:_scrollView.frame.size
hasHorizontalScroller:NO
hasVerticalScroller:YES
borderType:[_scrollView borderType]];
NSRect tableViewFrame = NSMakeRect(0, 0, tableViewSize.width, tableViewSize.height);
_tableView = [[NSTableView alloc] initWithFrame:tableViewFrame];
_tableView.rowHeight = kRowHeight;
_tableView.selectionHighlightStyle = NSTableViewSelectionHighlightStyleSourceList;
_tableView.allowsColumnResizing = NO;
_tableView.allowsColumnReordering = NO;
_tableView.allowsColumnSelection = NO;
_tableView.allowsEmptySelection = YES;
_tableView.allowsMultipleSelection = NO;
_tableView.allowsTypeSelect = NO;
_tableView.backgroundColor = [NSColor whiteColor];
_column = [[NSTableColumn alloc] initWithIdentifier:@"tags"];
[_column setEditable:NO];
[_tableView addTableColumn:_column];
[_scrollView setDocumentView:_tableView];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.headerView = nil;
[_tableView sizeLastColumnToFit];
_scrollView.autoresizingMask = (NSViewWidthSizable | NSViewHeightSizable);
}
return self;
}
#pragma mark - NSTableViewDelegate
#pragma mark - NSTableViewDataSource
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
return _commands.count;
}
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(NSInteger)rowIndex {
return _commands[rowIndex];
}
#pragma mark - APIs
- (void)setCommands:(NSArray *)commands {
[_commands autorelease];
_commands = [commands retain];
[_tableView reloadData];
}
- (NSSize)desiredSize {
NSSize size;
size.height = [[_scrollView contentView] documentRect].size.height;
size.width = 200; // Seems impossible to get the ideal width for a column.
return size;
}
- (BOOL)wantsKeyDown:(NSEvent *)event {
return NO; // TODO
}
- (BOOL)performKeyEquivalent:(NSEvent *)theEvent
{
unsigned int modflag;
unsigned short keycode;
modflag = [theEvent modifierFlags];
keycode = [theEvent keyCode];
const int mask = NSShiftKeyMask | NSControlKeyMask | NSAlternateKeyMask | NSCommandKeyMask;
// TODO(georgen): Not getting normal keycodes here, but 125 and 126 are up and down arrows.
// This is a pretty ugly hack. Also, calling keyDown from here is probably not cool.
BOOL handled = NO;
if (!(mask & modflag) && (keycode == 125 || keycode == 126)) {
NSInteger index = [_tableView selectedRow];
if (keycode == 126) {
// up
if (index >= 0) {
[_tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:index - 1] byExtendingSelection:NO];
}
} else {
// down
index++;
if (index < _commands.count) {
[_tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:index ] byExtendingSelection:NO];
}
}
return YES;
} else {
return NO;
}
}
@end
Loading
Loading
@@ -379,6 +379,9 @@ typedef enum {
// Select this session and tab and bring window to foreground.
- (void)reveal;
 
- (NSArray *)autocompleteSuggestionsForCurrentCommand;
- (NSString *)currentCommand;
@end
 
@interface PTYSession (ScriptingSupport)
Loading
Loading
Loading
Loading
@@ -262,6 +262,8 @@ static NSString *kTmuxFontChanged = @"kTmuxFontChanged";
NSInteger requestAttentionId_; // Last request-attention identifier
VT100ScreenMark *lastMark_;
VT100GridCoordRange commandRange_;
}
 
- (id)init
Loading
Loading
@@ -5283,33 +5285,35 @@ static long long timeInTenthsOfSeconds(struct timeval t)
}
}
 
- (void)screenCommandDidChangeWithRange:(VT100GridCoordRange)range {
NSString *command = [self commandInRange:range];
if (!command.length) {
[TEXTVIEW closeCommandAutocomplete];
return;
- (NSString *)currentCommand {
if (commandRange_.start.x < 0) {
return nil;
} else {
return [self commandInRange:commandRange_];
}
VT100RemoteHost *host = [SCREEN remoteHostOnLine:range.end.y];
NSArray *commands =
[[CommandHistory sharedInstance] autocompleteSuggestionsWithPartialCommand:command
onHost:host];
if (!commands.count) {
[TEXTVIEW closeCommandAutocomplete];
}
- (NSArray *)autocompleteSuggestionsForCurrentCommand {
if (commandRange_.start.x < 0) {
return nil;
} else {
[TEXTVIEW openCommandAutocompleteAt:range.start];
[TEXTVIEW updateCommandAutocompleteWithCommands:commands];
NSString *command = [self commandInRange:commandRange_];
VT100RemoteHost *host = [SCREEN remoteHostOnLine:[SCREEN numberOfLines]];
return [[CommandHistory sharedInstance] autocompleteSuggestionsWithPartialCommand:command
onHost:host];
}
}
- (void)screenCommandDidChangeWithRange:(VT100GridCoordRange)range {
commandRange_ = range;
}
 
- (void)screenCommandDidEndWithRange:(VT100GridCoordRange)range {
[TEXTVIEW closeCommandAutocomplete];
NSString *command = [self commandInRange:range];
if (command.length) {
[[CommandHistory sharedInstance] addCommand:command
onHost:[SCREEN remoteHostOnLine:range.end.y]];
}
commandRange_ = VT100GridCoordRangeMake(-1, -1, -1, -1);
}
 
#pragma mark - PopupDelegate
Loading
Loading
Loading
Loading
@@ -411,12 +411,8 @@ typedef enum {
// Show a visual highlight of a mark on the given line number.
- (void)highlightMarkOnLine:(int)line;
 
#pragma mark - Command Autocomplete
- (void)openCommandAutocompleteAt:(VT100GridCoord)location;
- (void)closeCommandAutocomplete;
- (void)updateCommandAutocompleteWithCommands:(NSArray *)commands;
// Characters that divide words.
- (NSCharacterSet *)wordSeparatorCharacterSet;
 
@end
 
Loading
Loading
@@ -2,7 +2,6 @@
#import "CharacterRun.h"
#import "CharacterRunInline.h"
#import "CommandHistory.h"
#import "CommandHistoryView.h"
#import "FileTransferManager.h"
#import "FindCursorView.h"
#import "FontSizeEstimator.h"
Loading
Loading
@@ -109,7 +108,7 @@ static CGFloat PerceivedBrightness(CGFloat r, CGFloat g, CGFloat b) {
return (RED_COEFFICIENT * r) + (GREEN_COEFFICIENT * g) + (BLUE_COEFFICIENT * b);
}
 
@interface PTYTextView () <CommandHistoryViewDelegate>
@interface PTYTextView ()
// Set the hostname this view is currently waiting for AsyncHostLookupController to finish looking
// up.
@property(nonatomic, copy) NSString *currentUnderlineHostname;
Loading
Loading
@@ -406,9 +405,6 @@ static CGFloat PerceivedBrightness(CGFloat r, CGFloat g, CGFloat b) {
// Point clicked, valid only during -validateMenuItem and calls made from
// the context menu and if x and y are nonnegative.
VT100GridCoord validationClickPoint_;
CommandHistoryView *commandHistoryView_;
VT100GridCoord commandLocation_;
}
 
 
Loading
Loading
@@ -2877,11 +2873,6 @@ NSMutableArray* screens=0;
 
- (void)keyDown:(NSEvent*)event
{
if ([commandHistoryView_ wantsKeyDown:event]) {
[commandHistoryView_ keyDown:event];
return;
}
static BOOL isFirstInteraction = YES;
if (isFirstInteraction) {
iTermApplicationDelegate *appDelegate = (iTermApplicationDelegate *)[[NSApplication sharedApplication] delegate];
Loading
Loading
@@ -7091,46 +7082,6 @@ static double EuclideanDistance(NSPoint p1, NSPoint p2) {
[_delegate launchCoprocessWithCommand:command];
}
 
#pragma mark - Command Autocomplete
- (void)openCommandAutocompleteAt:(VT100GridCoord)location {
if (commandHistoryView_) {
return;
}
NSRect frame = NSMakeRect(location.x * charWidth + MARGIN,
(location.y + 1) * lineHeight,
0,
0);
commandLocation_ = location;
commandHistoryView_ = [[CommandHistoryView alloc] initWithFrame:frame];
commandHistoryView_.delegate = self;
[self addSubview:commandHistoryView_];
}
- (void)closeCommandAutocomplete {
[commandHistoryView_ removeFromSuperview];
[commandHistoryView_ release];
commandHistoryView_ = nil;
}
- (void)updateCommandAutocompleteWithCommands:(NSArray *)commands {
commandHistoryView_.commands = commands;
[self performSelector:@selector(updateCommandAutocompleteFrame) withObject:nil afterDelay:0];
}
- (void)updateCommandAutocompleteFrame {
if (commandHistoryView_) {
NSRect frame = NSMakeRect(commandLocation_.x * charWidth + MARGIN,
(commandLocation_.y + 1) * lineHeight,
0,
0);
frame.size = [commandHistoryView_ desiredSize];
commandHistoryView_.frame = frame;
}
}
#pragma mark - Private methods
 
- (PTYFontInfo*)getFontForChar:(UniChar)ch
Loading
Loading
@@ -9056,6 +9007,20 @@ static double EuclideanDistance(NSPoint p1, NSPoint p2) {
}
}
 
- (NSCharacterSet *)wordSeparatorCharacterSet
{
NSMutableCharacterSet *charset = [[[NSMutableCharacterSet alloc] init] autorelease];
[charset formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableCharacterSet *complement = [[[NSMutableCharacterSet alloc] init] autorelease];
[complement formUnionWithCharacterSet:[NSCharacterSet alphanumericCharacterSet]];
[complement addCharactersInString:[[PreferencePanel sharedInstance] wordChars]];
[complement addCharactersInRange:NSMakeRange(DWC_RIGHT, 1)];
[complement addCharactersInRange:NSMakeRange(DWC_SKIP, 1)];
[charset formUnionWithCharacterSet:[complement invertedSet]];
return charset;
}
- (PTYCharType)classifyChar:(unichar)ch
isComplex:(BOOL)complex
{
Loading
Loading
@@ -10475,10 +10440,4 @@ static double EuclideanDistance(NSPoint p1, NSPoint p2) {
return anyBlinkers;
}
 
#pragma mark - CommandHistoryViewDelegate
- (void)commandHistoryViewDidSelectCommand:(NSString *)command {
// TODO
}
@end
Loading
Loading
@@ -3959,6 +3959,11 @@ NSString *kSessionsKVCKey = @"sessions";
[autocompleteView more];
} else {
[autocompleteView popWithDelegate:[self currentSession]];
NSString *currentCommand = [[self currentSession] currentCommand];
if (currentCommand) {
[autocompleteView addCommandEntries:[[self currentSession] autocompleteSuggestionsForCurrentCommand]
context:currentCommand];
}
}
}
 
Loading
Loading
Loading
Loading
@@ -574,9 +574,6 @@
A6057C0E187BC4C3004A60AF /* CommandHistory.h in Headers */ = {isa = PBXBuildFile; fileRef = A6057C0C187BC4C3004A60AF /* CommandHistory.h */; };
A6057C0F187BC4C3004A60AF /* CommandHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = A6057C0D187BC4C3004A60AF /* CommandHistory.m */; };
A6057C10187BC4C3004A60AF /* CommandHistory.m in Sources */ = {isa = PBXBuildFile; fileRef = A6057C0D187BC4C3004A60AF /* CommandHistory.m */; };
A6057C13187BCFEE004A60AF /* CommandHistoryView.h in Headers */ = {isa = PBXBuildFile; fileRef = A6057C11187BCFEE004A60AF /* CommandHistoryView.h */; };
A6057C14187BCFEE004A60AF /* CommandHistoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6057C12187BCFEE004A60AF /* CommandHistoryView.m */; };
A6057C15187BCFEE004A60AF /* CommandHistoryView.m in Sources */ = {isa = PBXBuildFile; fileRef = A6057C12187BCFEE004A60AF /* CommandHistoryView.m */; };
A628C7A818764AA4009B0818 /* NSDictionary+iTerm.h in Headers */ = {isa = PBXBuildFile; fileRef = A628C7A618764AA4009B0818 /* NSDictionary+iTerm.h */; };
A628C7A918764AA4009B0818 /* NSDictionary+iTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = A628C7A718764AA4009B0818 /* NSDictionary+iTerm.m */; };
A628C7AA18764AA4009B0818 /* NSDictionary+iTerm.m in Sources */ = {isa = PBXBuildFile; fileRef = A628C7A718764AA4009B0818 /* NSDictionary+iTerm.m */; };
Loading
Loading
@@ -1061,8 +1058,6 @@
A6057C08187A1809004A60AF /* TerminalFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TerminalFile.m; sourceTree = "<group>"; };
A6057C0C187BC4C3004A60AF /* CommandHistory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandHistory.h; sourceTree = "<group>"; };
A6057C0D187BC4C3004A60AF /* CommandHistory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommandHistory.m; sourceTree = "<group>"; };
A6057C11187BCFEE004A60AF /* CommandHistoryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommandHistoryView.h; sourceTree = "<group>"; };
A6057C12187BCFEE004A60AF /* CommandHistoryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommandHistoryView.m; sourceTree = "<group>"; };
A628C7A618764AA4009B0818 /* NSDictionary+iTerm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+iTerm.h"; sourceTree = "<group>"; };
A628C7A718764AA4009B0818 /* NSDictionary+iTerm.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+iTerm.m"; sourceTree = "<group>"; };
A6358642184BEA57009ED690 /* AATree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AATree.h; path = "objc-aatree-master/AATree.h"; sourceTree = "<group>"; };
Loading
Loading
@@ -1263,8 +1258,6 @@
0464AB0D006CD2EC7F000001 /* JTerminal */ = {
isa = PBXGroup;
children = (
A6057C11187BCFEE004A60AF /* CommandHistoryView.h */,
A6057C12187BCFEE004A60AF /* CommandHistoryView.m */,
0464AB0E006CD2EC7F000001 /* Classes */,
0464AB15006CD2EC7F000001 /* Headers */,
0464AB1F006CD2EC7F000001 /* Other Sources */,
Loading
Loading
@@ -2241,7 +2234,6 @@
1D6944D7169E96AC00C7048A /* ThreeFingerTapGestureRecognizer.h in Headers */,
1D085F8616F02E7400B7FCE9 /* PasteContext.h in Headers */,
1D085F8D16F0328B00B7FCE9 /* PasteViewController.h in Headers */,
A6057C13187BCFEE004A60AF /* CommandHistoryView.h in Headers */,
1D085F9216F03E5400B7FCE9 /* PasteView.h in Headers */,
1D085F9616F04D0900B7FCE9 /* NSBezierPath+iTerm.h in Headers */,
1D085F9A16F1135F00B7FCE9 /* PasteEvent.h in Headers */,
Loading
Loading
@@ -2652,7 +2644,6 @@
A68A30E5186D1429007F550F /* TransferrableFileMenuItemViewController.m in Sources */,
1D9A5574180FA85D00B42CE9 /* AlertTrigger.m in Sources */,
1D9A55A9180FA8B700B42CE9 /* PSMMetalTabStyle.m in Sources */,
A6057C15187BCFEE004A60AF /* CommandHistoryView.m in Sources */,
1D9A5523180FA46100B42CE9 /* iTermTests.m in Sources */,
1D9A559C180FA87000B42CE9 /* SessionTitleView.m in Sources */,
1D9A55B0180FA8B700B42CE9 /* PSMTabDragWindow.m in Sources */,
Loading
Loading
@@ -2669,7 +2660,6 @@
1D5FDDA61208E93600C46BA3 /* PTYScrollView.m in Sources */,
1D5FDDA71208E93600C46BA3 /* PTYTextView.m in Sources */,
1D5FDDA81208E93600C46BA3 /* PTYTask.m in Sources */,
A6057C14187BCFEE004A60AF /* CommandHistoryView.m in Sources */,
1D0AABC217B59B3D0072B5AF /* SearchResult.m in Sources */,
A60014F718550F3900CE38D8 /* NSMutableAttributedString+iTerm.m in Sources */,
A63F4096183B398C003A6A6D /* PTYNoteViewController.m in Sources */,
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment