notepad++ 添加新语言需手动创建xml文件放入%appdata%\notepad++\userdefinelangs\,文件名仅限英文+下划线、utf-8无bom编码,根节点为,通过定义名称、扩展名、关键字、注释及字符串起止符,重启后在“语言→用户定义的语言”中启用。

怎么在 Notepad++ 里添加一个新语言(比如 .toml 或自定义 DSL)
Notepad++ 不支持直接安装语法高亮插件,所有新语言都得靠「用户自定义语言」机制手动配置。核心是写一个 XML 文件,告诉 Notepad++ 哪些词是关键字、哪些符号要加粗、注释怎么识别。
实操路径:%APPDATA%\Notepad++\userDefineLangs\(Windows),把写好的 xxx.xml 放进去,重启 Notepad++ 就能在「语言 → 用户定义的语言」菜单里看到它。
- XML 文件名必须用英文+下划线,不能含空格或中文,否则 Notepad++ 会静默忽略
- 每个
<language></language>标签的name属性值就是菜单里显示的名字,建议和文件扩展名一致(如name="TOML") - 不写
ext属性的话,该语言不会自动关联任何后缀;要自动高亮.conf文件,就得加上ext="conf" - 关键字列表用
<keywords name="primary"></keywords>包裹,词之间**只允许用空格分隔**,换行或 Tab 会导致整段失效
注释和字符串匹配为什么总不生效
不是写错正则,而是 Notepad++ 的用户自定义语言对注释/字符串的识别逻辑很原始:它只认「起始符 + 结束符」或「起始符 + 行末」两种模式,不支持嵌套、不支持转义跳过、也不解析上下文。
常见现象:# 注释没高亮、" 字符串中间有 \n 就断掉、多行注释(如 /* */)只高亮第一行。
- 单行注释:填在
commentLine属性里,例如commentLine="#",它从第一个#开始,到行尾结束,不管前面有没有引号 - 多行注释:必须同时指定
commentStart和commentEnd,例如commentStart="/*" commentEnd="*/",但无法处理/* nested /* inner */ outer */ - 字符串:用
stringStartChar和stringEndChar,比如stringStartChar='"' stringEndChar='\"'—— 注意:这里不支持\"这种转义写法,双引号字符串内若出现",就会被当成结束符
关键字分组(primary / secondary / tertiary)有什么实际区别
分组只影响高亮颜色,不影响功能。Notepad++ 内置了 4 组配色方案(默认主题下 primary=蓝色、secondary=紫色、tertiary=绿色),但你不能自定义每组的颜色,只能靠分组来区分语义层级。
比如写一个配置语言:把 server location 归为 primary(结构关键字),listen root 归为 secondary(属性关键字),on off 归为 tertiary(值关键字)。
- 同一组里的关键字共享颜色,不同组可区分;但如果你只用
primary一组,所有关键字全蓝,就失去语义提示作用 - 不要把运算符(如
==+=)塞进关键字列表——它们不属于关键字,应通过operator节点单独定义(但用户自定义语言不支持 operator 节点,只能放弃或凑合用 tertiary) - 大小写敏感由
caseSensitive="yes"控制,默认是no;如果语言本身区分大小写(如 TOML 的Truevstrue),必须显式设为yes
为什么改完 XML 重启后还是没反应
Notepad++ 加载用户定义语言时不做校验,XML 格式错、标签闭合漏、属性值没加引号……都会导致整个文件被跳过,且不报错、不提示。
最稳妥的排查顺序是:先删掉其他自定义语言 XML,只留一个最简版本(仅含 <notepadplus><userlang name="Test"></userlang></notepadplus>),确认能出现在菜单里;再逐步加关键字、注释、扩展名。
- XML 必须以
<notepadplus></notepadplus>开头,结尾是;<language></language>是旧版写法,新版 Notepad++(v7.9+)已不识别 - 所有属性值(包括
name、ext、commentLine)都必须用双引号包裹,写成ext=conf会失败 - 文件编码必须是 UTF-8 无 BOM;用记事本保存容易带 BOM,推荐用 Notepad++ 自身「编码 → 转为 UTF-8 无 BOM 格式」再保存
- 改完 XML 后,别只刷新菜单——必须完全退出 Notepad++(任务栏右键退出),再重开,否则缓存可能未更新
Notepad++ 的用户自定义语言机制本质是静态文本标记,它没有词法分析器,也不理解语法结构。越是想模拟真实语言的高亮效果(比如跳过字符串内的关键字、识别 heredoc 边界),越容易陷入规则冲突和边界失效。真有复杂需求,不如换用 VS Code 或 Sublime Text。











