From 6e6e52d8b628e67e22ccf0bd871967b8d2288b50 Mon Sep 17 00:00:00 2001 From: George Nachman Date: Fri, 15 May 2015 15:26:47 -0700 Subject: [PATCH] Add 'stop processing triggers' trigger --- iTerm2.xcodeproj/project.pbxproj | 14 ++++++++++++++ sources/AlertTrigger.m | 3 +-- sources/BellTrigger.m | 3 +-- sources/BounceTrigger.m | 3 +-- sources/CaptureTrigger.m | 2 +- sources/CoprocessTrigger.m | 6 ++---- sources/GrowlTrigger.m | 3 +-- sources/HighlightTrigger.m | 3 +-- sources/MarkTrigger.m | 2 +- sources/PTYSession.m | 22 ++++++++++++++-------- sources/PasswordTrigger.m | 2 +- sources/ScriptTrigger.m | 3 +-- sources/SendTextTrigger.m | 3 +-- sources/StopTrigger.h | 13 +++++++++++++ sources/StopTrigger.m | 30 ++++++++++++++++++++++++++++++ sources/Trigger.h | 9 +++++++-- sources/Trigger.m | 18 ++++++++++++------ sources/TriggerController.m | 4 +++- 18 files changed, 105 insertions(+), 38 deletions(-) create mode 100644 sources/StopTrigger.h create mode 100644 sources/StopTrigger.m diff --git a/iTerm2.xcodeproj/project.pbxproj b/iTerm2.xcodeproj/project.pbxproj index 942e311815..f92a659470 100644 --- a/iTerm2.xcodeproj/project.pbxproj +++ b/iTerm2.xcodeproj/project.pbxproj @@ -131,6 +131,11 @@ 1D468BC21B056CD600226083 /* iTermProfileSearchToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468BBF1B056CD600226083 /* iTermProfileSearchToken.m */; }; 1D468BC31B056CD600226083 /* iTermProfileSearchToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468BBF1B056CD600226083 /* iTermProfileSearchToken.m */; }; 1D468BC41B056CD600226083 /* iTermProfileSearchToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468BBF1B056CD600226083 /* iTermProfileSearchToken.m */; }; + 1D468F041B06A79000226083 /* StopTrigger.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D468F021B06A79000226083 /* StopTrigger.h */; }; + 1D468F051B06A79000226083 /* StopTrigger.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D468F021B06A79000226083 /* StopTrigger.h */; }; + 1D468F061B06A79000226083 /* StopTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468F031B06A79000226083 /* StopTrigger.m */; }; + 1D468F071B06A79000226083 /* StopTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468F031B06A79000226083 /* StopTrigger.m */; }; + 1D468F081B06A79000226083 /* StopTrigger.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D468F031B06A79000226083 /* StopTrigger.m */; }; 1D48B284165F362B000046EE /* TabClose_Front_Rollover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1D48B27E165F362B000046EE /* TabClose_Front_Rollover@2x.png */; }; 1D48B285165F362B000046EE /* TabClose_Front_Pressed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1D48B27F165F362B000046EE /* TabClose_Front_Pressed@2x.png */; }; 1D48B286165F362B000046EE /* TabClose_Front@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1D48B280165F362B000046EE /* TabClose_Front@2x.png */; }; @@ -2178,6 +2183,8 @@ 1D468BB81B0543E300226083 /* iTermKeyboardNavigatableTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermKeyboardNavigatableTableView.m; sourceTree = ""; }; 1D468BBE1B056CD600226083 /* iTermProfileSearchToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermProfileSearchToken.h; sourceTree = ""; }; 1D468BBF1B056CD600226083 /* iTermProfileSearchToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermProfileSearchToken.m; sourceTree = ""; }; + 1D468F021B06A79000226083 /* StopTrigger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StopTrigger.h; sourceTree = ""; }; + 1D468F031B06A79000226083 /* StopTrigger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StopTrigger.m; sourceTree = ""; }; 1D48B27E165F362B000046EE /* TabClose_Front_Rollover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "TabClose_Front_Rollover@2x.png"; sourceTree = ""; }; 1D48B27F165F362B000046EE /* TabClose_Front_Pressed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "TabClose_Front_Pressed@2x.png"; sourceTree = ""; }; 1D48B280165F362B000046EE /* TabClose_Front@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "TabClose_Front@2x.png"; sourceTree = ""; }; @@ -3775,6 +3782,8 @@ 1D24C283142EF334006B246F /* SendTextTrigger.m */, 1D891E42190724DB0053C4BB /* MarkTrigger.m */, 1DABA03219253FEA00A228D8 /* PasswordTrigger.m */, + 1D468F021B06A79000226083 /* StopTrigger.h */, + 1D468F031B06A79000226083 /* StopTrigger.m */, ); name = Triggers; sourceTree = ""; @@ -4505,6 +4514,7 @@ A6E77F821A23F484009B1CB6 /* iTermFindOnPageHelper.h in Headers */, A6E525DE1A9C5730007B898E /* VT100StateMachine.h in Headers */, 1D6ED8C619AEA20D005A7799 /* UKNibOwner.h in Headers */, + 1D468F051B06A79000226083 /* StopTrigger.h in Headers */, 1D6ED8C719AEA20D005A7799 /* VT100GridTest.h in Headers */, 1D6ED8C819AEA20D005A7799 /* CommandHistory.h in Headers */, 1D6ED8C919AEA20D005A7799 /* UKSystemInfo.h in Headers */, @@ -4825,6 +4835,7 @@ 1DF8006F18F34CAB00722B35 /* NSPopUpButton+iTerm.h in Headers */, A69B4585196F8EA100F5444D /* iTermOpenQuicklyWindowController.h in Headers */, A6C7DE52199F3087001E5C75 /* PTYWindow+Scripting.h in Headers */, + 1D468F041B06A79000226083 /* StopTrigger.h in Headers */, A66A1FA81A3A207900F4A3A7 /* iTermWindowShortcutLabelTitlebarAccessoryViewController.h in Headers */, 1DABA03319253FEA00A228D8 /* PasswordTrigger.h in Headers */, A6E7138E18F26A91008D94DD /* AppearancePreferencesViewController.h in Headers */, @@ -5915,6 +5926,7 @@ 1D6EDAD319AEA20D005A7799 /* BackgroundThread.m in Sources */, 1D6EDAD419AEA20D005A7799 /* iTermFontPanel.m in Sources */, 1D6EDAD519AEA20D005A7799 /* PTYNoteView.m in Sources */, + 1D468F081B06A79000226083 /* StopTrigger.m in Sources */, 1D6EDAD619AEA20D005A7799 /* PTYWindow+Scripting.m in Sources */, 1D6EDAD719AEA20D005A7799 /* CharacterRun.m in Sources */, 1D6EDAD819AEA20D005A7799 /* ProfilesTextPreferencesViewController.m in Sources */, @@ -6201,6 +6213,7 @@ 1D9A5550180FA82E00B42CE9 /* TmuxWindowsTable.m in Sources */, 1DD39B1E180B8415004E56D5 /* LineBuffer.m in Sources */, 1D9A55AF180FA8B700B42CE9 /* PSMTabDragAssistant.m in Sources */, + 1D468F071B06A79000226083 /* StopTrigger.m in Sources */, 1DF8007118F34CAB00722B35 /* NSPopUpButton+iTerm.m in Sources */, 1D9A559F180FA87000B42CE9 /* SplitPanel.m in Sources */, 1D9A5572180FA85D00B42CE9 /* HighlightTrigger.m in Sources */, @@ -6541,6 +6554,7 @@ 1DA26AC115007507004B5792 /* BackgroundThread.m in Sources */, 1D2F3B3E1516BA470044C337 /* iTermFontPanel.m in Sources */, A63F409B183B3AA7003A6A6D /* PTYNoteView.m in Sources */, + 1D468F061B06A79000226083 /* StopTrigger.m in Sources */, A6C7DE4F199F302C001E5C75 /* PTYWindow+Scripting.m in Sources */, 1D48B37A167E809D000046EE /* CharacterRun.m in Sources */, A6A2697F18FE2BDE00437DA9 /* ProfilesTextPreferencesViewController.m in Sources */, diff --git a/sources/AlertTrigger.m b/sources/AlertTrigger.m index 3b28793344..56d716cb97 100644 --- a/sources/AlertTrigger.m +++ b/sources/AlertTrigger.m @@ -27,8 +27,7 @@ - (BOOL)takesParameter return YES; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { if (disabled_) { return YES; } diff --git a/sources/BellTrigger.m b/sources/BellTrigger.m index 01e922af1b..8c6b699319 100644 --- a/sources/BellTrigger.m +++ b/sources/BellTrigger.m @@ -21,8 +21,7 @@ - (BOOL)takesParameter return NO; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { [aSession.screen activateBell]; return YES; } diff --git a/sources/BounceTrigger.m b/sources/BounceTrigger.m index 0b2ed8c9b3..903611f071 100644 --- a/sources/BounceTrigger.m +++ b/sources/BounceTrigger.m @@ -80,8 +80,7 @@ - (NSRequestUserAttentionType)bounceType } } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { [NSApp requestUserAttention:[self bounceType]]; return YES; } diff --git a/sources/CaptureTrigger.m b/sources/CaptureTrigger.m index f9284e0776..ede1c2feb3 100644 --- a/sources/CaptureTrigger.m +++ b/sources/CaptureTrigger.m @@ -67,7 +67,7 @@ - (void)showCaptureOutputToolInSession:(PTYSession *)aSession { } } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber { +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { if (!aSession.screen.shellIntegrationInstalled) { if (![[NSUserDefaults standardUserDefaults] boolForKey:kSuppressCaptureOutputRequiresShellIntegrationWarning]) { [self showShellIntegrationRequiredAnnouncementInSession:aSession]; diff --git a/sources/CoprocessTrigger.m b/sources/CoprocessTrigger.m index 45209f8078..c1c76babe6 100644 --- a/sources/CoprocessTrigger.m +++ b/sources/CoprocessTrigger.m @@ -31,8 +31,7 @@ - (void)executeCommand:(NSString *)command inSession:(PTYSession *)aSession [aSession launchCoprocessWithCommand:command]; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { if (![aSession hasCoprocess]) { NSString *command = [self paramWithBackreferencesReplacedWithValues:values]; [self executeCommand:command inSession:aSession]; @@ -64,8 +63,7 @@ - (void)executeCommand:(NSString *)command inSession:(PTYSession *)aSession [aSession launchSilentCoprocessWithCommand:command]; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { if (![aSession hasCoprocess]) { NSString *command = [self paramWithBackreferencesReplacedWithValues:values]; [self executeCommand:command inSession:aSession]; diff --git a/sources/GrowlTrigger.m b/sources/GrowlTrigger.m index 59e3ce1813..99047e5035 100644 --- a/sources/GrowlTrigger.m +++ b/sources/GrowlTrigger.m @@ -27,8 +27,7 @@ - (NSString *)paramPlaceholder return @"Enter Message"; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { iTermGrowlDelegate *gd = [iTermGrowlDelegate sharedInstance]; [gd growlNotify:[self paramWithBackreferencesReplacedWithValues:values] withDescription:[NSString stringWithFormat:@"A trigger fired in session \"%@\" in tab #%d.", diff --git a/sources/HighlightTrigger.m b/sources/HighlightTrigger.m index acb758975f..fe073e654d 100644 --- a/sources/HighlightTrigger.m +++ b/sources/HighlightTrigger.m @@ -337,8 +337,7 @@ - (NSDictionary *)colors return nil; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { [[aSession screen] highlightTextMatchingRegex:self.regex colors:[self colors]]; return YES; diff --git a/sources/MarkTrigger.m b/sources/MarkTrigger.m index 0c5197a141..66d4c41c2f 100644 --- a/sources/MarkTrigger.m +++ b/sources/MarkTrigger.m @@ -67,7 +67,7 @@ - (BOOL)shouldStopScrolling { return [self.param intValue] == kMarkTriggerParamTagStopScrolling; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber { +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { [aSession.screen terminalSaveScrollPositionWithArgument:@"saveCursorLine"]; if ([self shouldStopScrolling]) { [(PTYScroller *)[aSession.scrollview verticalScroller] setUserScroll:YES]; diff --git a/sources/PTYSession.m b/sources/PTYSession.m index a090c1c15d..82c8c1d8cc 100644 --- a/sources/PTYSession.m +++ b/sources/PTYSession.m @@ -1560,10 +1560,13 @@ - (void)finishedHandlingNewOutputOfLength:(int)length { - (void)checkTriggers { for (Trigger *trigger in _triggers) { - [trigger tryString:_triggerLine - inSession:self - partialLine:NO - lineNumber:[_screen absoluteLineNumberOfCursor]]; + BOOL stop = [trigger tryString:_triggerLine + inSession:self + partialLine:NO + lineNumber:[_screen absoluteLineNumberOfCursor]]; + if (stop) { + break; + } } } @@ -1574,10 +1577,13 @@ - (void)checkPartialLineTriggers { } _lastPartialLineTriggerCheck = now; for (Trigger *trigger in _triggers) { - [trigger tryString:_triggerLine - inSession:self - partialLine:YES - lineNumber:[_screen absoluteLineNumberOfCursor]]; + BOOL stop = [trigger tryString:_triggerLine + inSession:self + partialLine:YES + lineNumber:[_screen absoluteLineNumberOfCursor]]; + if (stop) { + break; + } } } diff --git a/sources/PasswordTrigger.m b/sources/PasswordTrigger.m index d3f7138b76..1859223b2a 100644 --- a/sources/PasswordTrigger.m +++ b/sources/PasswordTrigger.m @@ -82,7 +82,7 @@ - (NSDictionary *)menuItemsForPoupupButton { return result; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber { +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { iTermApplicationDelegate *delegate = (iTermApplicationDelegate *)[[NSApplication sharedApplication] delegate]; [delegate openPasswordManagerToAccountName:[self paramWithBackreferencesReplacedWithValues:values]]; diff --git a/sources/ScriptTrigger.m b/sources/ScriptTrigger.m index 13779aa558..08d8352f21 100644 --- a/sources/ScriptTrigger.m +++ b/sources/ScriptTrigger.m @@ -29,8 +29,7 @@ - (NSString *)paramPlaceholder } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { NSString *command = [self paramWithBackreferencesReplacedWithValues:values]; [NSThread detachNewThreadSelector:@selector(runCommand:) toTarget:[self class] diff --git a/sources/SendTextTrigger.m b/sources/SendTextTrigger.m index 744aa76a36..208b73bc1d 100644 --- a/sources/SendTextTrigger.m +++ b/sources/SendTextTrigger.m @@ -26,8 +26,7 @@ - (NSString *)paramPlaceholder } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber stop:(BOOL *)stop { NSString *message = [self paramWithBackreferencesReplacedWithValues:values]; [aSession writeTask:[message dataUsingEncoding:NSUTF8StringEncoding]]; return YES; diff --git a/sources/StopTrigger.h b/sources/StopTrigger.h new file mode 100644 index 0000000000..d6e46f4314 --- /dev/null +++ b/sources/StopTrigger.h @@ -0,0 +1,13 @@ +// +// StopTrigger.h +// iTerm2 +// +// Created by George Nachman on 5/15/15. +// +// + +#import "Trigger.h" + +@interface StopTrigger : Trigger + +@end diff --git a/sources/StopTrigger.m b/sources/StopTrigger.m new file mode 100644 index 0000000000..e6fb31a440 --- /dev/null +++ b/sources/StopTrigger.m @@ -0,0 +1,30 @@ +// +// StopTrigger.m +// iTerm2 +// +// Created by George Nachman on 5/15/15. +// +// + +#import "StopTrigger.h" + +@implementation StopTrigger + ++ (NSString *)title { + return @"Stop Processing Triggers"; +} + +- (BOOL)takesParameter { + return NO; +} + +- (BOOL)performActionWithValues:(NSArray *)values + inSession:(PTYSession *)aSession + onString:(NSString *)string + atAbsoluteLineNumber:(long long)absoluteLineNumber + stop:(BOOL *)stop { + *stop = YES; + return NO; +} + +@end diff --git a/sources/Trigger.h b/sources/Trigger.h index 065c143c70..bbc9d12fb8 100644 --- a/sources/Trigger.h +++ b/sources/Trigger.h @@ -52,13 +52,18 @@ extern NSString * const kTriggerPartialLineKey; - (NSArray *)objectsSortedByValueInDict:(NSDictionary *)dict; - (NSString *)paramWithBackreferencesReplacedWithValues:(NSArray *)values; -- (void)tryString:(NSString *)s +// Returns YES if no more triggers should be processed. +- (BOOL)tryString:(NSString *)s inSession:(PTYSession *)aSession partialLine:(BOOL)partialLine lineNumber:(long long)lineNumber; // Subclasses must override this. Return YES if it can fire again on this line. -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber; +- (BOOL)performActionWithValues:(NSArray *)values + inSession:(PTYSession *)aSession + onString:(NSString *)string + atAbsoluteLineNumber:(long long)absoluteLineNumber + stop:(BOOL *)stop; - (NSComparisonResult)compareTitle:(Trigger *)other; diff --git a/sources/Trigger.m b/sources/Trigger.m index f7bec2151f..a200a5ea04 100644 --- a/sources/Trigger.m +++ b/sources/Trigger.m @@ -94,13 +94,16 @@ - (void)dealloc { [super dealloc]; } -- (BOOL)performActionWithValues:(NSArray *)values inSession:(PTYSession *)aSession onString:(NSString *)string atAbsoluteLineNumber:(long long)absoluteLineNumber -{ +- (BOOL)performActionWithValues:(NSArray *)values + inSession:(PTYSession *)aSession + onString:(NSString *)string + atAbsoluteLineNumber:(long long)absoluteLineNumber + stop:(BOOL *)stop { assert(false); return NO; } -- (void)tryString:(NSString *)s +- (BOOL)tryString:(NSString *)s inSession:(PTYSession *)aSession partialLine:(BOOL)partialLine lineNumber:(long long)lineNumber { @@ -109,13 +112,14 @@ - (void)tryString:(NSString *)s if (!partialLine) { _lastLineNumber = -1; } - return; + return NO; } if (partialLine && !_partialLine) { // This trigger doesn't support partial lines. - return; + return NO; } NSRange range = [s rangeOfRegex:regex_]; + BOOL stop = NO; if (range.location != NSNotFound) { NSArray *captures = [s arrayOfCaptureComponentsMatchedByRegex:regex_]; if (captures.count) { @@ -125,7 +129,8 @@ - (void)tryString:(NSString *)s if (![self performActionWithValues:matches inSession:aSession onString:s - atAbsoluteLineNumber:lineNumber]) { + atAbsoluteLineNumber:lineNumber + stop:&stop]) { break; } } @@ -133,6 +138,7 @@ - (void)tryString:(NSString *)s if (!partialLine) { _lastLineNumber = -1; } + return stop; } - (NSString *)paramWithBackreferencesReplacedWithValues:(NSArray *)values diff --git a/sources/TriggerController.m b/sources/TriggerController.m index 9c9df07788..741883f6d2 100644 --- a/sources/TriggerController.m +++ b/sources/TriggerController.m @@ -19,6 +19,7 @@ #import "Trigger.h" #import "CoprocessTrigger.h" #import "SendTextTrigger.h" +#import "StopTrigger.h" #import "PasswordTrigger.h" #import "FutureMethods.h" @@ -61,7 +62,8 @@ - (NSArray *)triggerClasses { [MuteCoprocessTrigger class], [HighlightTrigger class], [MarkTrigger class], - [PasswordTrigger class] ]; + [PasswordTrigger class], + [StopTrigger class] ]; return [allClasses sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [[obj1 title] compare:[obj2 title]];