我写了一个支持拼音搜索中文的 fzf 风格命令行工具:yuru
大家好,我是一个日本开发者,中文不是母语,如果有表达不自然的地方请见谅 🙏
最近做了一个命令行工具:
GitHub:github.com/Ameyanagi/y…
它叫 yuru,是一个 fzf 风格的模糊搜索工具。
和普通 fuzzy finder 不太一样的是,它针对 CJK 做了一些额外处理:
- 日文可以用罗马字 / かな搜索
- 中文可以用拼音搜索
- 韩文可以用罗马字搜索
比如在中文模式下,输入拼音缩写或拼音子序列,就可以匹配中文文本。
为什么做这个工具?
最开始其实只是为了解决我自己的问题。
我平时很喜欢用 fzf 翻命令历史、文件名、项目路径之类的东西。
但是在日文环境下经常会遇到一个小麻烦:
想搜日文内容时,需要先切换 IME。
例如想搜索「東京」,如果只能按原文搜,就需要切到日文输入法。
但我更希望可以直接输入:
tokyo
然后匹配到:
東京
这样在终端里操作会顺很多。
所以一开始我做的是日文版。后来想了想,中文和韩文用户应该也会遇到类似问题:
- 搜中文文件名时,不想切输入法
- 搜命令历史里的中文备注时,想直接打拼音
- 搜项目名、笔记名、目录名时,希望英文输入状态下也能匹配 CJK
于是就把这个思路扩展到了中文拼音和韩文罗马字。
中文模式示例
在中文模式下,可以用拼音来匹配中文。
比如有一条候选项:
操作系统
输入:
czt
可以匹配到它,因为它对应的是:
cao zuo xi tong
czt 可以理解成拼音序列里的模糊输入。
截图位置:
这里可以贴一张截图:输入
czt,匹配到「操作系统」
普通的拉丁字母搜索也可以照常使用,所以它也可以当作一个普通的 fzf 风格搜索器来用。
支持的模式
目前主要支持三种语言模式:
日文模式
支持用罗马字或假名匹配日文。
例如:
tokyo
可以匹配:
東京
中文模式
支持拼音模糊匹配。
例如:
czt
可以匹配:
操作系统
韩文模式
支持韩文罗马字匹配。
这个部分和中文一样,也是后来从日文版本扩展出来的。
安装时请注意:中文用户请选择 Chinese
安装或初始化时会让你选择语言模式。
如果你想使用拼音匹配,请选择:
Chinese
拼音匹配是中文模式专属功能。
如果选了 Japanese 或 Korean,就不会启用中文拼音匹配。
目前也有一个 auto 模式,目标是自动识别日文、中文、韩文,但现在还在改进中。
现阶段如果主要搜索中文内容,我建议先使用单一的 Chinese 模式。
简单说一下实现思路
yuru 的思路大概是:
- 对候选文本做一层 CJK 转换
- 为每个候选项生成可搜索的辅助表示
- 用户输入拉丁字母时,不只和原文比较,也和拼音 / 罗马字表示比较
- 最后用 fuzzy matching 的方式进行排序和展示
也就是说,用户看到的仍然是原始文本,但搜索时可以通过拼音或罗马字命中。
例如中文文本:
操作系统
可以被看作同时拥有类似下面这样的可搜索形式:
操作系统
cao zuo xi tong
c z x t
所以输入完整拼音、部分拼音、拼音首字母,都有机会匹配到对应项目。
当然,中文这里会比日文复杂很多。
特别是多音字、简繁体、拼音容错这些问题,目前还没有做到非常完美。
目前我最想收集中文用户反馈的地方
因为我是日本开发者,中文不是母语,所以中文模式一定还有很多没考虑周全的地方。
特别希望中文母语者帮忙看看这些点:
1. 多音字应该怎么处理?
比如:
行
它可能读作:
xing
hang
在实际搜索时,大家会期待它怎么匹配?
是多个读音都支持,还是根据词语上下文决定更自然?
2. 简体 / 繁体需要支持到什么程度?
例如简体用户会不会经常需要搜繁体内容?
繁体用户又会不会希望用简体拼音规则来搜?
这部分我不太确定实际需求。
3. 拼音容错需求高不高?
比如这些情况:
z / zh
c / ch
s / sh
n / ng
l / n
有些输入法会支持模糊音。
但是在命令行 fuzzy finder 里,大家会不会也期待这种容错?
如果支持太多,可能会带来误匹配。
如果完全不支持,又可能不够顺手。
这里很想听听中文用户的使用感受。
4. 实际使用场景还有哪些?
我现在想到的主要是:
- 搜中文文件名
- 搜中文目录名
- 搜命令历史
- 搜笔记标题
- 搜项目中的中文文案
- 在终端里快速筛选列表
但我不是中文环境的长期用户,所以可能遗漏了很多真实场景。
如果你觉得「这个地方支持了会很好用」,也欢迎告诉我。
项目地址
GitHub:
介绍文章:
如果你试用后觉得哪里不自然,欢迎来 GitHub 提 issue。
如果有更好的拼音匹配规则、简繁体处理建议、多音字处理方案,也非常欢迎讨论。
日文部分是我自己长期使用的,比较有信心。
中文模式是后来扩展出来的,所以特别需要中文开发者帮忙拍砖 🙇
Star、issue、PR 都非常欢迎!
谢谢大家。