@@ -37,6 +37,7 @@ import { IHistoryNavigationWidget } from 'vs/base/browser/history';
37
37
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection' ;
38
38
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures' ;
39
39
import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration' ;
40
+ import { ensureValidWordDefinition , getWordAtText } from 'vs/editor/common/core/wordHelper' ;
40
41
41
42
export interface SuggestResultsProvider {
42
43
/**
@@ -54,6 +55,20 @@ export interface SuggestResultsProvider {
54
55
*/
55
56
triggerCharacters ?: string [ ] ;
56
57
58
+ /**
59
+ * Optional regular expression that describes what a word is
60
+ *
61
+ * Defaults to space separated words.
62
+ */
63
+ wordDefinition ?: RegExp ;
64
+
65
+ /**
66
+ * Show suggestions even if the trigger character is not present.
67
+ *
68
+ * Defaults to false.
69
+ */
70
+ alwaysShowSuggestions ?: boolean ;
71
+
57
72
/**
58
73
* Defines the sorting function used when showing results.
59
74
*
@@ -199,7 +214,9 @@ export class SuggestEnabledInput extends Widget {
199
214
const validatedSuggestProvider = {
200
215
provideResults : suggestionProvider . provideResults ,
201
216
sortKey : suggestionProvider . sortKey || ( a => a ) ,
202
- triggerCharacters : suggestionProvider . triggerCharacters || [ ]
217
+ triggerCharacters : suggestionProvider . triggerCharacters || [ ] ,
218
+ wordDefinition : suggestionProvider . wordDefinition ? ensureValidWordDefinition ( suggestionProvider . wordDefinition ) : undefined ,
219
+ alwaysShowSuggestions : ! ! suggestionProvider . alwaysShowSuggestions ,
203
220
} ;
204
221
205
222
this . setValue ( options . value || '' ) ;
@@ -210,12 +227,19 @@ export class SuggestEnabledInput extends Widget {
210
227
const query = model . getValue ( ) ;
211
228
212
229
const zeroIndexedColumn = position . column - 1 ;
213
-
214
- const zeroIndexedWordStart = query . lastIndexOf ( ' ' , zeroIndexedColumn - 1 ) + 1 ;
215
- const alreadyTypedCount = zeroIndexedColumn - zeroIndexedWordStart ;
230
+ let alreadyTypedCount = 0 , zeroIndexedWordStart = 0 ;
231
+
232
+ if ( validatedSuggestProvider . wordDefinition ) {
233
+ const wordAtText = getWordAtText ( position . column , validatedSuggestProvider . wordDefinition , query , 0 ) ;
234
+ alreadyTypedCount = wordAtText ?. word . length ?? 0 ;
235
+ zeroIndexedWordStart = wordAtText ? wordAtText . startColumn - 1 : 0 ;
236
+ } else {
237
+ zeroIndexedWordStart = query . lastIndexOf ( ' ' , zeroIndexedColumn - 1 ) + 1 ;
238
+ alreadyTypedCount = zeroIndexedColumn - zeroIndexedWordStart ;
239
+ }
216
240
217
241
// dont show suggestions if the user has typed something, but hasn't used the trigger character
218
- if ( alreadyTypedCount > 0 && validatedSuggestProvider . triggerCharacters . indexOf ( query [ zeroIndexedWordStart ] ) === - 1 ) {
242
+ if ( ! validatedSuggestProvider . alwaysShowSuggestions && alreadyTypedCount > 0 && validatedSuggestProvider . triggerCharacters ? .indexOf ( query [ zeroIndexedWordStart ] ) === - 1 ) {
219
243
return { suggestions : [ ] } ;
220
244
}
221
245
0 commit comments