Skip to content

Commit 5c20272

Browse files
authored
1 parent 22ee4cd commit 5c20272

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { IHistoryNavigationWidget } from 'vs/base/browser/history';
3737
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
3838
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
3939
import { IEditorConstructionOptions } from 'vs/editor/browser/config/editorConfiguration';
40+
import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/core/wordHelper';
4041

4142
export interface SuggestResultsProvider {
4243
/**
@@ -54,6 +55,20 @@ export interface SuggestResultsProvider {
5455
*/
5556
triggerCharacters?: string[];
5657

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+
5772
/**
5873
* Defines the sorting function used when showing results.
5974
*
@@ -199,7 +214,9 @@ export class SuggestEnabledInput extends Widget {
199214
const validatedSuggestProvider = {
200215
provideResults: suggestionProvider.provideResults,
201216
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,
203220
};
204221

205222
this.setValue(options.value || '');
@@ -210,12 +227,19 @@ export class SuggestEnabledInput extends Widget {
210227
const query = model.getValue();
211228

212229
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+
}
216240

217241
// 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) {
219243
return { suggestions: [] };
220244
}
221245

src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,9 @@ class WhenInputWidget extends Disposable {
10611061
}
10621062
return result;
10631063
},
1064-
triggerCharacters: ['!'],
1064+
triggerCharacters: ['!', ' '],
1065+
wordDefinition: /[a-zA-Z.]+/,
1066+
alwaysShowSuggestions: true,
10651067
}, '', `keyboardshortcutseditor#wheninput`, { focusContextKey, overflowWidgetsDomNode: keybindingsEditor.overflowWidgetsDomNode }));
10661068

10671069
this._register((DOM.addDisposableListener(this.input.element, DOM.EventType.DBLCLICK, e => DOM.EventHelper.stop(e))));

0 commit comments

Comments
 (0)