Skip to content

Commit c2cfc5a

Browse files
authoredMay 12, 2023
feat: Special trigger characters to start autocomplete (#5147)
* implement special trigger characters to forcely start autocomplete
1 parent 4fba678 commit c2cfc5a

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed
 

‎ace.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,7 @@ export namespace Ace {
10081008
callback: CompleterCallback): void;
10091009
getDocTooltip?(item: Completion): undefined | string | Completion;
10101010
id?: string;
1011+
triggerCharacters?: string[]
10111012
}
10121013

10131014
export class AceInline {

‎src/autocomplete/util.js

+12
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,15 @@ exports.getCompletionPrefix = function (editor) {
5454
}.bind(this));
5555
return prefix || this.retrievePrecedingIdentifier(line, pos.column);
5656
};
57+
58+
exports.triggerAutocomplete = function (editor) {
59+
var pos = editor.getCursorPosition();
60+
var line = editor.session.getLine(pos.row);
61+
var column = (pos.column === 0) ? 0 : pos.column - 1;
62+
var previousChar = line[column];
63+
return editor.completers.some((el) => {
64+
if (el.triggerCharacters && Array.isArray(el.triggerCharacters)) {
65+
return el.triggerCharacters.includes(previousChar);
66+
}
67+
});
68+
};

‎src/autocomplete_test.js

+39
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,45 @@ module.exports = {
249249
done();
250250
}, 10);
251251
},
252+
"test: trigger autocomplete for specific characters": function (done) {
253+
var editor = initEditor("document");
254+
255+
editor.completers = [
256+
{
257+
getCompletions: function (editor, session, pos, prefix, callback) {
258+
var completions = [
259+
{
260+
caption: "append",
261+
value: "append"
262+
}, {
263+
caption: "all",
264+
value: "all"
265+
}
266+
];
267+
callback(null, completions);
268+
},
269+
triggerCharacters: ["."]
270+
}
271+
];
272+
273+
editor.moveCursorTo(0, 8);
274+
sendKey(".");
275+
var popup = editor.completer.popup;
276+
check(function () {
277+
assert.equal(popup.data.length, 2);
278+
editor.onCommandKey(null, 0, 13);
279+
assert.equal(editor.getValue(), "document.all");
280+
done();
281+
});
282+
283+
function check(callback) {
284+
popup = editor.completer.popup;
285+
popup.renderer.on("afterRender", function wait() {
286+
popup.renderer.off("afterRender", wait);
287+
callback();
288+
});
289+
}
290+
},
252291
"test: empty message if no suggestions available": function(done) {
253292
var editor = initEditor("");
254293
var emptyMessageText = "No suggestions.";

‎src/ext/language_tools.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,9 @@ var doLiveAutocomplete = function(e) {
143143
}
144144
else if (e.command.name === "insertstring") {
145145
var prefix = util.getCompletionPrefix(editor);
146-
// Only autocomplete if there's a prefix that can be matched
147-
if (prefix && !hasCompleter) {
146+
// Only autocomplete if there's a prefix that can be matched or previous char is trigger character
147+
var triggerAutocomplete = util.triggerAutocomplete(editor);
148+
if ((prefix || triggerAutocomplete) && !hasCompleter) {
148149
var completer = Autocomplete.for(editor);
149150
// Set a flag for auto shown
150151
completer.autoShown = true;

0 commit comments

Comments
 (0)
Please sign in to comment.