是否可以通过编程方式关闭自动完成的SuggestWidget?

时间:2018-02-14 11:32:44

标签: monaco-editor

我正在从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:'Ω'}])

})

这样可行,但我打开了SuggestionWizard。

当前的问题是,我是否可以通过编程方式控制何时隐藏窗口小部件?

中学,有没有更好的方法来实现上述目标?

更新

发现使用私有方法关闭它的hack。由于显而易见的原因,不乐意使用这种方法,但也因为它似乎需要延迟的操作,我还没有找到原因。

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

2 个答案:

答案 0 :(得分:2)

对我来说不再有效或无效,但这确实有效:

editorinstance.trigger('editor','hideSuggestWidget', []);

答案 1 :(得分:0)

终于找到了触发命令:

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

我想知道是否有一种简单的方法可以列出所有可用的命令......