拼音搜索的另一种方法:用 text-property 将字母显示为中文

目前根据拼音搜索中文的思路大致是暴力生成汉字匹配字典,然后拼接成正则表达式,比如 ace-pinyin 。在 consult 等搜索框架中也可以用 advice 的形式注入处理后的正则表达式实现拼音搜索。

我一直在想有没有反过来的方法?先让汉字转换成拼音,然后再直接搜索?不过那样的问题是搜索时能正常显示匹配字符的高亮吗?今天突然想到一个方法:为什么不将中文先替换成拼音首字母,然后再用 text-property 让它看上去是一串中文呢,于是有了下面的 demo :

;;原始字符串:你好,世界
(setq my-string "nh,sj")

(add-text-properties 0 1 '(display "你") my-string)
(add-text-properties 1 2 '(display "好") my-string)
(add-text-properties 2 3 '(display ",") my-string)
(add-text-properties 3 4 '(display "世") my-string)
(add-text-properties 4 5 '(display "界") my-string)

(insert my-string) ;; 你好,世界

(consult--read (list my-string "test1" "测试2"))

可以看到 consult 里面的匹配高亮是正常的,这证明了这种思路是完全可行的,甚至如果将这个处理后的字符串插入 buffer 中,用 isearch-forword 、avy 等也是能够搜索到的。

于是有了这个玩具应用:

7 个赞

将中文先替换成拼音首字母, 这个我有尝试过, 后来发现如果对1m以上的中文文本这么做,重合率有点高的惊人, 首字母基本都集中在yjzl几个键上(y是第一遥遥领先), 而某些键如uioveabr…出现率极低,或者为0.

而如果取某个形码(仓颉|wb|郑)的首字母, 可以做到把汉字较为均匀的分配到26(或25)个键上面,不会像拼音首字母这样某个键重合率特别高,遥遥领先其它键的情况.

感觉用来搜索文件名还凑合,可以搭配词组以及更多的关键字进行过滤

用拼音建议还是取两个字母, 但不要取全拼的前两个字母, 全拼取前两个字母和一个字母基本没区别(重合率上),不如就取一个字母, 两个字母应该取双拼的, 这样即使不搭配词组等准确率上应该也不会太高

(歪个楼)最近用了一段时间leap.nvim,确实更舒服一点,但 emacs 似乎还没有这个逻辑的插件: 求教:有没有类似leap.nvim的光标移动插件

对于leap这样的场景,感觉取全拼首字母就够了,应该也更自然

两个字符定位的功能和 avy 差不多,搜索拼音首字母的话前面提到的 ace-pinyin 已经实现了

感觉用拼音首字母很反直觉。

用全拼搜,这个和打字行为一致。我用行码,通常打形码搜。

我平时用的音形码,首字母也并不是标准的键盘排列。用这个搜索主要优点是不用切输入法,不用怕记错平翘舌音

差不多是的,使用上的区别还是有的。ace-pinyin我也一直在用。

我这其实和这个帖子关系不大

可以多做几个双拼方案的 table , 感觉会好用很多 , 只是首字母匹配的话 , 功能和 ace-pinyin 差不多

平翘舌音,我也分不清,对于常用字 sh|ch|zh 这三个我能打对,完全是硬记,这三个还能记住,但是in,ing,on,ong,an,ang,en,eng,这些感觉还要更难区分,也记不住。

zsc开头的常用字要比zhshch开头的少很多,所以只要记zsc开头的就可以了,用u表示sh,i表示ch,v表示zh, 然后把汉字最多的拼音 yi 用e表示, 再把第二名ji用g表示,高频拼音处理一下,这样应该是可以实现像形码输入法一样把汉字较为均匀的分配到26个键上