我写了一个支持拼音搜索中文的 fzf 风格命令行工具:yuru

0 阅读5分钟

我写了一个支持拼音搜索中文的 fzf 风格命令行工具:yuru

yuru Chinese demo

大家好,我是一个日本开发者,中文不是母语,如果有表达不自然的地方请见谅 🙏

最近做了一个命令行工具:

GitHub:github.com/Ameyanagi/y…

Doc: 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 的思路大概是:

  1. 对候选文本做一层 CJK 转换
  2. 为每个候选项生成可搜索的辅助表示
  3. 用户输入拉丁字母时,不只和原文比较,也和拼音 / 罗马字表示比较
  4. 最后用 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.com/Ameyanagi/y…

介绍文章:

ameyanagi.com/blog/yuru-c…

如果你试用后觉得哪里不自然,欢迎来 GitHub 提 issue。
如果有更好的拼音匹配规则、简繁体处理建议、多音字处理方案,也非常欢迎讨论。

日文部分是我自己长期使用的,比较有信心。
中文模式是后来扩展出来的,所以特别需要中文开发者帮忙拍砖 🙇

Star、issue、PR 都非常欢迎!

谢谢大家。