Автодополнение с CodeMirror

Я пытаюсь реализовать автозаполнение с помощью надстройки Show-hint CodeMirror, в частности, с sql-hint. Я хочу, чтобы он автозаполнялся по мере ввода.

То, что я делаю прямо сейчас,

codemirror_editor.on("change", function(instance) {
    CodeMirror.commands.autocomplete(instance);
});

Но проблема в том, что он завершает слова до того, как я наберу хотя бы одну букву слова. Например, после пробела выдается длинный список всех возможных токенов. Я хочу, чтобы он отображался только в том случае, если введены некоторые символы. Может ли кто-нибудь помочь с этим?


person nisargjhaveri    schedule 03.10.2014    source источник


Ответы (2)


Перед запуском команды автозаполнения проверьте, действительно ли курсор находится после «некоторых» (независимо от того, что «некоторые» означает) буквенных символов. Кроме того, ничего не делайте, когда instance.state.completionActive истинно, так как это означает, что всплывающее окно завершения уже открыто. Наконец, вы, вероятно, захотите прослушивать событие "inputRead" вместо "change", чтобы не срабатывать, когда в документ вносятся изменения, не связанные с вводом текста пользователем.

person Marijn    schedule 03.10.2014
comment
Спасибо. Но есть небольшая проблема с "inputRead", он не продолжает автозаполнение после возврата. Как мне решить это, используя этот подход? - person nisargjhaveri; 03.10.2014
comment
Неплохо подмечено. В конце концов, вы можете использовать событие "change" и проверить, является ли change.origin (change вторым аргументом, передаваемым обработчику события) одним из "+input" или "+delete" (ввод или удаление действий). - person Marijn; 04.10.2014

Вот как я решил это после ответа Мэриджн.

codemirror_editor.on("inputRead", function(instance) {
    if (instance.state.completionActive) {
        return;
    }
    var cur = instance.getCursor();
    var token = instance.getTokenAt(cur);
    var string = '';
    if (token.string.match(/^[.`\w@]\w*$/)) {
        string = token.string;
    }
    if (string.length > 0) {
        CodeMirror.commands.autocomplete(instance);
    }
});

Это может быть специфично для SQL.

Я отвечаю на свой вопрос, чтобы поделиться фактическим решением вопроса.

person nisargjhaveri    schedule 03.10.2014