@@ -63,6 +63,9 @@ export class TerminalLinkHandler {
6363 private _widgetManager : TerminalWidgetManager ;
6464 private _processCwd : string ;
6565 private _localLinkPattern : RegExp ;
66+ private _gitDiffPreImagePattern : RegExp ;
67+ private _gitDiffPostImagePattern : RegExp ;
68+ private readonly _tooltipCallback : ( event : MouseEvent , uri : string ) => boolean | void ;
6669
6770 constructor (
6871 private _xterm : any ,
@@ -75,8 +78,23 @@ export class TerminalLinkHandler {
7578 const baseLocalLinkClause = _platform === platform . Platform . Windows ? winLocalLinkClause : unixLocalLinkClause ;
7679 // Append line and column number regex
7780 this . _localLinkPattern = new RegExp ( `${ baseLocalLinkClause } (${ lineAndColumnClause } )` ) ;
81+ // Matches '--- a/src/file1', capturing 'src/file1' in group 1
82+ this . _gitDiffPreImagePattern = / ^ - - - a \/ ( \S * ) / ;
83+ // Matches '+++ b/src/file1', capturing 'src/file1' in group 1
84+ this . _gitDiffPostImagePattern = / ^ \+ \+ \+ b \/ ( \S * ) / ;
85+
86+ this . _tooltipCallback = ( e : MouseEvent ) => {
87+ if ( this . _terminalService && this . _terminalService . configHelper . config . rendererType === 'dom' ) {
88+ const target = ( e . target as HTMLElement ) ;
89+ this . _widgetManager . showMessage ( target . offsetLeft , target . offsetTop , this . _getLinkHoverString ( ) ) ;
90+ } else {
91+ this . _widgetManager . showMessage ( e . offsetX , e . offsetY , this . _getLinkHoverString ( ) ) ;
92+ }
93+ } ;
94+
7895 this . registerWebLinkHandler ( ) ;
7996 this . registerLocalLinkHandler ( ) ;
97+ this . registerGitDiffLinkHandlers ( ) ;
8098 }
8199
82100 public setWidgetManager ( widgetManager : TerminalWidgetManager ) : void {
@@ -90,14 +108,7 @@ export class TerminalLinkHandler {
90108 public registerCustomLinkHandler ( regex : RegExp , handler : ( uri : string ) => void , matchIndex ?: number , validationCallback ?: XtermLinkMatcherValidationCallback ) : number {
91109 const options : ILinkMatcherOptions = {
92110 matchIndex,
93- tooltipCallback : ( e : MouseEvent ) => {
94- if ( this . _terminalService && this . _terminalService . configHelper . config . rendererType === 'dom' ) {
95- const target = ( e . target as HTMLElement ) ;
96- this . _widgetManager . showMessage ( target . offsetLeft , target . offsetTop , this . _getLinkHoverString ( ) ) ;
97- } else {
98- this . _widgetManager . showMessage ( e . offsetX , e . offsetY , this . _getLinkHoverString ( ) ) ;
99- }
100- } ,
111+ tooltipCallback : this . _tooltipCallback ,
101112 leaveCallback : ( ) => this . _widgetManager . closeMessage ( ) ,
102113 willLinkActivate : ( e : MouseEvent ) => this . _isLinkActivationModifierDown ( e ) ,
103114 priority : CUSTOM_LINK_PRIORITY
@@ -114,14 +125,7 @@ export class TerminalLinkHandler {
114125 } ) ;
115126 this . _xterm . webLinksInit ( wrappedHandler , {
116127 validationCallback : ( uri : string , callback : ( isValid : boolean ) => void ) => this . _validateWebLink ( uri , callback ) ,
117- tooltipCallback : ( e : MouseEvent ) => {
118- if ( this . _terminalService && this . _terminalService . configHelper . config . rendererType === 'dom' ) {
119- const target = ( e . target as HTMLElement ) ;
120- this . _widgetManager . showMessage ( target . offsetLeft , target . offsetTop , this . _getLinkHoverString ( ) ) ;
121- } else {
122- this . _widgetManager . showMessage ( e . offsetX , e . offsetY , this . _getLinkHoverString ( ) ) ;
123- }
124- } ,
128+ tooltipCallback : this . _tooltipCallback ,
125129 leaveCallback : ( ) => this . _widgetManager . closeMessage ( ) ,
126130 willLinkActivate : ( e : MouseEvent ) => this . _isLinkActivationModifierDown ( e )
127131 } ) ;
@@ -133,20 +137,29 @@ export class TerminalLinkHandler {
133137 } ) ;
134138 this . _xterm . registerLinkMatcher ( this . _localLinkRegex , wrappedHandler , {
135139 validationCallback : ( uri : string , callback : ( isValid : boolean ) => void ) => this . _validateLocalLink ( uri , callback ) ,
136- tooltipCallback : ( e : MouseEvent ) => {
137- if ( this . _terminalService && this . _terminalService . configHelper . config . rendererType === 'dom' ) {
138- const target = ( e . target as HTMLElement ) ;
139- this . _widgetManager . showMessage ( target . offsetLeft , target . offsetTop , this . _getLinkHoverString ( ) ) ;
140- } else {
141- this . _widgetManager . showMessage ( e . offsetX , e . offsetY , this . _getLinkHoverString ( ) ) ;
142- }
143- } ,
140+ tooltipCallback : this . _tooltipCallback ,
144141 leaveCallback : ( ) => this . _widgetManager . closeMessage ( ) ,
145142 willLinkActivate : ( e : MouseEvent ) => this . _isLinkActivationModifierDown ( e ) ,
146143 priority : LOCAL_LINK_PRIORITY
147144 } ) ;
148145 }
149146
147+ public registerGitDiffLinkHandlers ( ) : void {
148+ const wrappedHandler = this . _wrapLinkHandler ( url => {
149+ this . _handleLocalLink ( url ) ;
150+ } ) ;
151+ const options = {
152+ matchIndex : 1 ,
153+ validationCallback : ( uri : string , callback : ( isValid : boolean ) => void ) => this . _validateLocalLink ( uri , callback ) ,
154+ tooltipCallback : this . _tooltipCallback ,
155+ leaveCallback : ( ) => this . _widgetManager . closeMessage ( ) ,
156+ willLinkActivate : ( e : MouseEvent ) => this . _isLinkActivationModifierDown ( e ) ,
157+ priority : LOCAL_LINK_PRIORITY
158+ } ;
159+ this . _xterm . registerLinkMatcher ( this . _gitDiffPreImagePattern , wrappedHandler , options ) ;
160+ this . _xterm . registerLinkMatcher ( this . _gitDiffPostImagePattern , wrappedHandler , options ) ;
161+ }
162+
150163 public dispose ( ) : void {
151164 this . _xterm = null ;
152165 this . _hoverDisposables = dispose ( this . _hoverDisposables ) ;
@@ -172,6 +185,14 @@ export class TerminalLinkHandler {
172185 return this . _localLinkPattern ;
173186 }
174187
188+ protected get _gitDiffPreImageRegex ( ) : RegExp {
189+ return this . _gitDiffPreImagePattern ;
190+ }
191+
192+ protected get _gitDiffPostImageRegex ( ) : RegExp {
193+ return this . _gitDiffPostImagePattern ;
194+ }
195+
175196 private _handleLocalLink ( link : string ) : PromiseLike < any > {
176197 return this . _resolvePath ( link ) . then ( resolvedLink => {
177198 if ( ! resolvedLink ) {
0 commit comments