Monaco Editor中能否用precondition控制菜单项及动作的可见性?
Monaco Editor 中用 precondition 控制动作可见性的方法
答案是肯定的,不管是右键菜单项还是通过Editor.addEditorAction添加的自定义动作,都可以通过precondition参数控制其可见性。
核心原理
precondition参数接受的不是直接的布尔值,而是上下文键(Context Key)的名称(或其逻辑表达式)。Monaco Editor会实时检查这些上下文键的当前布尔状态,只有当表达式结果为true时,对应的动作才会显示出来。
具体实现步骤
注册自定义上下文键
先用monaco.editor.defineContextKey定义一个可动态修改的布尔型上下文键,用来作为判断条件:// 定义名为"isTextSelected"的上下文键,初始值为false const isTextSelectedKey = monaco.editor.defineContextKey('isTextSelected', false);添加动作时指定precondition
在调用addEditorAction时,将precondition设为这个上下文键的名称(支持逻辑表达式,比如!isTextSelected、isTextSelected && anotherKey):editor.addEditorAction({ id: 'custom.copy.selected', label: '复制选中内容', precondition: 'isTextSelected', // 只有当isTextSelected为true时显示 contextMenuGroupId: 'navigation', // 加入右键菜单 run: (ed) => { ed.executeCommand(monaco.editor.Commands.Copy); } });动态更新上下文键的值
根据编辑器的状态(比如是否有文本选中),实时更新上下文键的布尔值,从而控制动作的显示/隐藏:// 监听编辑器选中变化事件 editor.onDidChangeSelection(() => { const hasSelection = !editor.getSelection().isEmpty(); // 更新上下文键的值 isTextSelectedKey.set(hasSelection); });
逻辑表达式扩展
precondition支持简单的逻辑运算,满足更复杂的判断需求:
'!isTextSelected':当未选中文本时显示动作'isTextSelected && editorFocused':同时满足文本选中且编辑器获得焦点时显示
内容的提问来源于stack exchange,提问作者GilShalit
相关产品推荐
相关产品推荐

