右键菜单需用精准css选择器限定范围,如atom-text-editor[data-grammar]:has(.selection),并配合命令中if (!editor.getselectedtext()) return做二次校验。

右键菜单只在选中文本时出现,得靠选择器过滤
Atom 的上下文菜单不识别“是否选中文字”这个状态,它只认 DOM 元素和 CSS 类。所以想让菜单项只在有选区时显示,必须借助 atom-text-editor::selection 这个伪元素选择器——但它不能单独用,得配合编辑器主体一起写。
-
'atom-text-editor::selection'本身无效,Atom 不支持纯伪类触发 - 正确写法是:
'atom-text-editor:not([mini]):has(.selection)(需 Atom v1.60+)或更兼容的'atom-text-editor .selection' - 实际推荐用
'atom-text-editor[data-grammar]:has(.selection)',既能排除迷你编辑器,又能限定在有语法高亮的编辑器里生效 - 如果用了
.selection,记得在命令处理函数里加空选区判断:if (!editor.getSelectedText()) return,否则用户点空白处也可能触发
添加「复制选中路径」「转大写」这类命令的实际步骤
不是所有命令都适合放右键菜单,尤其涉及跨文件、异步或需 UI 交互的逻辑。优先选同步、轻量、确定性高的操作。
- 在
menus/win32.cson(Windows)、menus/darwin.cson(macOS)或menus/linux.cson(Linux)中添加条目 - 示例配置(放在
'context-menu'下):{label: 'Uppercase Selection', command: 'my-package:uppercase-selection'} - 确保
command值已在插件中注册:比如atom.commands.add('atom-text-editor', 'my-package:uppercase-selection', () => { ... }) - 别漏掉
package.json中的commands字段声明,否则命令面板里搜不到,右键也点不动
为什么右键点了没反应?90% 是这三处出错
菜单配置文件语法看似简单,但 Atom 对 CSON 格式极其敏感,一个逗号或引号错位就导致整块失效,且无任何错误提示。
- CSON 不允许末尾逗号:
{label: 'X', command: 'x:y'},→ 最后那个逗号必须删掉 - 字符串值必须用单引号或双引号包裹,
label: Copy Path(缺引号)直接被忽略 - 选择器写成
atom-text-editor, .tree-view会同时绑定到编辑器和树视图,但后者没.selection,导致命令执行时报editor is null - 改完保存后无需重启 Atom,但要右键点对区域——例如你绑在
atom-text-editor,却去点侧边栏文件名,菜单根本不会弹出来
想让「复制文件路径」只在右键编辑器内容区时出现
很多人照着网上教程加了 {label: 'Copy File Path', command: 'editor:copy-path'},结果在树视图、状态栏甚至空白桌面都出现了该菜单——这是选择器太宽泛导致的。
- 错误写法:
'*': [{label: 'Copy File Path', ...}]—— 匹配一切,毫无上下文 - 正确范围限定:
'atom-text-editor:not([mini])': [{label: 'Copy File Path', command: 'editor:copy-path'}] - 注意:
editor:copy-path是 Atom 内置命令,但仅当当前编辑器有真实文件路径(即已保存)时才有效;未保存的临时文件会静默失败 - 如需 fallback 到相对路径或提示,得自己写新命令,不能复用这个内置 command
if (hasSelection) showMenu(),只能靠精准的 CSS 选择器 + 命令层防御性检查来逼近目标行为。最易被忽略的是:选择器匹配成功 ≠ 命令能安全执行,二者必须分开验证。











