
简介面向中州韵输入法小狼毫、须鼠管用户的 dateTime 日期时间滤镜配置包以 Lua 脚本扩展输入法能力可输出农历、二十四节气、自定义事件日期和格式化时间适合希望增强输入效率或研究输入法扩展机制的玩家。压缩包内共 9 个文件包含 7 个 Lua 脚本、1 个 YAML 配置文件和 1 个事件列表文本整体仅 43KB结构紧凑、便于查阅。该配置实现了二十四节气计算、农历转换、事件映射、日期整理、时间整理等 6 大功能并通过主 Lua 脚本完成滤镜接口映射在输入方案配置中启用 dateTime_Filter 滤镜事件列表文本还支持自定义重要日期灵活度高。用户可通过本包了解 Rime 滤镜的完整接入流程、Lua 模块划分与配置写法也可直接套用或修改脚本打造个人专属的日期时间输入方案。目前已有 445 人学习下载适合对 Rime 有一定基础、想深入定制输入行为的用户。 每天写代码、记日志、填报销单的时候你有没有被“插入当前日期”这种小事打断过切输入法、切窗口、看右下角时间再手敲一串容易漏零的数字做完这些往往几十秒就过去了。Rime输入法中州韵引擎早就给出了解法——dateTime滤镜。在Windows上它跑在小狼毫里在macOS上它跑在鼠须管里Linux上则配合fcitx5-rime使用。装上之后你只需要输入date、time、week这些简单编码候选栏就会实时生成今天的日期、当前的时间和星期。这份配置包我用了两年多从Windows小狼毫一路同步到macOS鼠须管最近在Ubuntu的fcitx5-rime上也验证过三端行为基本一致。这篇文章会把dateTime滤镜的原理、安装位置、配置方法、格式自定义和踩坑过程完整讲一遍适合已经会基础Rime方案定制、但还没折腾过日期时间功能的用户。内容可以直接照着操作不需要你有Lua或YAML基础。1. 先说清楚Rime里的“dateTime滤镜”到底是什么1.1 候选词里的日期时间本质是一个“动态翻译器”很多刚接触的人会问滤镜是像视频调色LUT那样给候选词上个“滤镜”吗其实不是。Rime里的“滤镜”更接近“函数式处理”——在候选词生成的那一瞬间把“当前系统时间”当原料加工出一条动态的候选结果。实现这个功能的核心组件在Rime里叫Translator也就是翻译器。Rime的输入过程可以理解成一条流水线你敲下字母引擎把信号交给若干个翻译器翻译器各自返回候选词最后统一排序、展示。传统table_translator负责查码表词典punct_translator负责标点符号而日期时间功能则是一个lua_translator——用Lua脚本写的翻译器。它不查任何静态词库而是调用系统时间计算出“现在是什么日期、什么时间”然后把结果作为候选词交还给你。理解了这条流水线你就明白它为什么叫“滤镜”而不是“词库”了。词库是静态的滤镜是动态的。你每次输入date出来的都是当下这一刻的日期隔一分钟再输入结果就变了。这种“实时加工”的思路和视频滤镜确实有几分神似。1.2 为什么需要一份现成的配置包从原理看自己写一个日期时间Lua翻译器也就二三十行代码。但实际动手时会发现事情没那么简单Rime不同客户端对Lua API的兼容程度不一样rime.lua的引入规则、engine.translators的补丁写法在不同版本之间也有差异部署之后报错时日志又不一定看得懂。新手从零配一次少说一两个小时而且很容易卡在某个不起眼的细节上。这也是网上会流传dateTime滤镜“配置.zip”的原因——把已经验证过的Lua脚本、rime.lua注册、方案补丁和部署说明打包在一起拿到手解压、放到正确位置、重新部署就能直接用。这份zip的价值不在于代码有多复杂而在于它是经过多台机器、多个平台实测过的“正确答案”帮你把文档里不会写出来的坑提前踩平。像雾凇拼音这类知名方案虽然也内置了类似功能但如果你只想给现有方案快速加上日期时间能力独立配置包反而更轻量、更好维护。2. 配置包里的东西放对位置才算真正装上2.1 认清Rime的配置目录小狼毫、鼠须管、fcitx5-rime配置Rime有一条铁律所有用户配置都必须放在“用户配置目录”里而不是安装目录。安装目录里的文件属于程序本体重新安装客户端就会被覆盖用户配置目录才是你真正要维护的地方。三个平台的路径和部署方式我整理成了表格平台客户端常见配置目录重新部署方式Windows小狼毫 Weasel%APPDATA%\Rime托盘图标右键 → 重新部署macOS鼠须管 Squirrel~/Library/Rime或~/Library/Application Support/Rime菜单栏图标 → 重新部署Linuxfcitx5-rime~/.local/share/fcitx5/rimefcitx5-remote -r或配置界面解压“dateTime滤镜 配置.zip”后你会看到lua/目录、rime.lua文件还可能有一两个*.custom.yaml补丁文件。把它们逐项合并到上表中的目录里。这里最容易犯的错误是解压出一个外层文件夹然后直接把整个文件夹丢进配置目录导致Rime根本不读取子目录里的配置。正确做法是让lua/、rime.lua这些文件直接出现在配置目录的根位置。提示修改任何*.yaml或*.lua配置后都必须重新部署才会生效。只保存文件不部署等于白改。2.2 lua脚本、方案文件、自定义词库的分工配置包里这几类文件各管一段别弄混lua/datetime.lua功能实现。它定义了一个Lua翻译器函数负责把date、time、week、datetime这些输入转换成候选词。核心逻辑都在脚本里改日期格式也在这里。rime.lua模块注册入口。新版Rime启动时会读取这个文件datetime_translator require(datetime)这行的作用是把lua/datetime.lua绑定到名字datetime_translator上供后面的lua_translatordatetime_translator引用。*.custom.yaml方案补丁。它决定“在哪些方案、哪些环节启用这个翻译器”。常见文件是default.custom.yaml全局生效和luna_pinyin.custom.yaml仅朙月拼音生效。我见过不少人在没有rime.lua的旧配置结构里硬塞require结果部署时报找不到模块就是没搞清这个分工。简单记lua/提供功能代码rime.lua负责登记名字方案配置负责“启用人手”三者缺一不可。3. 核心配置dateTime滤镜的lua脚本与方案对接3.1 lua翻译器的完整代码与逐段解释直接上我自己在用的脚本这段代码在配置包的lua/datetime.lua中local function datetime_translator(input, seg) local now os.date(*t) if input date then local date_str string.format(%04d-%02d-%02d, now.year, now.month, now.day) yield(Candidate(datetime, seg.start, seg.end, date_str, 日期)) elseif input time then local time_str string.format(%02d:%02d, now.hour, now.min) yield(Candidate(datetime, seg.start, seg.end, time_str, 时间)) elseif input week then local weeks {日, 一, 二, 三, 四, 五, 六} local week_str 星期 .. weeks[now.wday] yield(Candidate(datetime, seg.start, seg.end, week_str, 星期)) elseif input datetime then local dt string.format(%04d-%02d-%02d %02d:%02d, now.year, now.month, now.day, now.hour, now.min) yield(Candidate(datetime, seg.start, seg.end, dt, 日期时间)) end end return datetime_translator这个脚本调用逻辑很直白每次触发翻译器时先取一次os.date(*t)得到当前时间表然后根据用户输入的分支拼出不同格式的字符串再通过yield(Candidate(...))抛给候选栏。注意os.date(*t)放在函数开头而不是每个分支里各写一次避免在整分切换的边界上出现“日期和时分来自不同秒”的小概率错乱。Candidate的第一个参数是候选类型这里统一填datetime第二、三个参数表示这个候选对应的输入区间也就是从seg.start到seg.end这一段第四个参数是最终上屏的文本第五个参数是候选栏右侧显示的小字注释。这里要特别提醒rime.lua里的名字必须和方案配置里的引用名完全一致。比如rime.lua写datetime_translator require(datetime)方案配置里就要写lua_translatordatetime_translator。如果写成了date_translator部署后输入date会毫无反应这是新手最容易踩的坑。3.2 在输入方案中注册如何让“date”变成候选词脚本写好了还需要让Rime知道“什么时候调用它”。假设你用朙月拼音在用户目录下找到luna_pinyin.custom.yaml加入patch: engine/translators/: - lua_translatordatetime_translator/:这个写法表示“在原有翻译器列表末尾追加”而不是覆盖整个列表。新手常常把patch:下面的key写成engine.translators虽然也能通过校验但会把其他翻译器清掉导致输入法直接“哑火”。/:配合patch:使用是追加翻译器最安全的方式。如果你想在所有方案里都能输入date/time/week就把同样的补丁写到default.custom.yaml里。改完保存重新部署。部署成功后输入date候选栏会出现今天的日期同时可能和拼音候选并排显示这很正常——Lua翻译器产生的候选会和你原有的拼音候选混在一起手动选日期那条就行。如果不出现直接跳到第5章排查。4. 进阶玩法格式自定义与多平台同步4.1 从2025-01-15到紧凑日期格式模板的调整方法默认输出2025-01-15这种ISO风格日期绝大多数场景够用。但日期格式这事儿不同需求差异很大写代码注释我习惯用2025-01-15 14:30归档文件名喜欢20250115偶尔写文档还要“二〇二五年一月十五日”这种中文形式。这些都不需要重写逻辑只要改string.format的模板就行。拿文件名为例把date分支改成local date_str string.format(%04d%02d%02d, now.year, now.month, now.day)输出就变成20250115。想要斜杠分隔就写成%04d/%02d/%02d想要带秒的完整时间戳在datetime分支补上秒local dt string.format(%04d%02d%02d_%02d%02d%02d, now.year, now.month, now.day, now.hour, now.min, now.sec)生成20250115_143025这种格式我专门用来给备份目录命名按名称排序就是时间顺序非常方便。有一点要说明os.date调用返回的时间已经经过系统时区换算脚本里不需要再做任何时区偏移。只要操作系统时间正确Rime输出的日期时间就一定是本地时间。跨时区出差时改的是系统设置不用动配置。4.2 Windows/macOS/Linux三平台配置同步的几个注意点配置包能在三端通用是因为Rime的用户配置结构是统一的。但同步时要注意不是所有文件都需要搬各平台专属文件不参与同步。weasel.yaml是Windows小狼毫的参数squirrel.yaml是macOS鼠须管的参数这两个文件里存着各自客户端的字体、候选栏样式等属性跨平台同步可能互相覆盖。同步的应该是通用部分lua/目录、rime.lua、default.yaml、default.custom.yaml、各方案的自定义文件、punctuation.yaml、symbols.yaml等。建议用git或网盘同步时排除build/文件夹。它是Rime部署时生成的缓存目录每台机器自己部署就会重建同步它只会带来混乱。我自己的做法是用git管理整个用户目录.gitignore里写上build/。换了电脑后clone下来手动执行一次完整部署所有方案和dateTime滤镜一起恢复。这里再说一个细节从旧版本升级Rime客户端后如果发现原本能用的dateTime失效先尝试删除用户目录下的build/再执行一次完整部署。很多时候是新旧版本部署缓存不兼容导致的清掉就好了。5. 我踩过的坑部署不生效、候选词不出现、格式错乱5.1 部署不生效的最常见原因我在不同平台配置dateTime滤镜时踩过的坑基本可以汇总成一张排查表现象最常见原因解决办法输入date没反应rime.lua未生效客户端版本过旧升级小狼毫/鼠须管到较新版本部署报[lua] error脚本文件名和require不一致或文件编码有问题检查lua/datetime.lua命名另存为UTF-8无BOM提示“未知方案”补丁里的/:语法位置写错检查custom.yaml的patch格式候选词出现但排在很后面翻译器默认权重低在lua脚本中给Candidate设置quality属性只有某个方案生效补丁写进了单个方案的custom.yaml而非全局移到default.custom.yaml其中“候选词排在很后面”这个问题容易被忽略。理论上只要候选词出现功能就正常但如果你希望输入time时当前时间直接出现在第一页可以在脚本里给候选词加权重。Rime的Lua API在不同版本里设置方式不完全一样比较通用的是在yield前修改候选对象的quality字段local cand Candidate(datetime, seg.start, seg.end, time_str, 时间) cand.quality 100 yield(cand)如果客户端版本不支持quality字段忽略也无妨最多就是候选词稍微靠后手动翻一页也能找到。5.2 lua脚本报错的排查链路真遇到lua报错不要瞎猜。我通常按这个顺序查先看日志。小狼毫在%TEMP%\rime.weasel下鼠须管在~/Library/Logs下fcitx5-rime一般在~/.local/share/fcitx5/rime/logs。打开日志搜索lua或error能看到脚本文件名和行号。用系统Lua单独跑一遍脚本。在终端执行lua lua/datetime.lua如果系统里没装Lua也可以用docker起一个临时Lua容器。脚本本身不依赖Rime的API就能解析语法先把语法错误排除。检查文件编码。Windows记事本保存的文件默认可能带BOMRime的Lua解释器对BOM敏感表现为“明明代码没问题就是加载失败”。用VS Code打开文件看右下角编码信息确保是UTF-8且不带BOM换行符建议统一为LF。确认部署日志中没有unknown translator之类的关键词。如果出现说明lua_translator名称中的名称和rime.lua里的全局变量名对不上。这套链路我走完过很多次绝大多数问题都卡在第3步的文件编码上。跨平台同步配置时建议用VS Code统一处理一遍能省掉大量莫名其妙的问题。6. 实测体验把dateTime滤镜用进日常输入流6.1 写代码时顺手带出日期注释dateTime滤镜装上之后养成习惯只需要半天。我用得最多的是在代码注释里标注修改日期以前总要切英文、手打日期现在直接输入datetime一整条2025-01-15 14:30上屏放在//后面一行搞定。提交git commit时也顺手来一条提交信息里带准确时间回溯变更非常方便。如果你经常在IDE里写Java、Go、Python时间格式建议保持ISO风格。它排序和机器解析都友好各种编辑器也能自动识别成日期。我的datetime分支就固定输出%04d-%02d-%02d %02d:%02d既适合注释也适合国际化文档。6.2 文件名、日志、周报里的日期场景另一个高频场景是文件归档。我保存设计文档时输入date生成日期串接在文件名后面比如“需求评审_20250115.docx”比任何版本管理方案都直观。配合week分支写周报时能直接看到“今天是星期几”不用再掰手指头。这套配置包的后续扩展空间也很大。想加农历可以继续写Lua脚本想支持“输入rj输出当前日期”这种自定义编码只需要在脚本里加一个输入别名把if input date改成if input date or input rj再重新部署就行。这也是Lua方案比死码表方便的地方——一切逻辑都在代码里改起来不费劲。如果你一直为日期时间切换输入法而烦恼我很建议你把这份dateTime滤镜配置装上先跑通date和time两个分支。这两个分支能用起来其他自定义都是水到渠成的事。本文还有配套的精品资源点击获取