Skip to content

Commit a4f1f14

Browse files
committed
Add event-based triggers. These triggers fire from events such a session ending or the hostname changing. Issue 12735
1 parent f024a97 commit a4f1f14

34 files changed

+2056
-69
lines changed

Interfaces/PreferencePanel.xib

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5474,7 +5474,7 @@ CA
54745474
<rect key="frame" x="326" y="21" width="286" height="14"/>
54755475
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
54765476
<textFieldCell key="cell" controlSize="small" lineBreakMode="clipping" alignment="left" title="⚠️ You may want a trigger to stop buffering" id="r4L-CE-8Bh">
5477-
<font key="font" size="11" name=".AppleColorEmojiUI"/>
5477+
<font key="font" metaFont="smallSystem"/>
54785478
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
54795479
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
54805480
</textFieldCell>
@@ -5661,7 +5661,7 @@ CA
56615661
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
56625662
<clipView key="contentView" id="ArV-0K-qze">
56635663
<rect key="frame" x="1" y="1" width="450" height="95"/>
5664-
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
5664+
<autoresizingMask key="autoresizingMask"/>
56655665
<subviews>
56665666
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" id="5661">
56675667
<rect key="frame" x="0.0" y="0.0" width="450" height="95"/>
@@ -8873,11 +8873,11 @@ See the [documentation](https://iterm2.com/automatic-profile-switching.html) for
88738873
</tabViewItem>
88748874
<tabViewItem label="Panes" identifier="2" id="zjb-6I-dDc">
88758875
<view key="view" id="kid-3c-MWv">
8876-
<rect key="frame" x="10" y="33" width="590" height="353"/>
8876+
<rect key="frame" x="10" y="33" width="590" height="334"/>
88778877
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
88788878
<subviews>
88798879
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DgM-Zm-3SV" customClass="iTermPreferencesInnerTabContainerView">
8880-
<rect key="frame" x="16" y="182" width="551" height="168"/>
8880+
<rect key="frame" x="16" y="163" width="551" height="168"/>
88818881
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES"/>
88828882
<subviews>
88838883
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rf8-fE-qJb">
@@ -9818,7 +9818,7 @@ instead of the system keyboard.</string>
98189818
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
98199819
<clipView key="contentView" id="N1C-ir-dI5">
98209820
<rect key="frame" x="1" y="1" width="238" height="377"/>
9821-
<autoresizingMask key="autoresizingMask"/>
9821+
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
98229822
<subviews>
98239823
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" autosaveColumns="NO" typeSelect="NO" id="5562">
98249824
<rect key="frame" x="0.0" y="0.0" width="238" height="377"/>

iTerm2.xcodeproj/project.pbxproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
/* Begin PBXBuildFile section */
1010
06E0C88E1DF9695400AA061B /* iTermServiceProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E0C88C1DF9695400AA061B /* iTermServiceProvider.h */; };
11+
10AAA7668EA8FBDD64696AB7 /* iTermEventTriggerParameterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE7B0AE10E1598EDE1E01795 /* iTermEventTriggerParameterView.swift */; };
1112
1D027C111CD1867000B0FBFF /* iTermColorPresets.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D027C0F1CD1867000B0FBFF /* iTermColorPresets.h */; };
1213
1D0318281A42563A00932107 /* iTermImageWell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D0318261A42563A00932107 /* iTermImageWell.h */; };
1314
1D0318291A42563A00932107 /* iTermImageWell.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D0318261A42563A00932107 /* iTermImageWell.h */; };
@@ -925,6 +926,7 @@
925926
5ECE005F1454E59B004861E9 /* PseudoTerminalRestorer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5ECE005D1454E59B004861E9 /* PseudoTerminalRestorer.h */; };
926927
6998793AE8C54A0EAE7D5D0F /* PillBackgroundRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F3AA921DF1744D7BA890104 /* PillBackgroundRenderer.swift */; };
927928
70C067D3E9484CA9A48D69BD /* ButtonPillInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7E1E38CBCE5463DA81CC1CF /* ButtonPillInfo.swift */; };
929+
7531FA92945C4C5ABAB8F390 /* iTermEventTriggerEvaluator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B231EDB860248C368A511B42 /* iTermEventTriggerEvaluator.swift */; };
928930
756C32AD2597AC2E0047B3A9 /* iTermImage+Sixel.m in Sources */ = {isa = PBXBuildFile; fileRef = 756C32AC2597AC2E0047B3A9 /* iTermImage+Sixel.m */; };
929931
756C32B72597AC8C0047B3A9 /* libsixel.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A67D194E2237045C00BD0D4D /* libsixel.a */; };
930932
7577E2A12593B88700905402 /* iTermSandboxedWorkerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 7577E29F2593B88700905402 /* iTermSandboxedWorkerClient.h */; };
@@ -9097,6 +9099,7 @@
90979099
A6FFAE722CF682B60031FB21 /* iTermDoubleWidthCharacterCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = iTermDoubleWidthCharacterCache.h; sourceTree = "<group>"; };
90989100
A6FFAE742CF682D40031FB21 /* iTermDoubleWidthCharacterCache.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iTermDoubleWidthCharacterCache.m; sourceTree = "<group>"; };
90999101
AF19E441FF824539A275D8DA /* iTermLayoutCalculator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermLayoutCalculator.m; sourceTree = "<group>"; };
9102+
B231EDB860248C368A511B42 /* iTermEventTriggerEvaluator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = iTermEventTriggerEvaluator.swift; sourceTree = "<group>"; };
91009103
C6675EBA1C4FE96B0041173B /* iTermSelectorSwizzler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermSelectorSwizzler.h; sourceTree = "<group>"; };
91019104
C6675EBB1C4FE96B0041173B /* iTermSelectorSwizzler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermSelectorSwizzler.m; sourceTree = "<group>"; };
91029105
D3CE2D4C1A00936F0098ED99 /* PSMDarkTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMDarkTabStyle.h; sourceTree = "<group>"; };
@@ -9118,6 +9121,7 @@
91189121
DD57633605653C5F00F1905E /* iTerm2.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = iTerm2.plist; sourceTree = "<group>"; };
91199122
DDF0FD63062916F70080EF74 /* iTermApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = iTermApplication.h; sourceTree = "<group>"; tabWidth = 4; };
91209123
DDF0FD64062916F70080EF74 /* iTermApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = iTermApplication.m; sourceTree = "<group>"; tabWidth = 4; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
9124+
DE7B0AE10E1598EDE1E01795 /* iTermEventTriggerParameterView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = iTermEventTriggerParameterView.swift; sourceTree = "<group>"; };
91219125
E7E1E38CBCE5463DA81CC1CF /* ButtonPillInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonPillInfo.swift; sourceTree = "<group>"; };
91229126
E8A66F030272453F03A80106 /* iTermController.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = iTermController.m; sourceTree = "<group>"; tabWidth = 4; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
91239127
E8CF755F026DDA6303A80106 /* PTYScrollView.m */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = PTYScrollView.m; sourceTree = "<group>"; tabWidth = 4; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
@@ -13354,6 +13358,8 @@
1335413358
isa = PBXGroup;
1335513359
children = (
1335613360
207C83644F1E850C9F1E918A /* iTermTouchIDHelper.swift */,
13361+
B231EDB860248C368A511B42 /* iTermEventTriggerEvaluator.swift */,
13362+
DE7B0AE10E1598EDE1E01795 /* iTermEventTriggerParameterView.swift */,
1335713363
);
1335813364
name = sources;
1335913365
path = sources;
@@ -19956,6 +19962,8 @@
1995619962
A6F7D4EE2E0532B40065D09C /* Database.swift in Sources */,
1995719963
A6069F0A2DF25C1A00EE6CC7 /* AIPluginClient.swift in Sources */,
1995819964
84914ABAD880FC4B174DFAF5 /* iTermTouchIDHelper.swift in Sources */,
19965+
7531FA92945C4C5ABAB8F390 /* iTermEventTriggerEvaluator.swift in Sources */,
19966+
10AAA7668EA8FBDD64696AB7 /* iTermEventTriggerParameterView.swift in Sources */,
1995919967
);
1996019968
runOnlyForDeploymentPostprocessing = 0;
1996119969
};

sources/AlertTrigger.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#import "AlertTrigger.h"
99
#import "PTYSession.h"
10+
#import "iTerm2SharedARC-Swift.h"
1011
#import "PTYTab.h"
1112
#import "PseudoTerminal.h"
1213
#import "iTermAdvancedSettingsModel.h"
@@ -35,6 +36,12 @@ - (BOOL)takesParameter
3536
return YES;
3637
}
3738

39+
- (NSSet<NSNumber *> *)allowedMatchTypes {
40+
NSMutableSet *set = [NSMutableSet setWithObject:@(iTermTriggerMatchTypeRegex)];
41+
[set unionSet:[iTermEventTriggerMatchTypeHelper allEventTypesSet]];
42+
return set;
43+
}
44+
3845
- (BOOL)performActionWithCapturedStrings:(NSArray<NSString *> *)stringArray
3946
capturedRanges:(const NSRange *)capturedRanges
4047
inSession:(id<iTermTriggerSession>)aSession

sources/AnnotateTrigger.m

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ - (NSString *)triggerOptionalParameterPlaceholderWithInterpolation:(BOOL)interpo
2929
return @"Enter annotation";
3030
}
3131

32+
// Annotations require captured text ranges, so not compatible with event triggers
33+
- (NSSet<NSNumber *> *)allowedMatchTypes {
34+
return [NSSet setWithArray:@[ @(iTermTriggerMatchTypeRegex) ]];
35+
}
36+
3237

3338
- (BOOL)performActionWithCapturedStrings:(NSArray<NSString *> *)stringArray
3439
capturedRanges:(const NSRange *)capturedRanges

sources/BellTrigger.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#import "DebugLogging.h"
1111
#import "VT100Screen.h"
12+
#import "iTerm2SharedARC-Swift.h"
1213

1314
@implementation BellTrigger
1415

@@ -26,6 +27,12 @@ - (BOOL)takesParameter
2627
return NO;
2728
}
2829

30+
- (NSSet<NSNumber *> *)allowedMatchTypes {
31+
NSMutableSet *set = [NSMutableSet setWithObject:@(iTermTriggerMatchTypeRegex)];
32+
[set unionSet:[iTermEventTriggerMatchTypeHelper allEventTypesSet]];
33+
return set;
34+
}
35+
2936
- (BOOL)performActionWithCapturedStrings:(NSArray<NSString *> *)stringArray
3037
capturedRanges:(const NSRange *)capturedRanges
3138
inSession:(id<iTermTriggerSession>)aSession

sources/BounceTrigger.m

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
#import "BounceTrigger.h"
9+
#import "iTerm2SharedARC-Swift.h"
910

1011
// How to bounce. The parameter takes an integer value equal to one of these. This is the tag.
1112
typedef NS_ENUM(int, BounceTriggerParamTag) {
@@ -43,6 +44,12 @@ - (BOOL)isIdempotent {
4344
return YES;
4445
}
4546

47+
- (NSSet<NSNumber *> *)allowedMatchTypes {
48+
NSMutableSet *set = [NSMutableSet setWithObject:@(iTermTriggerMatchTypeRegex)];
49+
[set unionSet:[iTermEventTriggerMatchTypeHelper allEventTypesSet]];
50+
return set;
51+
}
52+
4653
- (NSInteger)indexForObject:(id)object {
4754
int i = 0;
4855
for (NSNumber *n in [self objectsSortedByValueInDict:[self menuItemsForPoupupButton]]) {

sources/BufferInputTrigger.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ class BufferInputTrigger: Trigger {
3737
return true
3838
}
3939

40+
// Requires a live session to buffer input
41+
override var allowedMatchTypes: Set<NSNumber> {
42+
var set: Set<NSNumber> = [NSNumber(value: iTermTriggerMatchType.regex.rawValue)]
43+
set.formUnion(EventTriggerMatchTypeHelper.allEventTypesExceptSessionEndedSet)
44+
return set
45+
}
46+
4047
override func paramIsPopupButton() -> Bool {
4148
true
4249
}

sources/CoprocessTrigger.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import "CoprocessTrigger.h"
1010
#import "iTermAnnouncementViewController.h"
1111
#import "PTYSession.h"
12+
#import "iTerm2SharedARC-Swift.h"
1213

1314
static NSString *const kSuppressCoprocessTriggerWarning = @"NoSyncSuppressCoprocessTriggerWarning";
1415

@@ -30,6 +31,13 @@ - (NSString *)triggerOptionalParameterPlaceholderWithInterpolation:(BOOL)interpo
3031
return @"Enter coprocess command to run";
3132
}
3233

34+
// Requires a live session to launch a coprocess
35+
- (NSSet<NSNumber *> *)allowedMatchTypes {
36+
NSMutableSet *set = [NSMutableSet setWithObject:@(iTermTriggerMatchTypeRegex)];
37+
[set unionSet:[iTermEventTriggerMatchTypeHelper allEventTypesExceptSessionEndedSet]];
38+
return set;
39+
}
40+
3341
- (BOOL)performActionWithCapturedStrings:(NSArray<NSString *> *)stringArray
3442
capturedRanges:(const NSRange *)capturedRanges
3543
inSession:(id<iTermTriggerSession>)aSession

sources/FoldTrigger.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ class FoldTrigger: Trigger {
1919
return true
2020
}
2121

22+
override var allowedMatchTypes: Set<NSNumber> {
23+
var set: Set<NSNumber> = [NSNumber(value: iTermTriggerMatchType.regex.rawValue)]
24+
set.formUnion(EventTriggerMatchTypeHelper.allEventTypesSet)
25+
return set
26+
}
27+
2228
override func triggerOptionalParameterPlaceholder(withInterpolation interpolation: Bool) -> String? {
2329
return "Name of Mark"
2430
}

sources/ITAddressBookMgr.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,11 +554,29 @@ static inline iTermLoggingStyle iTermLoggingStyleFromUserDefaultsValue(NSUIntege
554554
}
555555

556556
typedef NS_ENUM(NSInteger, iTermTriggerMatchType) {
557+
// Regex-based (0-99)
557558
iTermTriggerMatchTypeRegex = 0,
558559
iTermTriggerMatchTypeURLRegex = 1,
559-
iTermTriggerMatchTypePageContentRegex = 2
560+
iTermTriggerMatchTypePageContentRegex = 2,
561+
562+
// Event-based (100+)
563+
iTermTriggerMatchTypeEventPromptDetected = 100,
564+
iTermTriggerMatchTypeEventCommandFinished = 101,
565+
iTermTriggerMatchTypeEventDirectoryChanged = 102,
566+
iTermTriggerMatchTypeEventHostChanged = 103,
567+
iTermTriggerMatchTypeEventUserChanged = 104,
568+
iTermTriggerMatchTypeEventIdle = 105,
569+
iTermTriggerMatchTypeEventActivityAfterIdle = 106,
570+
iTermTriggerMatchTypeEventSessionEnded = 107,
571+
iTermTriggerMatchTypeEventBellReceived = 108,
572+
iTermTriggerMatchTypeEventLongRunningCommand = 109,
573+
iTermTriggerMatchTypeEventCustomEscapeSequence = 110
560574
};
561575

576+
static inline BOOL iTermTriggerMatchTypeIsEvent(iTermTriggerMatchType type) {
577+
return type >= 100;
578+
}
579+
562580
typedef struct {
563581
double width;
564582
double height;

0 commit comments

Comments
 (0)