Atom右键菜单不按文件后缀切换,而是依赖CSS选择器匹配DOM属性:编辑器区用[data-grammar~="source.js"]识别语法模式,文件树区用tree-view .file[data-name$=".js"]匹配后缀,且需确保语法已正确识别、命令已注册。

右键菜单不按文件类型自动切换,靠的是 CSS 选择器匹配
Atom 的上下文菜单没有「根据 .js 文件显示 A 项、.py 文件显示 B 项」这种原生逻辑。它只认 UI 元素的 CSS 类名或 data 属性,比如 [data-grammar~="source.js"] 这种语法过滤器——本质是判断当前编辑器是否处于 JavaScript 语法模式,而不是看文件后缀。
常见误区是以为改 menus/context-menu.cson 里写 ".js": [ ... ] 就能生效,实际根本不会触发。真正起作用的只有带引号的属性选择器,且必须和 Atom 内部渲染的 DOM 结构一致。
-
atom-text-editor:所有编辑器区域通用,无语言区分 -
[data-grammar~="source.js"]:仅当语法识别为 JS 时才激活(需引号包裹,漏引号=无效) -
[data-grammar~="source.python"]:同理,对应 Python 文件 -
.tree-view .file[data-name$=".ts"]:在文件树中右键 .ts 文件才出现(注意 $= 表示后缀匹配)
想让右键菜单响应特定文件类型,得先确认语法是否被正确识别
如果右键没反应,大概率不是菜单配置错了,而是 Atom 没把当前文件当成目标语言。检查右下角状态栏显示的语法名(如 “Plain Text”),点它手动选成 “JavaScript” 或 “Python”。只有这时 [data-grammar~="source.js"] 才会匹配成功。
语法识别失败的常见原因:
- 文件无扩展名或扩展名未注册(比如
.jsx需要额外安装language-babel) - 文件开头没写
#!/usr/bin/env node等 shebang,导致 shell 脚本识别失败 - 自定义语法包未启用,或
grammars/目录下 CSON 规则写错 scopeName
tree-view 中按扩展名控制右键项,用 data-name 属性最可靠
在文件树里右键某个文件,DOM 元素上会有 data-name="foo.ts" 这样的属性。你可以直接用 CSS 属性选择器精准命中:
'tree-view .file[data-name$=".ts"]': [
{label: 'Run with ts-node', command: 'my-package:run-ts'}
]
注意几点:
-
$=表示后缀匹配,^=是前缀,*=是包含,别混用 - 路径中带空格或特殊字符的文件名,
data-name值会被转义,建议优先用语法识别(更稳定) - 这个选择器只对 tree-view 生效,不影响编辑器区域右键
命令本身必须已注册,且作用域匹配才可点击
即使选择器写对了,菜单项点了没反应,八成是 command 字段值没在 Atom 中注册。比如写了 my-package:format-js,但你的插件里没调用 atom.commands.add 绑定它,或者绑定在了 atom-workspace 而不是 atom-text-editor 上。
验证方式很简单:按 Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入命令名,看是否出现在命令面板里。没出现,说明注册失败或作用域不对。
最易被忽略的一点:语法识别依赖于文件内容和扩展名双重判断,而 tree-view 的 data-name 只看文件名。两者机制不同,不能互相替代。想覆盖全场景,得同时配好 grammar 和 file 属性两套规则。











