手写 UltraEdit dictionary file 时,/L1 的 Block Comment On 一旦写错,语法高亮和函数列表会一起失灵。这种排障别硬猜正则,我先把 TaoToken 的 Key 领了:https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,再把 Codex 的 Base URL 指向 https://taotoken.net/api,让 Codex 读 wordfile 里的 /L1、/Function String、/Delimiters,对照 C/C++ 注释规则逐行核对。它只读文本并给出修正行,真正重新加载 wordfile、验证高亮是否恢复的,还是你在 UltraEdit 里完成。下面按我这次排障的顺序走,需要的地方给出了可直接复制的配置。
1. 症状:/L1 注释写错后,高亮和函数列表一起失灵
1.1 一个最小复现
最常见的情况是手写的 wordfile 不是从零开始,而是从网页上复制一段,删删改改。照抄/L1"C/C++"这一行时,把Block Comment Off = */误写成Block Comment Off = /+,保存后切到 C 文件,/* ... */整段注释不再显示成注释颜色,折叠箭头消失;再打开函数列表,里面冒出一堆注释里的日期、作者名。问题看起来在“函数列表”,根子却在注释规则。
另一个更隐蔽的版本是Block Comment On和Block Comment Off写反了。UltraEdit 解析 wordfile 时按顺序找开始符和结束符,一旦 On 是*/、Off 是/*,它会在文件里找到一个闭合注释再开始下一段,结果整个文件的高亮状态完全反转:普通代码被当成注释,注释块反而变成代码色。
1.2 拿原始文件当基准
原文这份 dictionary file 本身就是一份完整的 wordfile,里面/L1是 C/C++,/L2是 Visual Basic,/L3是 HTML,再往下还有 Java、Perl、XML、C#、PHP、JavaScript、PL/SQL、SQL、UNIX Shell。它最值得参考的并不是每个关键字列表,而是键值的排版顺序。一个正常的/L1大致长这样:
/L1"C/C++" Line Comment = // Block Comment On = /* Block Comment Off = */ Escape Char = \ ... /Delimiters = ~!@%^&*()-+=|\/{}[]:;"'<> , .? /Function String = "%^([a-zA-Z_0-9...]++)[~;]"注意/Delimiters和/Function String里的&在网页上经常显示成&,那是 HTML 实体。从网页复制时一旦把&原样存进 .uew,UE 会把amp;四个字符当成普通分隔符,后面的分号;也被卷进去,函数列表就会整体右偏。这是本文最容易忽略的一步,后面排障表里还会再提到。
1.3 为什么不先怀疑 /C1 关键字列表
函数列表乱掉时,很多人第一反应是去检查/C1"Keywords"里的关键字有没有漏,其实方向错了。/C1只影响关键字着色,不影响函数匹配。真正决定函数列表的是/Function String,决定哪些区域被当作注释跳过的是Block Comment On/Off,决定一行怎么切词的是/Delimiters。当高亮和函数列表同时出问题,优先检查这三组,而不是去数关键字。Codex 查 wordfile 时,我也会让它先只看这三组,避免被几百个关键字干扰。
2. 准备材料:先打开官网把 Key 建好
2.1 为什么这次让 Codex 走 TaoToken
排障 wordfile 是一件“短对话多轮”的活:让 Codex 解释一段正则、改一个^(、再解释一次[~;]。这种低频率调用用官方额度也能做,但问题是很多开发者手头有多个 Key,还有不同的模型 ID,没等到排完障先被切来切去打断了。TaoToken 在这里只承担一个角色:给 Codex 提供稳定的统一 API 通道,Key 在官网创建,模型 ID 在模型广场挑,剩下的调用逻辑 Codex 自己走。它不修改 UltraEdit 的解析规则,也不会替你保存 .uew。
2.2 准备三样东西
打开 TaoToken 注册并登录,在控制台创建 API Key;创建后 Key 以YOUR_API_KEY的形式留在你的剪贴板,下文配置里直接用它替换。接口地址记https://taotoken.net/api,注意末尾没有/v1。模型 ID 不要凭记忆填,打开上面同一个页面的模型广场,复制当前可用的模型 ID,下文用YOUR_MODEL_ID代替。
要准备的其实就三样,列成表格:
| 材料 | 值 | 说明 |
|---|---|---|
| API Key | YOUR_API_KEY | 来自 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 控制台 |
| Base URL | https://taotoken.net/api | 填进 config.toml,不要加 /v1 |
| 模型 ID | YOUR_MODEL_ID | 以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场显示为准 |
2.3 顺手确认 Codex 已装好
Codex 是新装的还是之前就装好都可以,关键是~/.codex/config.toml这个文件已经存在;不存在就手动创建。后续所有对 TaoToken 的请求都从这个文件读配置,所以路径不要写错。本文假设你已经有 Codex CLI 并且能跑codex exec,如果没有,先按 Codex 官方 README 装好,再继续看配置。检查完毕后跑一遍codex exec "hi",能正常回话再继续。
3. 配置 Codex:记住 Base URL 末尾不要加 /v1
3.1 ~/.codex/config.toml 完整配置
打开~/.codex/config.toml,追加下面这段:
model = "YOUR_MODEL_ID" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY"然后把 Key 放进环境变量:
export TAOTOKEN_API_KEY=YOUR_API_KEYYOUR_API_KEY从 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建,YOUR_MODEL_ID从模型广场复制。配置文件里base_url的值是https://taotoken.net/api,不是https://taotoken.net也不是https://taotoken.net/api/v1。官网落地页那串?utm_source=...参数只给浏览器访问用,绝不能拼进 base_url。
3.2 env_key 为什么不跟默认走
Codex 读取env_key指定的环境变量来拿 Key。设成TAOTOKEN_API_KEY而不是OPENAI_API_KEY,主要是避免和你机器上已有的其它项目变量冲突;每次排障时只export一次,退出终端就失效,不会污染全局。如果你一定要用OPENAI_API_KEY,Codex 也能读,但那样任何走默认官方通道的命令都会先看到这个变量,容易被误用。
3.3 先做一次连通性自检
配置改完跑一条最轻的请求:
codex exec "用一句话说明你当前使用的模型 ID"能正常回答就说明 Key、Base URL、模型 ID 三样都通了。如果报 401,回官网控制台确认YOUR_API_KEY是否创建完整;如果报 404,检查base_url是不是多写了/v1或写成了不带/api的根地址。不要急着去改 wordfile,先保证 Codex 能稳定回话。
4. 让 Codex 读 wordfile:逐段检查 /L1、/Function String、/Delimiters
4.1 给它一个明确的检查清单
把出问题的 .uew 放到某个工作目录,比如~/uew-debug/,然后复制下面这段提示词。里面的/path/to/wordfile.uew要改成实际文件名。这段提示词特意把 Block Comment、/Function String、/Delimiters 三件事分开,Codex 不会只回一句“看起来没问题”,而是逐项输出结论和修改。
读取 /path/to/wordfile.uew 的 /L1"C/C++" 段,完成三项检查: 1. Block Comment On 和 Block Comment Off 是否成对,值是否符合 C/C++ 的 /* */ 注释规则; 2. /Function String 是否正确使用 ^( ^) ^t ^p [~;] 这些 UEW 转义,是否会把注释或宏名识别成函数; 3. /Delimiters 里是否混入 & 这类 HTML 实体,是否缺少 ; 或 ,。 请逐行说明问题,并给出修正后的整段 /L1 配置。注意这里&要原样写进提示词。如果直接写&,Codex 会把它当成普通分隔符,检查不出实体问题。
4.2 Block Comment 部分由 Codex 怎么查
Codex 拿到 /L1 后,会先把键值拆开:Line Comment、Block Comment On、Block Comment Off、Escape Char、String Chars、File Extensions。它对照 C/C++ 注释规则时,重点看三点:On/Off 是否交换;Off 是否多写或少写一个斜杠;以及Escape Char是否在字符串里把/*切开。比如Escape Char = \时,C 字符串字面量内部出现的/*不应启动块注释;如果这里配错,高亮会从字符串里就开始变色,函数列表自然跟着偏。
我们常用的修正版本是保持原文那组键值顺序,只替换写错的字符,而不是整行重写。Codex 给出的建议通常是一行标准/L1,你只需要 diff 一下就能看出差异。
4.3 /Function String:先让它解释,再让它改
UEW 的函数匹配不是 ECMAScript 正则,^(和^)是捕获组,^p是换行,^t是制表符,[~;]是“不是分号”。很多手写错误是把^(写成(,或把^p写成了\n。这种情况下,与其让 Codex 直接给你一个新正则,不如先让它解释原来的行:
请按 UltraEdit 的 Function String 语法解释下面这行的每个片段: /Function String = "%^([a-zA-Z_0-9...]++)[~;]"它会把“行首类型 + 函数名 + 参数列表直到分号”拆开讲。解释得通,说明这一段没问题;解释得磕磕绊绊,往往就是某个^或[]配对错了。让 Codex 把解释结果和你的预期对比,比让它凭空生成正则更容易定位。
4.4 /Delimiters 的实体陷阱
原文里大量出现&,这是网页渲染后的结果,真正的 wordfile 里应该只有一个&。如果直接把博客里的代码块复制进 .uew,分隔符列表里会混入amp;四个字符,分号;会被当成普通分隔符而不是语法边界。让 Codex 检查时,可以单独问一句:
/Delimiters 里有没有 HTML 实体需要还原?它会逐个字符核对,把&改成&,并检查;是否还在原来的位置。这一步做完,很多函数列表“偶尔正常偶尔乱”的怪问题会直接消失。
5. 在 UltraEdit 里验证:重载 wordfile,而不是重启
5.1 闭环操作顺序
Codex 的角色到输出修正行为止,落地还是本地。我的顺序是:先备份原 wordfile;把 Codex 给的修正行贴回对应 /L 段;在 UltraEdit 里重新加载语法高亮,可以打开「高级 -> 配置 -> 编辑器 -> 语法高亮」,重新选择一遍当前语言,或者直接把查看方式切到别的语言再切回来;如果函数列表没变化,关掉文件重开一次。UE 的 wordfile 有缓存,只保存不重载时,改动不会立即生效。
5.2 用最小 C 文件验收
建一个只有几行的测试文件:
/* 这是块注释 */ int add(int a, int b) { // 这是行注释 return a + b; }验收三个点:块注释整段显示为注释颜色并出现折叠箭头;函数列表只出现add,不出现这是块注释;点击函数列表里的add,光标定位到函数头。第一点不通过,问题在 Block Comment On/Off;第二点不通过,问题在 /Function String 或 /Delimiters;第三点不通过,大概率是 /Function String 捕获组位置不对。用这个最小文件来回验证,比每次打开真实项目快得多。
5.3 如果重载后仍然不对
重载后还有问题,先确认 UltraEdit 当前查看方式是不是你改的那个语言。.uew 文件里/L1"C/C++" File Extensions = C CPP CC CXX H HPP AWK,如果测试文件扩展名是.cc而当前语言用了别的 wordfile,改/L1也不会生效。另一个常见原因是文件编码:wordfile 保存为 UTF-8 带 BOM 时,/L1前面会多一个不可见字符,UE 找不到语言头,整段高亮都不启用。用 Codex 检查时,让它看第一行是否以/L开头,能顺手排除 BOM 问题。
6. 这份 wordfile 的排障速查表
6.1 症状到修改点
排障最怕每轮都重新解释一遍背景。我把这次遇到的问题按症状、优先检查项、让 Codex 对照什么整理成表,下次再遇到高亮或函数列表异常,直接定位到对应行就行。前四行是 UEW 文件本身的常见问题,后两行才是接入 TaoToken 时常踩的配置问题。表格里的检查项不是让你肉眼去 grep,而是作为提示词的一部分丢给 Codex,让它按行核对,效率高很多。
| 症状 | 优先检查 | 让 Codex 对照什么 |
|---|---|---|
| 块注释不折叠 | Block Comment On/Off 是否配对 | 输出标准 /L1 键值 |
| 函数列表出现注释内容 | /Function String 是否排除^p*&, | 解释捕获组和[~;] |
| 整个语言高亮不生效 | 扩展名是否在 File Extensions 中,文件是否带 BOM | 检查 /L1 首行 |
| 高亮时好时坏 | /Delimiters 混入& | 逐字符核对分隔符 |
| 401 | Key 无效或没 export | 回 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 重新创建 |
| 404 | base_url 写错路径(例如多出 /v1) | 改成 https://taotoken.net/api |
这张表的第一行到第四行都和 UEW 文件本身有关,改完 wordfile 后在 UltraEdit 里重载验证;第五第六行则是 Codex 接入 TaoToken 时的连接问题,改完 config.toml 后跑一次codex exec自检即可。两类问题不要混在一起排查,否则只会越来越乱。
6.2 一点收尾建议
我的习惯是改 .uew 之前先让 Codex 把原来的/Function String解释一遍,而不是直接让它给新正则;解释得出来,说明基准还在。如果你也被/L1的 Block Comment 或/Function String卡住,把这份 wordfile 当基准,连同报错现象一起丢给 Codex 对照检查,比自己翻帮助文档快很多。回到 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 创建 API Key,配好 config.toml,跑一次上面的最小 C 文件验收,高亮和函数列表对不上这件事基本就到此为止。