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

Gil*_*Gil 0 monaco-editor

我正在从 Codemirror 迁移到 Monaco 编辑器,以便我们使用前缀键输入特殊字符。例如,给定前缀.,如果用户键入.后跟o编辑器,则将序列替换为\xce\xa9

\n\n

可以使用 addCommand 并为其提供和弦,如下所示:

\n\n
editor.addCommand(\n  monaco.KeyMod.chord(monaco.KeyCode.US_DOT , monaco.KeyCode.KEY_O),\n  x=>{ // write out special char here \n    editor.executeEdits("", [\n      { range: editor.getSelection(), text: "\xce\xa9" }\n    ]);\n  }\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我想使用自动完成功能来帮助用户,在用户键入前缀键后列出特殊字符。CompletionItemProvider 允许我通过在 triggerCharacters 属性中提供前缀键来做到这一点:

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

现在,当用户键入前缀键时,我会得到建议列表,但即使他使用o,它也不会触发,直到他通过按 Enter 或用鼠标选择项目来提交。我可以附加一个侦听器来发现有效序列并以这种方式进行替换:

\n\n
editor.model.onDidChangeContent(e=>{\n  if (valid sequence) \n    editor.executeEdits(\'\',[{range,text:\'\xce\xa9\'}])\n\n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可行,但我的建议向导保持打开状态。

\n\n

迫在眉睫的问题是,是否有任何方法可以以编程方式控制何时隐藏小部件?

\n\n

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

\n\n

更新:

\n\n

发现了一个黑客可以使用私有方法将其关闭。出于显而易见的原因,我不高兴使用这种方法,但也因为它似乎需要延迟操作,而我尚未设法查明原因。

\n\n
let sw=editor._view.contentWidgets._widgets["editor.widget.suggestWidget"]\nsetTimeout(x=>sw&&sw._actual&&sw._actual.hideWidget(),50)\n
Run Code Online (Sandbox Code Playgroud)\n

小智 6

这对我不再有效或不起作用,但是这确实有效:

editorinstance.trigger('editor','hideSuggestWidget', []);
Run Code Online (Sandbox Code Playgroud)