localconfig 条目语法
基本信息
| 属性 | 值 |
|---|---|
| 解析器 | localconfig/LocalConfigEntry.fromString(line, withValue) |
| 语法说明来源 | jar 内 /assets/defaultkeys/default-localconfig.txt 的注释头 |
| 预设示例 | jar 内 /assets/defaultkeys/example-localconfig.txt(首次启动自动生成到 config/localconfig-example.txt) |
基本形式
FILE/CATEGORY/TYPE:NAME
TYPE:可省略,省略时type置为"*"CATEGORY省略时置为"*"- 分类层级用
.分隔,如general.subcategory - 注释行(
#开头)与空行返回null,被调用方跳过
转义与特殊字符
| 语法 | 含义 |
|---|---|
[...] |
转义,用于文件名中含 /(子目录)时,如 [eirairc/shared.cfg] |
"..." |
引号区内的 / : $ * # 均不作为语法字符处理 |
! 前缀 |
否定条目(not = true),用于在通配条目下排除特定项 |
* |
通配符,可出现在 CATEGORY / NAME / TYPE 中;文件名中不允许 |
$key |
无值参数,如 $format=simple 的 format |
NAME<> |
后缀 <> 表示该项是列表,等价于在 TYPE 后追加 <>(如 I<>) |
解析器中
*出现在文件名位置会报错并丢弃整行(LocalConfigEntry.java:113-118)。
TYPE 的含义
TYPE 是 Forge 配置的单字符类型前缀:B(布尔)、I(整数)、S(字符串)、D(双精度)。
在 forge 格式中,解析器从属性名首字符取 type、再跳过后续 2 个字符(name = name.substring(0, 1); name = name.substring(2);),即匹配 B:foo 这样的写法。
simple 与 ini 处理器调用时把 type 固定传 "*"。
通配匹配算法
passesWithWildcard(pattern, value)(:169-199)是一个标准的贪心 * 通配实现(类 glob):
pattern或value为"*"→ 直接true;- 用
starIndex/starMatchIndex回溯,无正则依赖。
passesProperty(category, name, type) 对三个维度同时做该匹配(:160-163)。
containsWildcard() 只检查 category / name / type 三者是否含 *。
否定条目的作用范围
! 条目只在被否定对象自身含通配符时才生效。三个 handler 里的判断都是同一形状:
if (entry.containsWildcard()) {
for (LocalConfigEntry notEntry : notEntries) {
if (notEntry.passesProperty(category, name, type)) {
continue lineLoop; // backup 中跳过该行
}
}
}
即 ! 只能用来细化一条通配条目,不能用来"删除"一条精确条目。
定义行 vs 值行
fromString 有 withValue 参数:
| 文件 | withValue |
允许 = |
|---|---|---|
config/localconfig.txt |
false |
不允许,出现即报错丢行 |
localconfig.cfg |
true |
允许,= 后为旧值 |
值行中还支持 $ 段:withValue && value == null 时 $ 之后的内容取为 value。
识别符
getIdentifier(file, category, type, name) 产出 file/category/type:name 形式(文件名含 / 时自动加 []),是写入 localconfig.cfg 的键,也是 warn 日志里显示的标识。
限制
- 解析器是手写字符扫描器,不是分词器;语法错误只记
logger.error并丢弃整行,无行号、无行上下文恢复。 - 同一个
file//format分组内条目首个匹配即 break,重叠写法只有第一条生效,顺序敏感。 - 恢复时必须先在
config/localconfig.txt找到匹配定义才会采用旧值(restoreLocalConfig的双重循环),否则该旧值被静默丢弃。 example-localconfig.txt只在config/localconfig-example.txt不存在时复制一次;玩家删掉后会重新生成,修改它无意义(它只是只读参考)。
相关条目
- localconfig 保护机制 - 本语法的消费方
- 三种格式处理器 - 各格式的实际解析差异