我正在从 Codemirror 迁移到 Monaco 编辑器,以便我们使用前缀键输入特殊字符。例如,给定前缀.,如果用户键入.后跟o编辑器,则将序列替换为\xce\xa9。
可以使用 addCommand 并为其提供和弦,如下所示:
\n\neditor.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)\nRun Code Online (Sandbox Code Playgroud)\n\n但我想使用自动完成功能来帮助用户,在用户键入前缀键后列出特殊字符。CompletionItemProvider 允许我通过在 triggerCharacters 属性中提供前缀键来做到这一点:
\n\nmonaco.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})\nRun Code Online (Sandbox Code Playgroud)\n\n现在,当用户键入前缀键时,我会得到建议列表,但即使他使用o,它也不会触发,直到他通过按 Enter 或用鼠标选择项目来提交。我可以附加一个侦听器来发现有效序列并以这种方式进行替换:
editor.model.onDidChangeContent(e=>{\n if (valid sequence) \n editor.executeEdits(\'\',[{range,text:\'\xce\xa9\'}])\n\n})\nRun Code Online (Sandbox Code Playgroud)\n\n这可行,但我的建议向导保持打开状态。
\n\n迫在眉睫的问题是,是否有任何方法可以以编程方式控制何时隐藏小部件?
\n\n其次,有没有更好的方法来实现上述目标?
\n\n发现了一个黑客可以使用私有方法将其关闭。出于显而易见的原因,我不高兴使用这种方法,但也因为它似乎需要延迟操作,而我尚未设法查明原因。
\n\nlet sw=editor._view.contentWidgets._widgets["editor.widget.suggestWidget"]\nsetTimeout(x=>sw&&sw._actual&&sw._actual.hideWidget(),50)\nRun Code Online (Sandbox Code Playgroud)\n
小智 6
这对我不再有效或不起作用,但是这确实有效:
editorinstance.trigger('editor','hideSuggestWidget', []);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1295 次 |
| 最近记录: |