ivy用的flx.el模糊搜索質量慘不忍睹

ln -sv target/release/libfuz_core.so fuz-core.so

macOS下应该是 ln -sv target/release/libfuz_core.dylib fuz-core.so

排序舒心多了,只是发现一个问题,describe-variable很慢很慢~~~ 似乎ivy-fuz-fuzzy-sort-fn有点问题

https://github.com/cireu/fuz.el/blob/improve/maybe-speedup-ivy-fuz/ivy-fuz.el

推送了一个补丁到新branchimprove/maybe-speedup-ivy-fuz上。

原来ivy--flx-sort要先构建模糊正则来筛选candidate,我当时无脑照抄了,其实直接配合memo-fn用计算出来的score来筛选就行,还能避免多次计算分值。

自动下载预编译binary还是等release先吧 :joy:

这个补丁对于describe-variable还是很慢啊,其他都很好

之前一直搞错了一个事情,fuzzy sort应该用ivy-sort-matches-functions-alist来修改,而我错用了ivy-sort-functions-alist。现在我已经更新了README :sweat:

尝试下这个设置。

      (setq ivy-sort-matches-functions-alist '(t . ivy-fuz-sort-fn))
      (setq ivy-re-builders-alist '(t . ivy-fuz-regex-fuzzy))
      (setq ivy-highlight-functions-alist '(ivy-fuz-fuzzy-regex . ivy-fuz-highlight-fn))

      (with-eval-after-load 'ivy
        (require 'ivy-fuz))

现在行了,谢谢

Update:README 中还有ivy-fuz-fuzzy-regex

大佬,给 snails 写一个 fuz.el 的插件? 看着你的 fuz.el 很不错啊

暂时还没看懂snail的代码,正在研究中。

snails-core.el 是框架主代码,主框架监听 Input buffer 的输入,输入变化时,重新生成一个 input ticker 分给后端去搜索干活

后端控制候选词的搜索和匹配,后端完成的时候,返回 input ticker 给主框架,不管后端干活多么给力,一旦 Input ticker 过期了(就是干活的时候用户输入变化了)主框架就把后端的结果抛弃掉

如果 input ticker 没有过期,主框架就调用 snails-update-callback 来渲染后端返回的候选词

如果是异步子进程的话,Input ticker过期会直接导致子进程被杀掉

整个模糊匹配和高亮其实都是在每个 snails-backend-*.el 文件中自己控制的,主框架只负责监听输入事件、调用后端、管理后端的返回值,主框架啥核心的活都不干。

2 个赞

所有可以基于 fuz.el 写一个通用的匹配函数放到 snails-core.el 中,然后在每个 backend 文件中用 fuz.el 代码替换现在还比较简陋的 string-match-p

昨晚尝试用rayon执行并行化计算。结果发现CPU时间是跑满了,整体的速度却下降了 :slightly_frowning_face:。emacs的dynamic module设计太过动态,导致每次module的函数要执行,都要各种转换数据类型。甚至连list这种常见的数据结构,都得通过env.funcall("car")让lisp虚拟机执行然后再手动cast类型给Rust。:frowning_face:

对于命令locate来说 fuz应该是没有用的 对于rg 好像也没用

其实替换每个后端的 string-match-p 就可以了 snails/snails-backend-buffer.el at 489299bd1242e7786aa8cc73ea7f9a838fe6fe18 · manateelazycat/snails · GitHub

筛选不需要fuz啊,只要构建一个[^f]*f[^o]*o[^o]*o的正则就可以了。fuz的算分算法是用来排序的。

1 个赞

可以試試 flx-rs.

1 个赞