Допустим, у меня есть объект foo с двумя ключами bar, baz. Я хочу создать собственный getCompletions, чтобы при вводе foo. отображались bar и baz. Как мне это сделать? Переменная prefix в обратном вызове содержит только самую последнюю нажатую клавишу.
В моем реальном примере мне нужно было бы сделать вызов AJAX, чтобы получить ключи foo, прежде чем делать это, поэтому мне нужно настраиваемое автоматическое завершение.
@Harshapps да. И у меня тоже включен enableLiveAutocompletion, поэтому автозаполнение срабатывает всякий раз, когда пользователь нажимает клавишу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вместо использования префикса в getCompletions вы можете привязать ключ "." а затем создайте свой список слов. Вы можете сделать свой wordList глобальным и использовать его внутри getCompletions или после привязки "." используйте этот код, чтобы получить предыдущий элемент, т.е. foo, а затем вставить значение в редактор.
Например, если мы возьмем wordList как глобальный массив, а затем, когда пользователь введет foo. мы можем добавить оба слова в список слов, а затем использовать их в автозаполнении.
editor.commands.addCommand({
name: "dotCommand1",
bindKey: { win: ".", mac: "." },
exec: function () {
var pos = editor.selection.getCursor();
var session = editor.session;
var curLine = (session.getDocument().getLine(pos.row)).trim();
var curTokens = curLine.slice(0, pos.column).split(/\s+/);
var curCmd = curTokens[0];
if (!curCmd) return;
var lastToken = curTokens[curTokens.length - 1];
editor.insert(".");
if (lastToken === "foo") {
// Add your words (bar, baz) to the global word list so that the autocomplete can show both bar, baz
// Append the words to wordList here
}
}
});
Внутри автозаполнения мы можем отобразить список слов
var staticWordCompleter = {
getCompletions: function(editor, session, pos, prefix, callback) {
callback(null, wordList.map(function(word) {
return {
caption: word,
value: word,
meta: "static",
completer: {
insertMatch: function(editor, data) {
var insertedValue = data.value;
if (insertedValue === "bar" || insertedValue === "baz") {
// You can clear the world list here
}
}
}
};
}));
}
}
editor.completers = [staticWordCompleter];
Чтобы всегда использовать автозаполнение вместо ожидания, пока пользователь наберет следующие символы, чтобы вызвать список автозаполнения, вы можете использовать приведенный ниже фрагмент кода во время инициализации,
editor.commands.on("afterExec", function (e) {
if (e.command.name == "insertstring" && /^[\w.]$/.test(e.args)) {
editor.execCommand("startAutocomplete");
}
});
Как удалить списки слов? Похоже, как только я доберусь до foo., bar, baz навсегда останется в wordList. Нужно ли мне постоянно обновлять wordList и убирать опции автозаполнения ??
Вы можете использовать опцию insertMatch в программе завершения, которая будет вызываться после того, как вы нажмете на полосу или базу в списке автозаполнения, а затем вы сможете очистить список. Обновил ответ, добавив insertMatch
Спасибо, это отлично работает. Последний вопрос. В любом случае, чтобы автоматически открыть окно предложений на ., нажмите? Прямо сейчас вам все еще нужно ввести следующее слово, чтобы открылось меню автозаполнения. Хочу на foo., как только нажимается ., открывалось меню
Я рад, что решение сработало :) И на самом деле нет возможности вызвать автозаполнение, он вызывается, когда пользователь действительно что-то вводит.
Хорошо, это лучше, чем ничего. Кроме того, я заметил, что при использовании вашего решения я не могу на самом деле выбрать варианты завершения (т.е. если я наберу foo.b, а затем с помощью клавиатуры прокрутите вниз до bar и нажмите клавишу ВВОД, ничего не произойдет; панель предложений просто закрывается)
Привет, я обновил ответ, не могли бы вы проверить, поможет ли это вам
это не работает, если вы, например, находитесь внутри скобок if.
@undefined не понял, что у вас не работает, можете подробнее объяснить или показать рабочий образец?
попробуйте использовать его внутри блока if, например: if (foo.
Последний токен будет "if (foo"
Вы хотите отображать автозаполнение с помощью bar, baz, когда пользователь вводит foo с "."?