You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Monaco Editor中能否用precondition控制菜单项及动作的可见性?

Monaco Editor 中用 precondition 控制动作可见性的方法

答案是肯定的,不管是右键菜单项还是通过Editor.addEditorAction添加的自定义动作,都可以通过precondition参数控制其可见性。

核心原理

precondition参数接受的不是直接的布尔值,而是上下文键(Context Key)的名称(或其逻辑表达式)。Monaco Editor会实时检查这些上下文键的当前布尔状态,只有当表达式结果为true时,对应的动作才会显示出来。

具体实现步骤

  1. 注册自定义上下文键
    先用monaco.editor.defineContextKey定义一个可动态修改的布尔型上下文键,用来作为判断条件:

    // 定义名为"isTextSelected"的上下文键,初始值为false
    const isTextSelectedKey = monaco.editor.defineContextKey('isTextSelected', false);
    
  2. 添加动作时指定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);
        }
    });
    
  3. 动态更新上下文键的值
    根据编辑器的状态(比如是否有文本选中),实时更新上下文键的布尔值,从而控制动作的显示/隐藏:

    // 监听编辑器选中变化事件
    editor.onDidChangeSelection(() => {
        const hasSelection = !editor.getSelection().isEmpty();
        // 更新上下文键的值
        isTextSelectedKey.set(hasSelection);
    });
    

逻辑表达式扩展

precondition支持简单的逻辑运算,满足更复杂的判断需求:

  • '!isTextSelected':当未选中文本时显示动作
  • 'isTextSelected && editorFocused':同时满足文本选中且编辑器获得焦点时显示

内容的提问来源于stack exchange,提问作者GilShalit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:50:27