Можно ли программно закрыть автозаполнение SuggestWidget?

Я нахожусь в процессе перехода с редактора Codemirror на редактор Monaco для проекта, в котором мы используем префиксный ключ для ввода специальных символов. Например, с префиксом ., если пользователь вводит ., а затем o, редактор заменяет последовательность на Ω.

Можно использовать addCommand и указать ему аккорд, например:

editor.addCommand(
  monaco.KeyMod.chord(monaco.KeyCode.US_DOT , monaco.KeyCode.KEY_O),
  x=>{ // write out special char here 
    editor.executeEdits("", [
      { range: editor.getSelection(), text: "Ω" }
    ]);
  }
)

Но я хочу использовать функцию автозаполнения, чтобы помочь пользователю, перечисляя специальные символы после ввода префиксного ключа. CompletionItemProvider позволяет мне сделать это, указав префиксный ключ в свойстве triggerCharacters:

monaco.languages.registerCompletionItemProvider('mylang', {
  triggerCharacters:['.'],
  provideCompletionItems: (model,position,token) => { 
    let l=position.lineNumber,c=position.column;
    let s=model.getLineContent(l),ch=s[c-2];
    console.log('completion triggered on: '+ch)
    if (ch==='.'){
      return CompletionItem[]; // return list of valid special chars
    }
  }
})

Теперь я получаю список предложений, когда пользователь вводит префиксный ключ, но даже если он следует за ним с помощью o, он не срабатывает, пока он не зафиксирует, нажав Enter или выбрав элемент с помощью мыши. Я могу прикрепить слушателя, чтобы определить правильную последовательность и выполнить замену таким образом:

editor.model.onDidChangeContent(e=>{
  if (valid sequence) 
    editor.executeEdits('',[{range,text:'Ω'}])

})

Это работает, но у меня открыт мастер предложений.

Непосредственный вопрос: есть ли способ программно контролировать, когда скрывать виджет?

Во-вторых, есть ли лучший способ достичь вышеуказанного?

Обновлять:

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

let sw=editor._view.contentWidgets._widgets["editor.widget.suggestWidget"]
setTimeout(x=>sw&&sw._actual&&sw._actual.hideWidget(),50)

person Gil    schedule 14.02.2018    source источник


Ответы (2)


Это больше не работает или не работает для меня, однако это сработало:

editorinstance.trigger('editor','hideSuggestWidget', []);
person Clark French    schedule 14.12.2018

Наконец нашел команду для срабатывания:

editorinstance.trigger('editor', 'cancelSuggestWidget')

Интересно, есть ли простой способ перечислить все доступные команды ...

person Gil    schedule 24.02.2018