首页 文章

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

提问于
浏览
0

我正在从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)

1 回答

  • 0

    终于找到了触发的命令:

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

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

相关问题