Skip to content

Commit

Permalink
feat: Special trigger characters to start autocomplete (#5147)
Browse files Browse the repository at this point in the history
* implement special trigger characters to forcely start autocomplete
  • Loading branch information
mkslanc committed May 12, 2023
1 parent 4fba678 commit c2cfc5a
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 2 deletions.
1 change: 1 addition & 0 deletions ace.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,7 @@ export namespace Ace {
callback: CompleterCallback): void;
getDocTooltip?(item: Completion): undefined | string | Completion;
id?: string;
triggerCharacters?: string[]
}

export class AceInline {
Expand Down
12 changes: 12 additions & 0 deletions src/autocomplete/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,15 @@ exports.getCompletionPrefix = function (editor) {
}.bind(this));
return prefix || this.retrievePrecedingIdentifier(line, pos.column);
};

exports.triggerAutocomplete = function (editor) {
var pos = editor.getCursorPosition();
var line = editor.session.getLine(pos.row);
var column = (pos.column === 0) ? 0 : pos.column - 1;
var previousChar = line[column];
return editor.completers.some((el) => {
if (el.triggerCharacters && Array.isArray(el.triggerCharacters)) {
return el.triggerCharacters.includes(previousChar);
}
});
};
39 changes: 39 additions & 0 deletions src/autocomplete_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,45 @@ module.exports = {
done();
}, 10);
},
"test: trigger autocomplete for specific characters": function (done) {
var editor = initEditor("document");

editor.completers = [
{
getCompletions: function (editor, session, pos, prefix, callback) {
var completions = [
{
caption: "append",
value: "append"
}, {
caption: "all",
value: "all"
}
];
callback(null, completions);
},
triggerCharacters: ["."]
}
];

editor.moveCursorTo(0, 8);
sendKey(".");
var popup = editor.completer.popup;
check(function () {
assert.equal(popup.data.length, 2);
editor.onCommandKey(null, 0, 13);
assert.equal(editor.getValue(), "document.all");
done();
});

function check(callback) {
popup = editor.completer.popup;
popup.renderer.on("afterRender", function wait() {
popup.renderer.off("afterRender", wait);
callback();
});
}
},
"test: empty message if no suggestions available": function(done) {
var editor = initEditor("");
var emptyMessageText = "No suggestions.";
Expand Down
5 changes: 3 additions & 2 deletions src/ext/language_tools.js
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,9 @@ var doLiveAutocomplete = function(e) {
}
else if (e.command.name === "insertstring") {
var prefix = util.getCompletionPrefix(editor);
// Only autocomplete if there's a prefix that can be matched
if (prefix && !hasCompleter) {
// Only autocomplete if there's a prefix that can be matched or previous char is trigger character
var triggerAutocomplete = util.triggerAutocomplete(editor);
if ((prefix || triggerAutocomplete) && !hasCompleter) {
var completer = Autocomplete.for(editor);
// Set a flag for auto shown
completer.autoShown = true;
Expand Down

0 comments on commit c2cfc5a

Please sign in to comment.