@@ -145,6 +145,9 @@ export class SearchView extends ViewPane {
145145
146146 private toggleCollapseStateDelayer : Delayer < void > ;
147147
148+ private triggerQueryDelayer : Delayer < void > ;
149+ private pauseSearching = false ;
150+
148151 constructor (
149152 options : IViewPaneOptions ,
150153 @IFileService private readonly fileService : IFileService ,
@@ -221,6 +224,7 @@ export class SearchView extends ViewPane {
221224
222225 this . addToSearchHistoryDelayer = this . _register ( new Delayer < void > ( 2000 ) ) ;
223226 this . toggleCollapseStateDelayer = this . _register ( new Delayer < void > ( 100 ) ) ;
227+ this . triggerQueryDelayer = this . _register ( new Delayer < void > ( 0 ) ) ;
224228
225229 const collapseDeepestExpandedLevelAction = this . instantiationService . createInstance ( CollapseDeepestExpandedLevelAction , CollapseDeepestExpandedLevelAction . ID , CollapseDeepestExpandedLevelAction . LABEL ) ;
226230 const expandAllAction = this . instantiationService . createInstance ( ExpandAllAction , ExpandAllAction . ID , ExpandAllAction . LABEL ) ;
@@ -315,7 +319,7 @@ export class SearchView extends ViewPane {
315319
316320 this . inputPatternIncludes . setValue ( patternIncludes ) ;
317321
318- this . inputPatternIncludes . onSubmit ( triggeredOnType => this . onQueryChanged ( true , triggeredOnType ) ) ;
322+ this . inputPatternIncludes . onSubmit ( triggeredOnType => this . triggerQueryChange ( { triggeredOnType, delay : this . searchConfig . searchOnTypeDebouncePeriod } ) ) ;
319323 this . inputPatternIncludes . onCancel ( ( ) => this . cancelSearch ( false ) ) ;
320324 this . trackInputBox ( this . inputPatternIncludes . inputFocusTracker , this . inputPatternIncludesFocused ) ;
321325
@@ -331,9 +335,9 @@ export class SearchView extends ViewPane {
331335 this . inputPatternExcludes . setValue ( patternExclusions ) ;
332336 this . inputPatternExcludes . setUseExcludesAndIgnoreFiles ( useExcludesAndIgnoreFiles ) ;
333337
334- this . inputPatternExcludes . onSubmit ( triggeredOnType => this . onQueryChanged ( true , triggeredOnType ) ) ;
338+ this . inputPatternExcludes . onSubmit ( triggeredOnType => this . triggerQueryChange ( { triggeredOnType, delay : this . searchConfig . searchOnTypeDebouncePeriod } ) ) ;
335339 this . inputPatternExcludes . onCancel ( ( ) => this . cancelSearch ( false ) ) ;
336- this . inputPatternExcludes . onChangeIgnoreBox ( ( ) => this . onQueryChanged ( true ) ) ;
340+ this . inputPatternExcludes . onChangeIgnoreBox ( ( ) => this . triggerQueryChange ( ) ) ;
337341 this . trackInputBox ( this . inputPatternExcludes . inputFocusTracker , this . inputPatternExclusionsFocused ) ;
338342
339343 this . messagesElement = dom . append ( this . container , $ ( '.messages' ) ) ;
@@ -436,9 +440,9 @@ export class SearchView extends ViewPane {
436440 this . searchWidget . toggleReplace ( true ) ;
437441 }
438442
439- this . _register ( this . searchWidget . onSearchSubmit ( triggeredOnType => this . onQueryChanged ( true , triggeredOnType ) ) ) ;
443+ this . _register ( this . searchWidget . onSearchSubmit ( options => this . triggerQueryChange ( options ) ) ) ;
440444 this . _register ( this . searchWidget . onSearchCancel ( ( { focus } ) => this . cancelSearch ( focus ) ) ) ;
441- this . _register ( this . searchWidget . searchInput . onDidOptionChange ( ( ) => this . onQueryChanged ( true ) ) ) ;
445+ this . _register ( this . searchWidget . searchInput . onDidOptionChange ( ( ) => this . triggerQueryChange ( ) ) ) ;
442446
443447 this . _register ( this . searchWidget . onDidHeightChange ( ( ) => this . reLayout ( ) ) ) ;
444448
@@ -869,9 +873,11 @@ export class SearchView extends ViewPane {
869873 if ( this . searchWidget . searchInput . getRegex ( ) ) {
870874 selectedText = strings . escapeRegExpCharacters ( selectedText ) ;
871875 }
872- this . searchWidget . setValue ( selectedText , true ) ;
876+ this . pauseSearching = true ;
877+ this . searchWidget . setValue ( selectedText ) ;
878+ this . pauseSearching = false ;
873879 updatedText = true ;
874- if ( this . searchConfig . searchOnType ) { this . onQueryChanged ( false ) ; }
880+ if ( this . searchConfig . searchOnType ) { this . triggerQueryChange ( ) ; }
875881 }
876882 }
877883
@@ -1099,17 +1105,17 @@ export class SearchView extends ViewPane {
10991105
11001106 toggleCaseSensitive ( ) : void {
11011107 this . searchWidget . searchInput . setCaseSensitive ( ! this . searchWidget . searchInput . getCaseSensitive ( ) ) ;
1102- this . onQueryChanged ( true ) ;
1108+ this . triggerQueryChange ( ) ;
11031109 }
11041110
11051111 toggleWholeWords ( ) : void {
11061112 this . searchWidget . searchInput . setWholeWords ( ! this . searchWidget . searchInput . getWholeWords ( ) ) ;
1107- this . onQueryChanged ( true ) ;
1113+ this . triggerQueryChange ( ) ;
11081114 }
11091115
11101116 toggleRegex ( ) : void {
11111117 this . searchWidget . searchInput . setRegex ( ! this . searchWidget . searchInput . getRegex ( ) ) ;
1112- this . onQueryChanged ( true ) ;
1118+ this . triggerQueryChange ( ) ;
11131119 }
11141120
11151121 setSearchParameters ( args : IFindInFilesArgs = { } ) : void {
@@ -1139,7 +1145,7 @@ export class SearchView extends ViewPane {
11391145 }
11401146 }
11411147 if ( typeof args . triggerSearch === 'boolean' && args . triggerSearch ) {
1142- this . onQueryChanged ( true ) ;
1148+ this . triggerQueryChange ( ) ;
11431149 }
11441150 }
11451151
@@ -1228,7 +1234,17 @@ export class SearchView extends ViewPane {
12281234 this . searchWidget . focus ( false ) ;
12291235 }
12301236
1231- onQueryChanged ( preserveFocus : boolean , triggeredOnType = false ) : void {
1237+ triggerQueryChange ( _options ?: { preserveFocus ?: boolean , triggeredOnType ?: boolean , delay ?: number } ) {
1238+ const options = { preserveFocus : true , triggeredOnType : false , delay : 0 , ..._options } ;
1239+
1240+ if ( ! this . pauseSearching ) {
1241+ this . triggerQueryDelayer . trigger ( ( ) => {
1242+ this . _onQueryChanged ( options . preserveFocus , options . triggeredOnType ) ;
1243+ } , options . delay ) ;
1244+ }
1245+ }
1246+
1247+ private _onQueryChanged ( preserveFocus : boolean , triggeredOnType = false ) : void {
12321248 if ( ! this . searchWidget . searchInput . inputBox . isInputValid ( ) ) {
12331249 return ;
12341250 }
@@ -1409,7 +1425,7 @@ export class SearchView extends ViewPane {
14091425 const searchAgainLink = dom . append ( p , $ ( 'a.pointer.prominent' , undefined , nls . localize ( 'rerunSearch.message' , "Search again" ) ) ) ;
14101426 this . messageDisposables . push ( dom . addDisposableListener ( searchAgainLink , dom . EventType . CLICK , ( e : MouseEvent ) => {
14111427 dom . EventHelper . stop ( e , false ) ;
1412- this . onQueryChanged ( false ) ;
1428+ this . triggerQueryChange ( { preserveFocus : false } ) ;
14131429 } ) ) ;
14141430 } else if ( hasIncludes || hasExcludes ) {
14151431 const searchAgainLink = dom . append ( p , $ ( 'a.pointer.prominent' , { tabindex : 0 } , nls . localize ( 'rerunSearchInAll.message' , "Search again in all files" ) ) ) ;
@@ -1419,7 +1435,7 @@ export class SearchView extends ViewPane {
14191435 this . inputPatternExcludes . setValue ( '' ) ;
14201436 this . inputPatternIncludes . setValue ( '' ) ;
14211437
1422- this . onQueryChanged ( false ) ;
1438+ this . triggerQueryChange ( { preserveFocus : false } ) ;
14231439 } ) ) ;
14241440 } else {
14251441 const openSettingsLink = dom . append ( p , $ ( 'a.pointer.prominent' , { tabindex : 0 } , nls . localize ( 'openSettings.message' , "Open Settings" ) ) ) ;
0 commit comments